Where is methane rising from paddies, livestock, and landfills near me?
Draw a rectangle, then check which collections cover it. Most NASA data is global, so a big box matches a lot.
80, 25 → 86, 28 (Gangetic plain (UP–Bihar))Methane is a potent greenhouse gas, and three everyday things leak a lot of it: flooded rice paddies, livestock (cows and their digestion), and landfills (rotting trash). Satellites can't smell the gas, but they can measure how much methane is sitting in the whole column of air above a place. Where that column is fatter than the surrounding "clean" air, something below is adding methane.
Where is methane rising from paddies, livestock, and landfills near me?
Methane is a potent greenhouse gas, and three everyday things leak a lot of it: flooded rice paddies, livestock (cows and their digestion), and landfills (rotting trash). Satellites can’t smell the gas, but they can measure how much methane is sitting in the whole column of air above a place. Where that column is fatter than the surrounding “clean” air, something below is adding methane.
Which data to use, and how
Use this dataset: TROPOMI CH₄ (short name S5P_L2__CH4___),
a satellite that maps methane across your whole region daily at about 5.5 km per pixel, from
2018 to today. It’s the easiest place to start: one instrument, one login, regional coverage. Save
the other datasets for later. EMIT zooms into single dump sites at
60 m, and GOSAT/ACOS is a coarser but longer record (back to 2009) for
multi-year context.
The measured quantity is XCH₄, the column-averaged methane concentration (how much methane is in the air column, in parts per billion). You’re not after the raw number. You’re after the bump above normal.
Then do four steps. The runnable code further down does all of this; this is just the idea.
- Pick your region and two seasons. A latitude/longitude box, plus a monsoon window (when paddies are flooded) and a dry window (when they’re not).
- Find the “normal” level. Take a low background value across your box (clean air with no nearby source) and subtract it from every pixel. What’s left is the enhancement, the extra methane above background.
- Composite over time. Stack many daily passes and keep the typical (median) value per pixel. This keeps persistent hotspots and washes out one-off puffs that just blew through on the wind.
- Use the seasons to name the source. Paddies only emit when flooded, so a hotspot that’s strong in monsoon but quiet in the dry season is paddy. A hotspot that’s there in both seasons is a steady source (livestock or a landfill).
That’s the whole method. Below, “How a scientist answers this” names the exact tools, and the Run it cell does it live on synthetic data so you can see each step work.
What you can find out
- The regional methane bump (column minus background) for any area you choose, from TROPOMI.
- Persistent hotspots. Stack daily passes over weeks to months and the places that are always enhanced stand out from passing wind-blown methane.
- Paddy vs steady sources, by comparing the monsoon-flood window against the dry-season window.
- Facility-scale plumes: individual landfills and big point sources, seen at 60 m with EMIT.
- Multi-year drift, using the longer GOSAT record (2009+) for background context.
What it can’t tell you
- How many tonnes per year a source emits. The satellite measures a column of gas overhead, not a flux (the rate gas leaves the ground). Turning one into the other needs an inversion model that runs the winds backwards, well beyond a first look.
- Which exact source inside one pixel. At ~5.5 km a single pixel can blend paddies, cattle, a town, and a dump all at once. Separating them needs the fine-resolution EMIT, aircraft, or a bottom-up inventory (a ground-up tally of known emitters).
- Anything on cloudy or wet days. The retrieval fails under cloud and haze, and over dark or wet surfaces. Flooded paddies are exactly that, so the data can thin out right where you most want it.
- Whether a high column is a real leak or just trapped air. On a still, stagnant day methane piles up with nowhere to go. Without checking the winds, you can’t tell a source from accumulation.
Gotchas to watch for
- Column, not flux. A high reading can simply be old methane trapped under stagnant air rather than something leaking right now, and if you skip the meteorology you’ll blame the wrong spot. Check the wind before naming a source.
- The retrieval has artefacts. Bright deserts, dark water, and haze (called albedo, aerosol, and
cloud effects) can bias the methane number and conjure hotspots that aren’t real. Keep only
good-quality pixels using the quality flag (
qa_value, recommended above 0.5). - Coarse pixels mix sources. At ~5.5 km, paddy, livestock, and landfill blur together, so you can’t pin the source from TROPOMI alone. Treat TROPOMI as regional and bring in EMIT or aircraft when you need to attribute a specific facility.
- Paddy data is tricky exactly where you need it. Standing water darkens the surface and degrades the retrieval, right over the flooded fields you’re studying, which leaves gaps where paddy methane peaks. Count how many good pixels you actually have per window before trusting it.
- EMIT is opportunistic. The 60 m instrument only looks at scheduled spots and only catches strong point sources (like a leaking landfill), not diffuse area emissions like a whole rice field. Absence in EMIT is not proof of no emission, so use it to confirm point plumes rather than to survey.
- Always verify before you blame. One coarse scene is weak evidence. Cross-check hotspots against an inventory (EDGAR), repeat passes, or airborne campaigns before assigning a single source.
The real-data code
The Run it cell above runs this method on synthetic data with no login. Below is the whole recipe against the real archive: search TROPOMI CH₄, open the good pixels, grid them, subtract a clean-air background, composite each season, and map the monsoon-minus-dry difference to flag paddy hotspots. It needs a free Earthdata Login.
import earthaccess, numpy as np, xarray as xr
import matplotlib.pyplot as plt
earthaccess.login(strategy="netrc")
aoi = (80, 25, 86, 28) # Gangetic plain (UP–Bihar) as (W, S, E, N)
windows = { # monsoon = paddies flooded; dry = steady sources only
"monsoon": ("2024-07-01", "2024-09-30"),
"dry": ("2025-01-01", "2025-03-31"),
}
res = 0.05 # ~5.5 km grid, matches TROPOMI pixels
lon_edges = np.arange(aoi[0], aoi[2] + res, res)
lat_edges = np.arange(aoi[1], aoi[3] + res, res)
# 1. For each season, open every granule, keep good-quality XCH4 pixels inside the
# box, and bin them onto a regular grid (median per cell = persistent signal).
def seasonal_grid(start, end):
grans = earthaccess.search_data(
short_name="S5P_L2__CH4___", bounding_box=aoi, temporal=(start, end))
lons, lats, xch4 = [], [], []
for fh in earthaccess.open(grans):
ds = xr.open_dataset(fh, group="PRODUCT")
keep = ((ds["qa_value"] > 0.5) # recommended quality cut
& (ds.longitude >= aoi[0]) & (ds.longitude <= aoi[2])
& (ds.latitude >= aoi[1]) & (ds.latitude <= aoi[3]))
v = ds["methane_mixing_ratio_bias_corrected"].where(keep)
m = np.isfinite(v.values)
lons.append(ds.longitude.values[m]); lats.append(ds.latitude.values[m])
xch4.append(v.values[m])
lons, lats, xch4 = np.concatenate(lons), np.concatenate(lats), np.concatenate(xch4)
# median XCH4 per grid cell, via sum/count over the two halves of the data
ix = np.digitize(lons, lon_edges) - 1; iy = np.digitize(lats, lat_edges) - 1
grid = np.full((len(lat_edges) - 1, len(lon_edges) - 1), np.nan)
for j in range(grid.shape[0]):
for i in range(grid.shape[1]):
cell = xch4[(ix == i) & (iy == j)]
if cell.size: grid[j, i] = np.median(cell)
return grid
comp = {k: seasonal_grid(*w) for k, w in windows.items()}
# 2. Enhancement = column minus a clean-air background (10th percentile of the box).
enh = {k: g - np.nanpercentile(g, 10) for k, g in comp.items()}
# 3. Seasonality discriminator: paddy pulses with the monsoon, so the monsoon-minus-dry
# difference isolates flooded-paddy methane from steady livestock/landfill sources.
paddy = enh["monsoon"] - enh["dry"]
hot = np.nanmax(paddy)
yhot, xhot = np.unravel_index(np.nanargmax(paddy), paddy.shape)
lon_hot = lon_edges[xhot] + res / 2; lat_hot = lat_edges[yhot] + res / 2
print(f"Strongest paddy-seasonal CH4 hotspot: +{hot:.0f} ppb "
f"at {lat_hot:.2f}N, {lon_hot:.2f}E (monsoon - dry enhancement)")
# 4. Map it.
ext = [aoi[0], aoi[2], aoi[1], aoi[3]]
plt.imshow(paddy, origin="lower", extent=ext, aspect="auto", cmap="inferno")
plt.colorbar(label="monsoon - dry XCH4 enhancement (ppb)")
plt.plot(lon_hot, lat_hot, "co", label="strongest paddy hotspot")
plt.xlabel("lon"); plt.ylabel("lat"); plt.legend(); plt.tight_layout(); plt.show()
# Before you blame a source: a column is not a flux — check winds for stagnation, and
# confirm point plumes with EMIT (EMITL2BCH4ENH) or a bottom-up inventory (EDGAR).
Where the data comes from
The regional methane (TROPOMI/Sentinel-5P CH₄) comes from NASA’s GES DISC archive. The fine-scale plume products (EMIT) come from a different NASA archive, LP DAAC. So facility-scale work touches two archives, but both open with the same single free Earthdata Login.
Sources
- Sentinel-5P TROPOMI CH4: https://disc.gsfc.nasa.gov/datasets/S5P_L2__CH4____HiR_2/summary
- TROPOMI CH4 product readme (qa / bias correction): https://sentinel.esa.int/documents/247904/2474726/Sentinel-5P-Methane-Product-Readme-File
- EMIT methane: https://earth.jpl.nasa.gov/emit/data/data-products/
- GOSAT/ACOS XCH4: https://disc.gsfc.nasa.gov/datasets?keywords=ACOS
- EDGAR emission inventory: https://edgar.jrc.ec.europa.eu/
Make it yours → Choose your region and season, set the background reference, and the notebook maps the XCH4 enhancement and composites persistent hotspots. Toggle the monsoon vs dry-season window to separate paddy pulses from steady livestock/landfill sources, and drop in EMIT plume scenes to zoom to facility scale.
A safe place to practise the method on S5P_L2__CH4___. The code is the real earthaccess workflow, but we feed it stand-in data shaped like the real product — so you can run it, change the numbers, and break it without an account. When you want the real data, use the recipe under “The real-data code” above, or download the notebook below.