Is my coast's water getting murkier after storms or runoff?
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.
-91.5, 28.5 → -89, 30 (Louisiana shelf / Mississippi plume, USA)When a river swells after rain or a storm churns up the seabed, the water near shore fills with sediment and dissolved material — and it stops letting light through. NASA measures exactly that: the **diffuse attenuation coefficient at 490 nm**, written `Kd_490`. It's how fast blue-green light fades with depth, in units of 1/m. Clear open ocean sits near **0.02–0.05**; murky, sediment-laden coastal water climbs well past **0.2**. MODIS-Aqua has mapped it globally every day since 2002, so you can watch your coast clear up and cloud over through the seasons. **Verified locally.** For the Louisiana shelf at the Mississippi River mouth (28.5–30.0 °N), the MODIS-Aqua `Kd_490` field had a median of **0.41 1/m** in the 8-day composite for 30 Apr – 7 May 2024 — roughly **ten times** clearer-water values, exactly the signature of a turbid river plume. Across the four 8-day windows in May 2024 the median ranged **0.27–0.41 1/m**, with the murkiest pixels (90th percentile) above **2 1/m** right at the river mouth. The plume is real and the satellite sees it.
Is my coast’s water getting murkier after storms or runoff?
When a river swells after rain or a storm churns up the seabed, the water near shore fills with
sediment and dissolved material — and it stops letting light through. NASA measures exactly that:
the diffuse attenuation coefficient at 490 nm, written Kd_490. It’s how fast blue-green light
fades with depth, in units of 1/m. Clear open ocean sits near 0.02–0.05; murky, sediment-laden
coastal water climbs well past 0.2. MODIS-Aqua has mapped it globally every day since 2002, so
you can watch your coast clear up and cloud over through the seasons.
Verified locally. For the Louisiana shelf at the Mississippi River mouth (28.5–30.0 °N), the
MODIS-Aqua Kd_490 field had a median of 0.41 1/m in the 8-day composite for 30 Apr – 7 May
2024 — roughly ten times clearer-water values, exactly the signature of a turbid river plume.
Across the four 8-day windows in May 2024 the median ranged 0.27–0.41 1/m, with the murkiest
pixels (90th percentile) above 2 1/m right at the river mouth. The plume is real and the
satellite sees it.
What you can answer
- How murky your coastal water is right now, and any day back to 2002 — MODIS-Aqua
Kd_490(1/m; higher means less light penetrates, i.e. murkier) - Whether a storm or flood pulse muddied the water — compare composites just before and just after the event and watch the median jump
- The seasonal rhythm of clarity — build a month-by-month climatology and see when runoff season clouds your coast
- How far a river plume reaches offshore — map
Kd_490across the shelf and trace the turbid tongue away from the river mouth - Clarity vs. greenness side by side — pair with chlorophyll-a to separate “muddy with sediment” from “green with algae”, and with sea surface temperature for storm context
What you can NOT answer with these datasets alone
- What is making the water murky —
Kd_490measures that light is blocked, not by what; sediment, dissolved organic matter, and dense algae all raise it and can’t be told apart from this number alone - Clarity on cloudy days — MODIS is optical, so storms and cloud cover (often the very days you care about) leave gaps; 8-day and monthly composites fill in, but the exact storm day may be blank
- Conditions right at the shoreline or in narrow channels — at ~1–4 km resolution, a small marina, tidal creek, or surf zone is finer than a pixel, and land/shallow-bottom contamination can corrupt the very nearest pixels
- Water quality you’d swim or fish by —
Kd_490is not turbidity (NTU), not bacteria, and not a health standard; it’s an optical index that correlates with murkiness, nothing more - Below the surface — this is an optical surface measurement; it says nothing about a deeper or stratified layer
- Cause and effect on its own — to attribute a clarity change to a specific storm or river discharge you need rainfall or gauge data alongside
Code template (Python, cloud-direct)
Verified locally. The live OB.DAAC collection is
MODISA_L3m_KD(the Kd_490 mapped product); each granule’s variable isKd_490in a global mapped NetCDF where latitude runs north→south, so slicelat=slice(N, S). Open lazily and slice your coastal box before reading. 8-day composites are a good first choice — cloud-tolerant and one file per read.
import os, re, earthaccess, xarray as xr, numpy as np
# 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 = -91.5, 28.5, -89.0, 30.0 # your coast (Louisiana shelf / Mississippi plume)
results = earthaccess.search_data(short_name="MODISA_L3m_KD",
temporal=("2024-05-01", "2024-05-31"),
bounding_box=(W, S, E, N))
# pick a 4 km, 8-day Kd_490 composite (cloud-tolerant, one file per read)
g = next(r for r in results
if "Kd_490" in r["meta"]["native-id"]
and "4km" in r["meta"]["native-id"]
and ".8D." in r["meta"]["native-id"])
ds = xr.open_dataset(earthaccess.open([g])[0])
kd = ds["Kd_490"].sel(lat=slice(N, S), lon=slice(W, E)) # lat is N->S in this grid
vals = kd.values[np.isfinite(kd.values)]
print("median Kd_490:", round(float(np.median(vals)), 3), "1/m",
" (clear ocean ~0.02-0.05, turbid coast >0.2)") # -> ~0.41 1/m for this plume
# storm/runoff before-vs-after: rerun for a window before the event and one after,
# compare the medians, and trace how far offshore the murky water reachesMake it yours → Set the coastal AOI box, the before/after composite dates, and the percentile cutoff in the notebook.
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).