Is a drought quietly building across my region before the harvest fails?
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.
35, 2 → 42, 8 (Horn of Africa (S. Ethiopia / N. Kenya))In the Sahel and the Horn of Africa, early drought detection is the difference between a managed shortfall and a famine that displaces millions. The point of this page is to spot the problem **before** the crop visibly fails — when soil water has already dropped below normal but the fields still look green.
Is a drought quietly building across my region before the harvest fails?
In the Sahel and the Horn of Africa, early drought detection is the difference between a managed shortfall and a famine that displaces millions. The point of this page is to spot the problem before the crop visibly fails — when soil water has already dropped below normal but the fields still look green.
What you can answer
- Whether soil water is below normal for this time of year (FLDAS soil-moisture anomaly vs the 1982–present monthly climatology — this is the famine-early-warning signal).
- How dry the root zone and surface are right now, day by day (SMAP enhanced 9km soil moisture, updated within ~2–3 days of acquisition).
- Whether crops are already under water stress (ECOSTRESS Evaporative Stress Index — ESI near 0 means plants have closed stomata and stopped transpiring, a direct early sign of crop failure).
- Whether the dryness is widespread or patchy by comparing the coarse model field (FLDAS, 0.1°) with the fine ECOSTRESS field (~70m) over the same AOI.
- How much water the soil itself can hold — the drought buffer. For US croplands, USDA SSURGO gives plant-available water capacity (cm in the root zone), so the same rainfall deficit is far more dangerous on a sandy, low-capacity soil than on a deep silt loam. (Outside the US, ISRIC SoilGrids gives the same idea at 250 m.)
- (Africa) Where the cropland actually is, and whether water bodies are shrinking — Digital Earth Africa’s crop mask focuses the drought signal on real fields, and its Water Observations from Space (WOfS) shows reservoirs and seasonal wetlands drying up year over year. Free, no login — a natural fit for the Horn-of-Africa default here.
What you can NOT answer with these datasets alone
- Final yield in tonnes — these are biophysical stress indicators, not a crop-yield model. Join with FEWS NET / WRSI or a crop model for that.
- Cause of the dryness (failed rains vs irrigation withdrawal vs heatwave) — needs IMERG precipitation and land-use/irrigation data.
- Sub-field detail every day — ECOSTRESS is high-resolution but revisits irregularly (it flies on the ISS), so you get sharp snapshots, not a daily 70m movie.
- Future rainfall — none of these forecast; they tell you the current and recent state. Pair with a seasonal forecast for outlook.
Code template (Python, cloud-direct, ~35 lines)
import earthaccess
import xarray as xr
import numpy as np
earthaccess.login(strategy="netrc")
# 1. Define AOI + the months that lead up to harvest
aoi = (35.0, 2.0, 42.0, 8.0) # W, S, E, N — Horn of Africa (S. Ethiopia / N. Kenya)
season = ("2024-03-01", "2024-06-30") # long-rains growing season
# 2. SMAP enhanced daily soil moisture (9km) — the "right now" signal
smap = earthaccess.search_data(
short_name="SPL3SMP_E",
bounding_box=aoi,
temporal=season,
)
# ...open the HDF5 'Soil_Moisture_Retrieval_Data_AM/soil_moisture' group,
# subset to AOI, average over space -> daily AOI mean soil moisture
# 3. FLDAS famine-warning land model (monthly 0.1°) — current month + baseline
fldas_now = earthaccess.search_data(
short_name="FLDAS_NOAH01_C_GL_MA",
bounding_box=aoi,
temporal=season,
)
fldas_clim = earthaccess.search_data(
short_name="FLDAS_NOAH01_C_GL_MA",
bounding_box=aoi,
temporal=("1991-01-01", "2020-12-31"), # 30-yr baseline, same calendar months
)
# ...open 'SoilMoi00_10cm_tavg', build the per-month climatology mean & std,
# then anomaly = (this_month - clim_mean) / clim_std (a drought z-score)
# 4. ECOSTRESS ESI (~70m) — confirm crops are actually stressed
esi = earthaccess.search_data(
short_name="ECO_L4T_ESI",
bounding_box=aoi,
temporal=season,
)
# ...open the tiled GeoTIFF, ESI -> 0 = severe stress, ~1 = unstressed
# 5. Verdict: drought building if FLDAS anomaly < -1 sigma AND SMAP trending down
# AND ESI dropping toward 0 across the cropped pixels.
ds = xr.open_dataset(earthaccess.open(fldas_now[:1])[0]) # auth'd cloud-direct read
print("FLDAS top-layer soil moisture:", ds["SoilMoi00_10cm_tavg"].dims)
# 6. (US croplands only) USDA SSURGO soil water-holding capacity — the drought buffer.
# Free, no login. Outside the US, use ISRIC SoilGrids (https://soilgrids.org).
import requests
w, s, e, n = -93.70, 41.95, -93.60, 42.05 # demo: an Iowa cropland box (use your AOI)
wkt = f"polygon(({w} {s}, {e} {s}, {e} {n}, {w} {n}, {w} {s}))"
sql = ("SELECT mu.mukey, mu.muname, ma.aws0150wta " # aws0150wta = plant-available water 0-150cm, cm
"FROM mapunit mu JOIN muaggatt ma ON mu.mukey = ma.mukey "
f"WHERE mu.mukey IN (SELECT mukey FROM SDA_Get_Mukey_from_intersection_with_WktWgs84('{wkt}'))")
rows = requests.post("https://sdmdataaccess.sc.egov.usda.gov/Tabular/post.rest",
json={"query": sql, "format": "JSON"}, timeout=60).json().get("Table", [])
awc = [float(r[2]) for r in rows if r[2] not in (None, "")]
print(f"Soil available water (0-150cm): {min(awc):.0f}-{max(awc):.0f} cm over {len(awc)} map units")
# Low capacity (sandy) -> the same deficit bites faster; high (silt loam) -> more buffer.
# 7. (Africa only) Digital Earth Africa — where the cropland is + shrinking water bodies.
# Free, no login (open STAC + COGs). DE Africa's gateway wants a browser User-Agent.
from pystac_client import Client
cat = Client.open("https://explorer.digitalearth.africa/stac",
headers={"User-Agent": "Mozilla/5.0"})
crop = cat.search(collections=["crop_mask_eastern"], bbox=aoi).item_collection() # 2019 cropland
wofs = cat.search(collections=["wofs_ls_summary_annual"], bbox=aoi,
datetime="2018/2024").item_collection() # annual % wet
print(f"DE Africa: {len(crop)} crop-mask + {len(wofs)} WOfS tiles over the AOI")
# Load the COGs with odc.stac.load(...), mask the FLDAS/SMAP drought signal to cropland,
# and track WOfS 'frequency' year-over-year to catch reservoirs/wetlands drying up.
Expected output
- Map: FLDAS soil-moisture anomaly (z-score) across the AOI for the current month — red where soil water sits more than 1 standard deviation below the 30-year normal.
- Time-series: AOI-mean SMAP daily soil moisture for the growing season overlaid on the prior-year track, so a downward divergence is obvious early.
- Map: ECOSTRESS ESI snapshot over the cropped area — low ESI patches mark fields that have already started shutting down.
- One-line verdict combining the three: “Soil water is N sigma below normal, declining, and crop stress is rising — drought building before harvest.”
- (US) Soil-buffer overlay: USDA SSURGO available water capacity, so the deficit is read against how much water each field’s soil can actually hold — the same drought hurts a sandy soil far sooner than a deep silt loam.
Caveats
- SMAP top ~5cm only: it senses the surface, not the deep root zone. Use FLDAS layered soil-moisture for root-zone context; treat SMAP as the fast daily pulse.
- FLDAS is a model, not a measurement: it assimilates rainfall (CHIRPS) and met forcing, so its skill follows the quality of rainfall inputs — sparse-gauge regions are weaker.
- ECOSTRESS revisit is irregular and clouds block the thermal sensor; expect gaps, especially during rains. It confirms stress where you have a clear scene rather than providing continuous coverage.
- Anomaly baseline matters: a drought “below normal” depends entirely on the climatology window you pick — state it explicitly (here 1991–2020).
Cross-DAAC composition
This is a 3-DAAC join: GES DISC (FLDAS) + NSIDC DAAC (SMAP) + LP DAAC (ECOSTRESS). Auth is uniform (Earthdata Login via earthaccess), but the formats differ — FLDAS and SMAP are HDF5/NetCDF on regular grids, while ECOSTRESS ships as tiled GeoTIFFs. Regrid the fine ECOSTRESS field onto the FLDAS grid (or vice versa) before comparing. See recipes/r01-three-daac-composition.mdx for the general pattern.
Sources + further reading
- FEWS NET (Famine Early Warning Systems Network): https://fews.net/
- NASA SMAP mission + SPL3SMP_E product: https://nsidc.org/data/spl3smp_e
- FLDAS at GES DISC (FLDAS_NOAH01_C_GL_MA): https://disc.gsfc.nasa.gov/guides/FLDAS_NOAH01_C_GL_MA_001/summary
- ECOSTRESS L4 ESI (ECO_L4T_ESI): https://lpdaac.usgs.gov/products/eco_l4t_esiv002/
- FLDAS background (NASA / FEWS NET land data assimilation): https://ldas.gsfc.nasa.gov/fldas
- USDA Soil Data Access (SSURGO, free, no login): https://sdmdataaccess.sc.egov.usda.gov/
- ISRIC SoilGrids (global 250 m soil properties): https://soilgrids.org/
- Digital Earth Africa (open STAC: WOfS, crop mask): https://www.digitalearthafrica.org/ · https://explorer.digitalearth.africa/stac
Make it yours → Set the region, the months, the climatology baseline, and the anomaly/ESI thresholds, and switch SSURGO (US) for SoilGrids (global) when picking the soil-buffer layer.
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).