How to Map Where the World's Meteorites Were Found
On this page
Problem statement
A dot map of NASA's Meteorite Landings table is one of the most drawn maps on the internet, and it mostly shows where meteorite hunters have been. Antarctica, Oman, Libya and the American Southwest light up, while the populated world, where meteorites land just as often, is nearly empty. This page joins the located meteorites to countries, finds the points that land in no country, draws an equal-area density map without Antarctica swamping it, and ranks countries by meteorites per area, so the map's patterns can be read for what they are.
Quick answer
Build points from the usable positions and join them to Natural Earth's countries:
ok = met.reclat.notna() & ~((met.reclat == 0) & (met.reclong == 0)) & met.reclong.between(-180, 180)
g = gpd.GeoDataFrame(met[ok], geometry=gpd.points_from_xy(met.reclong[ok], met.reclat[ok]), crs=4326)
world = gpd.read_file("data/ne_110m_admin_0_countries.zip")[["ADMIN", "CONTINENT", "geometry"]]
j = gpd.sjoin(g, world, how="left", predicate="within")
print(j.ADMIN.fillna("(sea or coast)").value_counts().head(10).to_string())
ADMIN
Antarctica 22099
Oman 3093
United States of America 1659
Libya 1474
Australia 638
Algeria 626
Chile 359
Kenya 227
Morocco 218
India 133
Antarctica holds 22,099 of the located meteorites, more than the rest of the world together. Oman follows with 3,093, then the United States with 1,659, Libya with 1,474, and Australia, Algeria and Chile, all countries with large deserts. Kenya's 227 are an error, explained below. India, the first country on the list without desert collecting, has 133, almost all witnessed falls.
The join, and what it leaves out
1. Points that land in no country
miss = j[j.ADMIN.isna()].to_crs(3857)
land = world.to_crs(3857)
d = miss.geometry.apply(lambda p: land.distance(p).min() / 1000)
print(f"outside every country: {len(miss)}; median distance to land {d.median():.1f} km; over 50 km: {(d > 50).sum()}")
print(j[j.ADMIN.isna()].assign(km=d.values).nlargest(4, "km")[["name", "reclat", "reclong", "km"]].round(1).to_string(index=False))
outside every country: 93; median distance to land 9.9 km; over 50 km: 12
name reclat reclong km
Clipperton 11.7 -137.8 2097.3
Clarion 12.5 -137.7 2070.3
Eltanin -57.8 -90.8 2040.7
Mauritius -20.0 57.0 875.9
93 meteorites fall in no country. Most are coastal finds that the generalised 1:110 million outlines cut off: the median one is 9.9 km from land, a few pixels on a world map. Twelve are more than 50 km out, and they are real. Clipperton and Clarion are islands too small for the outlines, Mauritius likewise, and Eltanin is an asteroid impact in the Southern Ocean known from fragments in seabed cores. Use finer outlines, or snap points within a few kilometres to the nearest country, rather than dropping them. The Web Mercator distances here are only a rough measure, and they shrink toward the poles.
2. A country that isn't there
print(j[j.ADMIN == "Kenya"].name.str.replace(r"\s*[A-Z]?\d+.*$", "", regex=True).value_counts().head(3).to_string())
print(j.loc[j.ADMIN == "Kenya", ["reclat", "reclong"]].value_counts().head(2).to_string())
j = j[(j.reclat != 0) & (j.reclong != 0)]
print(f"after dropping rows with one coordinate at 0: {len(j):,}; Kenya: {(j.ADMIN == 'Kenya').sum()}")
name
Yamato 223
Duruma 1
Meru 1
reclat reclong
0.0 35.66667 223
-4.0 39.50000 1
after dropping rows with one coordinate at 0: 31,962; Kenya: 3
Kenya's 227 meteorites are a mistake. 223 are Yamato meteorites from Antarctica whose latitude was lost and stored as 0 while the longitude was kept, which puts them on the equator at 35.67Β° E, in the Kenyan highlands. Filtering only rows where both coordinates are 0 lets them through. Dropping any row with a zero coordinate removes them, and Kenya keeps three. The rule also drops Meru, a real Kenyan fall recorded at latitude 0: the town lies within a few kilometres of the equator. One genuine row is a fair price for 223 false ones, but a careful map can put Meru back by name.
3. By continent, without Antarctica
print(j.CONTINENT.value_counts().to_string())
nonant = j[j.CONTINENT != "Antarctica"]
print(f"finds and falls outside Antarctica with a position: {len(nonant):,}")
CONTINENT
Antarctica 22099
Asia 3562
Africa 2621
North America 1822
Oceania 648
Europe 617
South America 500
finds and falls outside Antarctica with a position: 9,863
After Antarctica's 22,099, Asia has 3,562, mostly Oman's desert finds, Africa 2,621, North America 1,822, and Oceania, Europe and South America a few hundred each. Taking Antarctica out leaves 9,863 meteorites with a position, few enough to see a pattern in. The 93 sea and coast points have no continent and drop out of the count, which barely matters at this scale.
A density map and a per-area ranking
The data used on this page
NASA's Meteorite Landings table from The Meteoritical Society's records (last updated May 2013) and Natural Earth's 1:110m countries, public domain, both saved on this site on 28 October 2026. The density map uses the Mollweide projection, which keeps areas true, so a cell near the pole covers as much ground as one at the equator.
from pathlib import Path
import json
import zipfile
import geopandas as gpd
import numpy as np
import pandas as pd
import requests
Path("data").mkdir(exist_ok=True)
# NASA's Meteorite Landings table (The Meteoritical Society's records as NASA last updated them, May 2013), every
# fireball in NASA/JPL's Fireball Data API, and Natural Earth's countries and land. Saved 28 October 2026.
# Live: https://data.nasa.gov/docs/legacy/meteorite_landings/Meteorite_Landings.csv
# https://ssd-api.jpl.nasa.gov/fireball.api?vel-comp=true
ARCHIVE = "nasa-meteorites-2026-10-28.zip"
if not Path(f"data/{ARCHIVE}").exists():
Path(f"data/{ARCHIVE}").write_bytes(requests.get(f"https://data.spatialworkflow.io/{ARCHIVE}", timeout=600).content)
Z = zipfile.ZipFile(f"data/{ARCHIVE}")
met = pd.read_csv(Z.open("Meteorite_Landings.csv")).rename(columns={"mass (g)": "mass_g"})
for f in ["ne_110m_admin_0_countries.zip", "ne_50m_land.zip"]:
Path(f"data/{f}").write_bytes(Z.read(f))
print(f"Meteorite Landings: {len(met):,} meteorites")
Meteorite Landings: 45,716 meteorites
Example 1: a density map in an equal-area projection
p = nonant.to_crs("+proj=moll")
hb_x, hb_y = p.geometry.x / 1000, p.geometry.y / 1000
H, xe, ye = np.histogram2d(hb_x, hb_y, bins=[np.arange(-18100, 18101, 200), np.arange(-9100, 9101, 200)])
print(f"200 km cells with at least one meteorite: {(H > 0).sum():,}; the fullest holds {H.max():.0f}")
cells = pd.Series(H.ravel()); print(f"cells holding 100 or more: {(cells >= 100).sum()}, together {cells[cells >= 100].sum():,.0f} meteorites")
200 km cells with at least one meteorite: 1,194; the fullest holds 1100
cells holding 100 or more: 17, together 5,667 meteorites
Counted in 200 km squares of equal area, the meteorites outside Antarctica fall in 1,194 cells, and the fullest holds 1,100. Just 17 cells hold 100 or more, and together they contain 5,667 meteorites, more than half of the 9,863. Those cells are the collecting grounds: Oman's Dhofar and Jiddat al Harasis, Libya's Dar al Gani and Hammadah al Hamra, Algeria's Acfer, Chile's Atacama, the dry lakes of California, Roosevelt County in New Mexico, and the Nullarbor in Australia. A colour scale on a log axis is the only way to show those cells and the scattered falls on the same map.
Example 2: meteorites per million kmΒ² of land
area = world.to_crs("+proj=moll").set_index("ADMIN").area / 1e12
c = j.ADMIN.value_counts()
dens = (c / area.reindex(c.index)).dropna()
print(dens[c.reindex(dens.index) >= 50].sort_values(ascending=False).head(8).round(1).rename("per million kmΒ²").to_string())
ADMIN
Oman 9950.5
Antarctica 1843.1
Libya 898.5
Chile 440.1
Morocco 367.1
Algeria 269.1
Sweden 176.0
United States of America 174.1
Per area, Oman stands apart, with 9,950 meteorites per million kmΒ², more than five times Antarctica's 1,843. Its desert has stable, pale gravel surfaces where a dark stone survives tens of thousands of years, and roads that let collectors reach them. Libya, Chile, Morocco and Algeria follow. Sweden, at 176, is the only country in the list without a desert; its meteorites are mostly fossil meteorites named Γsterplana, after the limestone quarry where they were found in Ordovician rock.
Internal links
- Thousands of finds on one point β why the Antarctic dots are few and full
- Meteorites at 0,0 β the positions the map cannot use
- Falls and finds explained β why the map follows the collectors
- Witnessed falls by country β a map that follows people instead