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.

Horizontal bars of meteorites by country: Antarctica 22,099, then Oman 3,093, the United States 1,659, Libya 1,474, Australia, Algeria, Chile, Morocco, India and Russia. Horizontal bars of meteorites by country: Antarctica 22,099, then Oman 3,093, the United States 1,659, Libya 1,474, Australia, Algeria, Chile, Morocco, India and Russia.
Meteorites by country, once the false Kenyan points are removed.

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.

Horizontal bars by continent: Antarctica 22,099, Asia 3,562, Africa 2,621, North America 1,822, and a few hundred each for Oceania, Europe and South America. Horizontal bars by continent: Antarctica 22,099, Asia 3,562, Africa 2,621, North America 1,822, and a few hundred each for Oceania, Europe and South America.
Meteorites by continent.

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.

World map of meteorites per 200 km equal-area cell outside Antarctica on a log colour scale, brightest over Oman, Libya, Algeria, the Atacama, the US Southwest and the Nullarbor. World map of meteorites per 200 km equal-area cell outside Antarctica on a log colour scale, brightest over Oman, Libya, Algeria, the Atacama, the US Southwest and the Nullarbor.
Meteorites per 200 km cell outside Antarctica, Mollweide projection.

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.