Is the reservoir my town depends on rising or falling — and who relies on it?
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.
-114.95, 35.95 → -113.9, 36.65 (Lake Mead, USA (serves ~25M people across the Southwest))Is the reservoir my town depends on rising or falling — and who relies on it?
Before SWOT launched (Dec 2022), tracking a reservoir’s level from space meant stitching together optical snapshots or relying on a few gauge stations. SWOT now measures the water-surface elevation and area of lakes and reservoirs directly, worldwide — so you can watch the body of water your town drinks from rise or fall, even where there’s no public gauge.
This is a multi-agency question. SWOT (NASA/CNES) gives the current level; the free JRC Global Surface Water layer gives the decades-long baseline; and free population data answers who depends on it. Don’t assume the answer — for Lake Mead, this workflow shows the reservoir actually held steady and partly recovered across 2023–2025, matching the Colorado River’s better snow years.
What you can answer
- Is the reservoir’s level rising or falling — track SWOT water-surface elevation (
wse) across passes to see the trend, including in places with no public gauge - How its current size compares to the long-term normal — overlay the JRC Global Surface Water baseline (1984–2021) to see how today’s extent sits against decades of history
- How much surface area it has now — SWOT reports observed lake area per pass
- Roughly how many people depend on it — overlay free WorldPop population on the served towns / metro and name the area with geoBoundaries
- Whether a drought or wet year moved it — the SWOT record resolves seasonal draw-down and multi-year swings
What you can NOT answer with these datasets alone
- The exact stored volume (acre-feet / m³) — SWOT gives surface elevation and area, not volume; converting needs the reservoir’s bathymetry (depth-area-capacity curve) from the dam operator
- A clean reading from every pass — SWOT sees only the swath-crossed segment of a lake each
pass, so partial-coverage passes report low area and noisy
wse; you must QC (keep well-observed passes, drop outliers) before trusting a point - Absolute level against a local gauge — SWOT
wseis referenced to a geoid datum and can sit tens of metres off a local vertical datum; use the change over time, not the raw number - Who is legally served / water rights — WorldPop counts residents in an area; actual served population follows utility service boundaries and downstream allocation, not the lake’s footprint
- Water quality — level and area say nothing about salinity, sediment, or contamination
Code template (Python, cloud-direct)
Verified locally. SWOT lake products are zipped shapefiles — read with
geopandas(zip://). Each lake has a stablelake_idfrom the Prior Lake Database;area_totalandwseare the surface area (km²) and elevation (m). Fill value is-999999999999, and ~70% of rows in a granule are unobserved prior lakes with null geometry. For Lake Mead the id is7720003253.
import earthaccess, os, glob
import geopandas as gpd
import pandas as pd
from shapely.geometry import box
earthaccess.login(strategy="netrc")
sess = earthaccess.get_requests_https_session() # authed, to fetch single assets
aoi = (-114.95, 35.95, -113.9, 36.65) # Lake Mead, USA
os.makedirs("swot", exist_ok=True)
def reservoir_series(time_windows):
"""Well-observed SWOT level/area for the biggest lake in the AOI, per window."""
rows = []
for win in time_windows:
results = earthaccess.search_data(short_name="SWOT_L2_HR_LakeSP_D",
bounding_box=aoi, temporal=win, count=60)
best = None
for g in results:
prior = [l for l in g.data_links() if "_Prior_" in l and l.endswith(".zip")]
if not prior:
continue
fp = f"swot/{os.path.basename(prior[0])}"
if not os.path.exists(fp):
open(fp, "wb").write(sess.get(prior[0], timeout=120).content)
gdf = gpd.read_file(f"zip://{fp}")
gdf = gdf[~gdf.geometry.isna()]
gdf["area"] = pd.to_numeric(gdf["area_total"], errors="coerce")
gdf["wse_m"] = pd.to_numeric(gdf["wse"], errors="coerce")
# QC: real water-bodies in the AOI, observed area > 300 km² (drop partial passes)
obs = gdf[gdf.intersects(box(*aoi)) & (gdf["area"] > 300) & (gdf["wse_m"] > -1000)]
if len(obs):
b = obs.loc[obs["area"].idxmax()]
if best is None or b["area"] > best["area"]:
best = {"date": win[0], "lake_id": b["lake_id"],
"area_km2": float(b["area"]), "wse_m": float(b["wse_m"])}
if best:
rows.append(best)
return pd.DataFrame(rows)
windows = [("2023-08-01", "2023-08-20"), ("2024-01-01", "2024-01-25"),
("2024-06-01", "2024-06-25"), ("2024-12-01", "2024-12-25"),
("2025-04-01", "2025-04-25")]
ts = reservoir_series(windows)
print(ts) # verified: area ~380-406 km², wse ~359-363 m
print("Level change (m):", ts["wse_m"].iloc[-1] - ts["wse_m"].iloc[0])
# --- Who depends on it: free WorldPop + geoBoundaries (no NASA login) ---
import requests, rasterio, numpy as np
from rasterio.windows import from_bounds
from shapely.geometry import Point
served = (-115.4, 35.9, -114.9, 36.4) # Las Vegas valley (one served metro)
meta = requests.get("https://www.worldpop.org/rest/data/pop/wpic1km?iso3=USA").json()
pop_url = next(f for f in meta["data"][-1]["files"] if f.endswith(".tif"))
open("usa_pop_1km.tif", "wb").write(requests.get(pop_url).content)
with rasterio.open("usa_pop_1km.tif") as src:
pop = src.read(1, window=from_bounds(*served, transform=src.transform)).astype("float64")
pop[pop == src.nodata] = np.nan
print(f"People in this served metro: {np.nansum(pop):,.0f}")
adm = gpd.read_file(requests.get(
"https://www.geoboundaries.org/api/current/gbOpen/USA/ADM2/").json()["gjDownloadURL"])
print("County:", adm[adm.contains(Point(-115.14, 36.17))].iloc[0]["shapeName"]) # Clark
# --- Optional baseline: JRC Global Surface Water (free, no login) ---
# How big the reservoir was across 1984–2021 — download the 'occurrence' tile and
# compare permanent-water extent then vs the SWOT area now:
# https://global-surface-water.appspot.com/download
Expected output
- Level trend: SWOT water-surface elevation over time for your reservoir, QC’d to well-observed passes — rising, falling, or (for Lake Mead 2023–2025) holding steady
- Area readings: observed surface area (km²) per pass, with partial passes flagged/dropped
- Baseline comparison: today’s extent against the JRC 1984–2021 surface-water history
- Dependence estimate: people in the served metro (WorldPop), with the county/district named
- Honest QC note: how many passes were dropped as partial and the spread of the kept points
Caveats
- Per-pass partial coverage — SWOT crosses part of a large lake each pass; always QC by observed area (or the product quality flags) before reading a level, or you’ll mistake a half-seen lake for a shrinking one.
- Datum, not gauge —
wseis geoid-referenced; it can differ from a local gauge datum by tens of metres. Track the change, not the absolute value. - Young record — SWOT science data starts mid-2023, so you get a few years of trend, not decades. Use JRC Global Surface Water for the long view.
- Level ≠ volume ≠ supply — converting elevation to stored water needs the operator’s bathymetric curve; available supply also depends on allocation and downstream demand.
- Small reservoirs — SWOT resolves lakes roughly larger than a few hundred metres; farm ponds and narrow canyons may be missed.
Cross-agency composition
NASA/CNES SWOT (PO.DAAC) for current level & area; EU JRC Global Surface Water for the historical baseline; WorldPop (Univ. Southampton) and geoBoundaries (William & Mary) for who depends on it — the last three are free, no-login layers joined client-side.
Sources
- SWOT Lake Single-Pass (PO.DAAC): https://podaac.jpl.nasa.gov/dataset/SWOT_L2_HR_LakeSP_2.0
- SWOT mission & hydrology: https://swot.jpl.nasa.gov/
- SWOT Prior Lake Database (lake_id): https://hydroweb.next.theia-land.fr/
- JRC Global Surface Water (free baseline): https://global-surface-water.appspot.com/
- WorldPop population (free, no login): https://www.worldpop.org/
- geoBoundaries (free CC-BY admin boundaries): https://www.geoboundaries.org/
📚 Problem Finder KB
Not yet tracked in the KB.