Are crop-residue fires upwind turning my city's air toxic?
Draw a rectangle to pick your area of interest, then see what NASA data covers it (live, here in your browser) or download a ready-to-run notebook with your AOI pre-filled. The notebook runs in any Python environment — it needs a free Earthdata Login to fetch the data.
74, 28 → 78, 32 (Punjab–Haryana → Delhi (NW India))Are crop-residue fires upwind turning my city’s air toxic?
What you can answer
- Daily count of active fires and total FRP over the upwind crop belt through the Oct–Nov burning window
- Downwind pollutant load (TROPOMI NO2, CO; MODIS AOD) over the receptor city for the same days
- Source-to-receptor coupling on days when winds blow from the burning belt toward the city
- Burning-season vs baseline contrast in both fire activity and downwind columns
- Spatial map of fire clusters and the smoke plume orientation relative to prevailing winds
What you can NOT answer with these alone
- Surface PM2.5 that people actually breathe — satellites measure vertical columns / AOD, not ground concentration; you need CPCB/OpenAQ monitors and a column-to-surface model.
- Formal source apportionment (what % of the city’s pollution is stubble vs traffic vs industry) — that needs chemical transport modelling or receptor models, not correlation.
- Night-time burning completeness — overpass timing and cloud cover miss fires; FRP is a snapshot, not a daily integral.
- Health outcomes — exposure-response requires epidemiological data outside these products.
Code template
import earthaccess
import xarray as xr
import numpy as np
earthaccess.login(strategy="netrc")
# Source belt (upwind) and receptor city (downwind)
source_aoi = (74, 28, 78, 32) # Punjab–Haryana crop belt
receptor_aoi = (76.8, 28.4, 77.4, 28.9) # Delhi NCR (downwind)
season = ("2024-10-01", "2024-11-30") # post-monsoon burning window
# 1. VIIRS active fires + FRP over the source belt
fires = earthaccess.search_data(short_name="VNP14IMG",
bounding_box=source_aoi,
temporal=season)
# Open granules; keep fire-mask confidence >= nominal, read FRP per pixel.
# Aggregate per day: fire_count = N detections, frp_total = sum(FRP_MW).
# 2. Downwind pollutant columns over the receptor city
# TROPOMI NO2 / CO (Sentinel-5P) and/or MODIS AOD
no2 = earthaccess.search_data(short_name="S5P_L2__NO2___",
bounding_box=receptor_aoi,
temporal=season)
# Apply qa_value >= 0.75 mask; area-mean tropospheric NO2 column per day.
# 3. MERRA-2 low-level winds to gate transport (source -> receptor)
wind = earthaccess.search_data(short_name="M2I3NVASM",
bounding_box=source_aoi,
temporal=season)
# Compute mean U,V near surface; keep days where wind vector points
# from source_aoi toward receptor_aoi (e.g. NW'ly for Punjab -> Delhi).
# 4. On transport days: scatter frp_total vs downwind NO2/AOD;
# compare burning-season mean vs a non-burning baseline month.
Expected output
- Time series: daily fire count and summed FRP over the source belt, Oct–Nov
- Overlaid downwind series: city-mean TROPOMI NO2 / CO and MODIS AOD
- Scatter (transport days only): summed FRP vs downwind pollutant column, with correlation noted as suggestive
- Map: VIIRS fire clusters in Punjab–Haryana with a MERRA-2 wind-vector overlay toward the receptor city
- Bar contrast: burning-season vs baseline mean for fires and for downwind columns
Caveats
- FRP ≠ surface PM2.5 — it indexes combustion energy, not breathable concentration; column ≠ surface without boundary-layer correction.
- Overpass and cloud gaps undercount fires; smoke itself and post-monsoon haze can block both fire and pollutant retrievals (use QA flags).
- Correlation, not attribution — traffic, industry, firecrackers (Diwali) and regional dust co-occur with the burning season; wind-gating reduces but does not remove confounding.
- Sensor differences: VIIRS (375 m) detects smaller/cooler fires than MODIS (1 km); don’t merge raw counts across sensors without harmonizing detection limits.
- Geolocation/saturation on intense fires can bias FRP; treat very high values cautiously.
Cross-DAAC composition
LAADS/FIRMS (VIIRS, MODIS fires + AOD) + GES DISC / Copernicus (TROPOMI, MERRA-2) — multiple providers; expect separate auth for Sentinel-5P if pulled from Copernicus rather than the GES DISC mirror.
Sources
- VIIRS VNP14IMG active fire: https://www.earthdata.nasa.gov/data/instruments/viirs
- NASA FIRMS (near-real-time fire): https://firms.modaps.eosdis.nasa.gov/
- Sentinel-5P TROPOMI: https://sentinel.esa.int/web/sentinel/missions/sentinel-5p
- MODIS aerosol (MOD04): https://ladsweb.modaps.eosdis.nasa.gov/missions-and-measurements/products/MOD04_L2
- MERRA-2 (GES DISC): https://disc.gsfc.nasa.gov/datasets?project=MERRA-2
Make it yours → Set your source box (the farming belt) and your receptor city, the season window, and which pollutant to track (NO2, CO or AOD). Switch between VIIRS (sharper, 375 m) and MODIS (longer record) for fires, and choose MERRA-2 or ERA5 for the winds that connect the two.
The robust trend (Theil–Sen + Mann–Kendall) at the heart of this question — runnable on synthetic data, right here. The full earthaccess code template further down does it on real NASA data (needs an Earthdata login).