q43·advanced

How primed for wildfire is the land around me right now?

firedroughtbiospherepublic-health Datasets: 3 45–90 min
Find the data for your area

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.

Current AOI: -122.4, 38.3 → -122, 38.7 (Northern California wine country, USA)

Wildfire needs fuel, and the driest fuel of all is vegetation that has stopped growing and started to cure — grass that has gone from green to gold, brush that has spent its summer water. NASA's **MOD13A2** gives a 16-day, 1 km map of [NDVI](/glossary/ndvi/) (the Normalized Difference Vegetation Index) everywhere on land, so you can watch greenness fall through a dry season and see which hillsides have turned to tinder — even with no fire-weather station nearby. **Verified locally.** For Northern California wine country (38.3–38.7 °N), the MOD13A2 `1 km 16 days NDVI` field averaged **0.413** across the AOI for the 1–16 September 2024 composite (1,786 valid 1 km pixels) — moderate greenness, the signature of cured grassland mixed with still-green vineyards and oak. NDVI alone is not a fire forecast: it tells you how *dry the fuel* is. The full danger picture pairs it with **surface heat** (MOD11 LST) and **plant water stress** ([evapotranspiration](/glossary/evapotranspiration/), MOD16 or ECOSTRESS) — and, for an actual warning, the fire-weather agencies.

How primed for wildfire is the land around me right now?

Wildfire needs fuel, and the driest fuel of all is vegetation that has stopped growing and started to cure — grass that has gone from green to gold, brush that has spent its summer water. NASA’s MOD13A2 gives a 16-day, 1 km map of NDVI (the Normalized Difference Vegetation Index) everywhere on land, so you can watch greenness fall through a dry season and see which hillsides have turned to tinder — even with no fire-weather station nearby.

Verified locally. For Northern California wine country (38.3–38.7 °N), the MOD13A2 1 km 16 days NDVI field averaged 0.413 across the AOI for the 1–16 September 2024 composite (1,786 valid 1 km pixels) — moderate greenness, the signature of cured grassland mixed with still-green vineyards and oak. NDVI alone is not a fire forecast: it tells you how dry the fuel is. The full danger picture pairs it with surface heat (MOD11 LST) and plant water stress (evapotranspiration, MOD16 or ECOSTRESS) — and, for an actual warning, the fire-weather agencies.

What you can answer

  • How green (or cured) the vegetation is right now, and every 16 days back to 2000 — MOD13A2 NDVI (stored as integers; multiply by 0.0001 for true NDVI)
  • Whether fuel is drier than a normal year — build a per-composite climatology from past years and plot this season’s NDVI anomaly (a deep negative anomaly means unusually cured, flammable vegetation)
  • Where the dry patches are — at 1 km you can see which slopes, grasslands, or burn scars have lost their green while irrigated fields stay lush
  • How fast green-down is happening — the slope of NDVI through late summer shows fuel curing in real time, the lead-up to peak fire season
  • The heat-and-stress context — overlay MOD11 land surface temperature and MOD16/ECOSTRESS ET to add the surface-heat and water-stress dimensions of fire danger

What you can NOT answer with these datasets alone

  • Whether a fire will start or spread — NDVI is a fuel-dryness proxy, not an ignition or spread model; that needs wind, humidity, fuel-moisture sticks, and fire-behavior tools (e.g. NFDRS)
  • Live fuel moisture in percent — NDVI correlates with it but is not a calibrated moisture reading; field sampling or specialized retrievals are needed for the actual number
  • Fine-scale fuel structure — 1 km cannot see a single dry ridgeline, a defensible-space gap, or ladder fuels under a canopy; pair with higher-resolution imagery (Sentinel-2, Landsat)
  • The 16-day blind spot — MOD13A2 is a 16-day composite, so a sudden heat wave or wind event that cures fuel in days won’t show up until the next composite
  • Active fires or smoke — that’s a different product (VIIRS/MODIS active-fire and FRP), not NDVI

Code template (Python, cloud-direct)

Verified locally. MOD13A2, variable 1 km 16 days NDVI, ships as HDF-EOS2 (HDF4) tiles in the MODIS Sinusoidal grid. The bundled GDAL in many environments lacks the HDF4 driver, so the most reliable read is pyhdf directly: pull the NDVI grid, multiply by 0.0001, mask the -3000 fill, and convert the sinusoidal pixel centers to lon/lat to clip your AOI. Lower / declining NDVI in the dry season = drier fuel.

import os, re, warnings, earthaccess, numpy as np
from pyhdf.SD import SD, SDC
warnings.filterwarnings("ignore")

# load Earthdata creds from .env without `source` (passwords can break the shell)
for line in open(".env"):
    m = re.match(r'\s*(?:export\s+)?([A-Z0-9_]+)\s*=\s*(.*)\s*$', line)
    if m: os.environ.setdefault(m.group(1), m.group(2).strip().strip('"').strip("'"))
earthaccess.login(strategy="environment")   # free Earthdata Login

W, S, E, N = -122.4, 38.3, -122.0, 38.7     # your land (NorCal wine country)
g = earthaccess.search_data(short_name="MOD13A2",
                            temporal=("2024-09-01", "2024-10-15"),
                            bounding_box=(W, S, E, N))
hdf = str(earthaccess.download(g[:1], local_path="/tmp/q43")[0])

sd  = SD(hdf, SDC.READ)
sds = sd.select("1 km 16 days NDVI")
dn  = sds[:].astype("float32")
fill, scale = sds.attributes()["_FillValue"], sds.attributes()["scale_factor"]  # -3000, 10000

# grid corners (sinusoidal meters) from the tile metadata
sm = sd.attributes()["StructMetadata.0"]
ulx, uly = [float(v) for v in re.search(r"UpperLeftPointMtrs=\(([^)]+)\)", sm).group(1).split(",")]
lrx, lry = [float(v) for v in re.search(r"LowerRightMtrs=\(([^)]+)\)",  sm).group(1).split(",")]
ny, nx = dn.shape
R = 6371007.181  # MODIS sinusoidal sphere radius (m)
xc = ulx + (np.arange(nx) + 0.5) * (lrx - ulx) / nx
yc = uly + (np.arange(ny) + 0.5) * (lry - uly) / ny
X, Y = np.meshgrid(xc, yc)
LAT = np.degrees(Y / R)
LON = np.degrees(X / (R * np.cos(np.radians(LAT))))

mask = (LON >= W) & (LON <= E) & (LAT >= S) & (LAT <= N)
ndvi = np.where(dn == fill, np.nan, dn / scale)
print("mean AOI NDVI:", round(float(np.nanmean(ndvi[mask])), 4))   # -> 0.4126 for Sep 2024
# lower & falling through the dry season = drier, more fire-primed fuel
How a scientist answers this
Parameters
Vegetation greenness/dryness from MODIS MOD13A2 NDVI (integer × 0.0001 → NDVI, 1 km, 16-day) as a fuel-curing proxy, paired with MOD11 LST surface heat and MOD16/ECOSTRESS ET plant water stress; the danger diagnostic is a strongly negative NDVI anomaly versus a per-composite multi-year climatology.
Method
Build a per-pixel, per-16-day-composite NDVI climatology from past years, express the current composite as a standardized anomaly (z-score), and flag deeply negative anomalies as unusually cured fuel; combine with high MOD11 LST and elevated MOD16/ECOSTRESS evaporative stress for a multi-variable dryness picture.
Validation
State the climatology baseline, apply MOD13/MOD11 QA flags and drop cloud-contaminated pixels, and treat the result as a fuel-dryness proxy—cross-check against fire-weather indices (e.g. NFDRS) and agency forecasts rather than calling it a fire forecast.
In plain EnglishCompare this season's greenness to the normal range for the same time of year, and flag hillsides that are unusually dry and hot as primed-to-burn fuel.

Make it yours → Set the AOI, the 16-day composite/season, and the baseline years plus anomaly threshold in the notebook.

Run the core method · no login

The anomaly vs a baseline (percent-of-normal + z-score) 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).

editable · runs in your browser