q16·intermediate

Where is surface water, and how is it changing over time?

hydrologywater-extentclimate Datasets: 5 20–60 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: 60.5, 44 → 62.5, 46.5 (Aral Sea (Kazakhstan/Uzbekistan))
On this page

This is the *persistent* surface-water question, not the storm-flood question (see q13). Here we ask: where does open water sit, and is the extent shrinking (drying lakes), expanding (filling reservoirs), or pulsing seasonally (wetlands, floodplains) across months and years?

Where is surface water, and how is it changing over time?

This is the persistent surface-water question, not the storm-flood question (see q13). Here we ask: where does open water sit, and is the extent shrinking (drying lakes), expanding (filling reservoirs), or pulsing seasonally (wetlands, floodplains) across months and years?

What you can answer

  • Open-water extent maps at 30 m, all-weather, from OPERA DSWx-S1 (radar) — no cloud gaps
  • Optical surface-water classification (open water + partial-surface water) from OPERA DSWx-HLS
  • Multi-year extent change — area time series to flag shrinking lakes or filling reservoirs
  • Seasonal wetland pulsing — wet-season vs dry-season extent from dense radar revisit
  • Comparison to a long-term baseline by joining the JRC/Pekel occurrence layer (1984–present)
  • Radar-optical cross-validation — DSWx-S1 vs DSWx-HLS agreement on cloud-free dates

What you can NOT answer with these alone

  • Water volume or depth — extent is a 2-D footprint; volume needs DSWx area × DEM/bathymetry or altimetry (SWOT/ICESat-2, see q06)
  • Water-surface elevation / level — DSWx is a binary-ish water mask, not a height product
  • Why it changed — attribution (irrigation withdrawal vs drought vs dam operation) needs GRACE-FO, IMERG, and land-use context
  • Water quality (turbidity, algae, salinity) — that’s an optical-reflectance/HAB problem (see q14), not a water mask
  • Sub-30 m features — narrow streams, small ponds, and field-scale irrigation are below product resolution
  • Daily flood peaks — for fast storm events use q13’s near-real-time SAR workflow

Code template (Python, cloud-direct)

import earthaccess
import numpy as np

earthaccess.login(strategy="netrc")

# Aral Sea — the textbook shrinking-lake case, eastern basin nearly gone
aoi = (60.5, 44.0, 62.5, 46.5)
window = ("2023-04-01", "2025-09-30")

# 1. OPERA DSWx-S1 — radar surface water, all-weather, the workhorse here
dswx_s1 = earthaccess.search_data(
    short_name="OPERA_L3_DSWX-S1_V1",
    bounding_box=aoi,
    temporal=window,
)
# Open the WTR (water classification) band per granule as a COG.
# Class values (DSWx convention):
#   0 = not water, 1 = open water, 252/253/254/255 = fill/cloud/no-data masks.
# Build a boolean mask: water = (WTR == 1)
# Area per scene = water.sum() * 30 * 30 m²  →  km²  →  append to a time series.

# 2. OPERA DSWx-HLS — optical cross-check on cloud-free dates
dswx_hls = earthaccess.search_data(
    short_name="OPERA_L3_DSWX-HLS_V1",
    bounding_box=aoi,
    temporal=window,
)
# DSWx-HLS WTR adds partial-surface-water classes (open vs partial vs snow/ice);
# treat open water = 1, optionally fold in partial water = 2 for a wetland-inclusive count.
# Only trust scenes where the cloud/no-data fraction over the AOI is low.

# 3. Sentinel-1 GRD fallback if you need a custom threshold or earlier (pre-2023) record
s1 = earthaccess.search_data(
    short_name="SENTINEL-1A_SLC",  # or GRD product per ASF catalog
    bounding_box=aoi,
    temporal=("2014-10-01", window[0]),
)
# For GRD: VV backscatter < ~-20 dB → smooth open water. Requires RTC/calibration
# (use OPERA RTC-S1 to avoid raw SAR processing). Lets you backfill years before DSWx.

# 4. Optional external baseline: JRC/Pekel Global Surface Water occurrence (1984–present)
#    Not on Earthdata — pull from the JRC dataset (Earth Engine / Google Cloud / direct
#    GeoTIFF tiles). Reproject to the DSWx grid, then compare current extent vs the
#    long-term water-occurrence climatology to quantify gain/loss.

# 5. Build the change product:
#    - Extent time series: km² of water per acquisition date (DSWx-S1 primary)
#    - Trend: linear fit / seasonal decomposition over the window
#    - Loss/gain map: pixels that flipped water→land (or land→water) vs the baseline

Expected output

  • Extent time series: surface-water area (km²) per date, radar (DSWx-S1) as the backbone with optical (DSWx-HLS) points overlaid on cloud-free dates
  • Trend summary: net area change over the window + seasonal amplitude for wetlands
  • Change map: water-loss (red) and water-gain (blue) pixels vs the JRC/Pekel baseline
  • Latest all-weather water mask for the AOI

Caveats

  • DSWx-S1 is radar — roughness, not depth. Wind-roughened open water can read as land; smooth wet soil or tarmac can false-positive. Class flags (cloud/no-data) must be respected.
  • DSWx-HLS is cloud-limited. Persistent cloud means sparse optical coverage — lean on DSWx-S1 for the continuous record and use HLS as a cross-check.
  • OPERA DSWx is operational from ~2023, so the native record is short. Backfill earlier years with Sentinel-1 GRD/RTC-S1 (from 2014) or the JRC/Pekel baseline (from 1984).
  • 30 m resolution misses narrow channels, small ponds, and sub-pixel mixing along shorelines; reported area has shoreline-pixel uncertainty.
  • Layover/shadow in terrain corrupts radar water detection in steep areas; DSWx flags these but interpret mountain lakes carefully.
  • JRC/Pekel is external (not Earthdata) and on its own grid — reproject before any pixel-wise comparison.
  • Extent ≠ volume. A lake can hold steady area while losing depth; pair with altimetry (q06) to track storage.

Cross-DAAC composition

ASF DAAC (OPERA DSWx-S1, Sentinel-1, RTC-S1) + LP DAAC (OPERA DSWx-HLS, HLS) — two DAACs, one Earthdata Login. JRC/Pekel is an external join (see r01 for cross-source patterns).

Sources

How a scientist answers this
Parameters
Binary open-water masks at 30 m from OPERA DSWx-S1 (radar, all-weather, from Sentinel-1) and OPERA DSWx-HLS (optical, cloud-limited), aggregated to water-surface area (km2) per date; the JRC/Pekel Global Surface Water occurrence layer (1984-present) supplies the long-term 'normal' extent and permanent-vs-seasonal baseline.
Method
Convert each water mask to an area time series (count water pixels times pixel area), then fit an area-weighted Theil-Sen + Mann-Kendall trend on annual or seasonal extent to flag shrinking lakes or filling reservoirs, and compare wet- vs dry-season composites against the JRC occurrence baseline to characterize seasonal pulsing; on cloud-free dates, cross-validate DSWx-S1 against DSWx-HLS.
Validation
Report radar-optical agreement on overlapping cloud-free dates and mask known artifacts (SAR layover/shadow and wind-roughened water; optical cloud/shadow and terrain shadow), and anchor results to the JRC/Pekel permanent-water baseline; note extent is a 2-D footprint, not volume or depth.
In plain EnglishMap where open water sits each date at 30 m using cloud-piercing radar plus optical, add up the wet area over months and years, and compare it to the long-term normal to see if water bodies are growing, shrinking, or just pulsing seasonally.

Make it yours → Edit the bounding box, date range, and wet/dry-season windows, and toggle radar-only versus radar+optical to trade cloud-immunity for cross-checking.

Run the core method · no login

The thresholding a measurement into classes 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