qin8·advanced

Where is methane rising from paddies, livestock, and landfills near me?

atmospheregreenhouse-gasesagriculture Datasets: 4 15–30 min

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.

  1. 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).
  2. 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.
  3. 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.
  4. 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

How a scientist answers this
Parameters
Column-averaged dry-air methane mole fraction (XCH4) from TROPOMI / Sentinel-5P (~5.5 km, daily, near-global) for regional enhancements, with GOSAT XCH4 for the long record (2009+). For facility-scale plumes (e.g. landfills) the EMIT imaging spectrometer (60 m) and point-source plume products resolve individual sources. The answer is the XCH4 enhancement — column minus a regional background — mapped and composited to find persistent hotspots.
Method
Subtract a regional background (clean-air percentile or upwind reference) from XCH4 to get the enhancement, then composite over time to reveal persistent hotspots versus transient transport. Attribute hotspots to source type using context: flooded-paddy seasonality (enhancement tracks the monsoon transplanting/flooding cycle), livestock density (steady, co-located with herds), and landfill point plumes (sharp, localised — resolved by EMIT). Seasonality is the key discriminator: paddy emissions pulse with monsoon flooding while livestock and landfill sources stay roughly steady year-round.
Validation
TROPOMI measures a *column*, not a surface flux — high XCH4 can reflect accumulation under stagnant meteorology rather than local emission, so pair with wind/transport before claiming a source. Retrievals carry albedo, aerosol and cloud artefacts (bright/dark surfaces and haze bias XCH4); apply the quality assurance (qa_value) filter and treat low-qa pixels with caution. Coarse ~5.5 km pixels mix paddy, livestock and urban/landfill sources, so use EMIT/airborne plume imaging or bottom-up inventories (e.g. EDGAR) to confirm and disaggregate.
In plain EnglishSatellites measure how much methane is in the air column over your region. Subtract the normal background and the leftover bump shows where extra methane is coming from. Paddies pulse with the monsoon flooding season, cows and landfills leak steadily, and a fine-resolution instrument (EMIT) can pin down individual dump-site plumes.

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.

🧪 Virtual Mock Lab stand-in data · runs in your browser · no login

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.

editable · runs in your browser

Datasets used

Recipe ready · not yet run The recipe and the Virtual Mock Lab above are ready to use. We haven't yet run this question end-to-end on real data, so it has no verified answer yet — only the questions we've actually computed carry one. That's the honest line between a method and a result.