How Kd490 satellite data predicts water clarity
If you search “fishing app water clarity” today, the useful results all cluster around the same phrase: “Kd490.” It’s a term from remote-sensing oceanography, not consumer apps. There’s a reason for that — almost no consumer app pulls this data. Submarius does, because it’s the closest thing the public-data universe has to a direct visibility signal.
This post is a walkthrough of what Kd490 actually is, how a satellite measures it from orbit, and how a 2015 paper by Lee et al. lets us turn that measurement into an answer to the real question: how many feet will I see underwater tomorrow?
The physical problem
Underwater visibility, in the classic oceanographic sense, is Secchi depth — the depth at which a standardized white disk lowered into the water stops being visible to an observer at the surface. Italian astronomer Pietro Angelo Secchi invented the method in 1865. It’s still the global gold standard for measuring the clarity of natural water. It’s also labor-intensive, manual, and unscalable. You cannot Secchi-disk every reef in the world every morning.
The remote-sensing alternative is to measure what the water is doing to light and then compute how far a human eye could see through it. Every ocean-color satellite — MODIS, VIIRS, OLCI on Sentinel-3, and now PACE — is effectively a photometer measuring the light coming out of the top of the water column at specific wavelengths. The trick is to translate that measurement back into a visibility estimate a diver can use.
What Kd490 actually is
Kd(490) is the diffuse attenuation coefficient at 490 nanometers — the rate at which blue-green light intensity falls off with depth in water.
- If Kd(490) = 0.03 m⁻¹, light at 490 nm loses about 3% per meter. That water is oceanic blue; you can see for tens of meters.
- If Kd(490) = 0.5 m⁻¹, it’s losing half its intensity every couple meters. That’s green-brown water; you’re lucky to see your own gun tip.
- If Kd(490) > 1.0 m⁻¹, it’s attenuating by roughly e (2.7×) per meter or worse. Chocolate plume off an inlet after a storm.
Why 490 nm specifically? Because it’s right in the band where pure seawater is maximally transparent (sometimes called the “clear water peak”), which means anything that does attenuate light at 490 nm is something non-water — chlorophyll, colored dissolved organic matter (CDOM), and suspended sediment. All three are the reasons you can’t see underwater. So Kd(490) is effectively a composite index of “how much stuff is in the water column that isn’t water.”
For comparison, the other standard visibility unit — Secchi depth Z_SD — has a rough inverse relationship to Kd(490). Deeper Secchi disk visibility, lower Kd.
How a satellite measures it
An ocean-color satellite doesn’t directly “see” Kd. It sees water-leaving radiance — how much light at various wavelengths reflects out of the top of the water column toward the satellite’s sensor. Instruments like VIIRS measure this in discrete spectral bands (412, 443, 486, 551, 671 nm on VIIRS; similar bands on MODIS and OLCI).
From those band measurements, atmospheric correction algorithms back out the reflectance just at the water surface — removing the effects of atmospheric gas absorption, aerosol scattering, and sun glint. That surface reflectance is then fed into band-ratio algorithms to estimate the quantities people actually want: chlorophyll-a, CDOM absorption, and — for our purposes — Kd(490).
NASA’s OBPG group maintains the canonical Kd(490) algorithms: the KD2 algorithm from Lee et al. 2005 (Kd as a function of the 490/555 band ratio) and the newer QAA-based semi-analytical approach. Both ultimately produce a per-pixel Kd(490) value in m⁻¹, typically at 300m–1km spatial resolution.
NOAA CoastWatch publishes the results as a public data product. You can pull near-real-time Kd(490) imagery for any US coastal region via their ERDDAP endpoints — which is exactly what Submarius does, polling the relevant tile every few hours.
The Lee 2015 bridge: Kd to Secchi
Kd(490) is a physics quantity. Divers don’t think in inverse meters. We think in feet of viz. Bridging those two turns out to be a surprisingly hard problem that the oceanographic community only solved a decade ago.
The canonical paper is Lee et al., 2015: “Secchi disk depth: A new theory and mechanistic model for underwater visibility” (Remote Sensing of Environment, vol. 169, pp. 139–149). They revisit the Secchi measurement from first principles, derive a new model for the optical processes that determine when a disk becomes invisible, and calibrate it against 46 years of in-situ Secchi measurements plus paired optical data.
The headline result: their theoretical model predicts Secchi depth from inherent optical properties with R² = 0.96 against 338 in-situ measurements spanning open ocean to coastal turbid waters. That’s exceptional for an oceanographic model. It’s also the enabling result for any consumer app that wants to turn satellite Kd into human-useful visibility.
Run the model backward and you get a practical equation: given Kd(490) and the solar zenith angle, output an estimated Secchi depth Z_SD in meters. Multiply by 3.28 and you have feet. Cross-reference against years of paired data for your region and you can add calibration terms to account for systematic bias (e.g. sensor geometry, sub-pixel coastline effects).
This is the mathematical core of Submarius’s day-1 water-clarity forecast.
The data product we actually ingest
Concretely, Submarius’s clarity pipeline pulls from NOAA CoastWatch ERDDAP. For US coastal tiles, we request Kd(490) composites from the VIIRS SNPP sensor at near-daily cadence, supplemented by MODIS-Aqua where available. The composites are 1-day (cloudy), 7-day (good coverage), and 8-day science-quality products; we prefer 1-day where cloud-free, falling back to 7/8-day composites for cells where recent cloud cover blocked direct measurement.
The Kd(490) value enters our model alongside:
- Wind and swell from Open-Meteo Marine — for the wave-mixing term that predicts how the clarity will evolve between satellite passes.
- USGS Water Services real-time river discharge — for plume detection. When a major watershed’s flow spikes above baseline, we flag the downstream coastal cells for elevated turbidity regardless of what the satellite showed yesterday.
- NOAA HAB bulletins — for overriding the model during documented harmful algal bloom events, which can take clarity from excellent to poor in days and aren’t well-captured by clear-sky Kd alone.
- An OSM-derived coastline-geometry classifier — open / semi-open / enclosed — which weights how aggressively other signals should adjust the estimate. A 20-knot onshore wind over an open outer reef is very different from the same wind in a semi-enclosed sound.
These are fused into a Lee 2015–anchored Secchi estimate plus an uncertainty band. The uncertainty isn’t post-hoc decoration; it’s fallout from the propagation of measurement and model variance. When the satellite data is old because of persistent cloud cover, or when river discharge is spiking and historical data is thin, the uncertainty band widens — honestly.
Where the satellite approach breaks down
No single approach is universal. The weaknesses of satellite Kd490:
-
Cloud cover. Most US coasts get cloud-free overhead flyovers 50–70% of days. Compositing across 3–8 days fills gaps but trades temporal specificity for coverage. Submarius’s pipeline tags the age of the underlying Kd data on every forecast so you can see when the satellite signal is stale.
-
Sub-pixel shoreline effects. VIIRS Kd(490) pixels are ~750m at nadir. In the nearest 500m to shore — where a lot of actual diving happens — the pixel averages over mixed land/water and becomes unreliable. For inshore cells we blend in other signals (river discharge, tide state, recent wind history) more heavily.
-
Shallow-water bottom reflectance. Over bright sand or reef at 5–10m depth, light reflecting off the bottom can contaminate the water-leaving radiance signal. Standard Kd(490) algorithms are designed for optically-deep water; very shallow reefs introduce positive bias in some seasons.
-
Bloom dynamics. A harmful algal bloom starting today won’t show up in the satellite composite for 1–3 days depending on cloud coverage. HAB bulletins partly cover this gap for major events, but minor blooms can still surprise a forecast.
-
Temporal lag. Even perfect satellite data tells you what the water was like when the satellite passed over — not what it will be tomorrow at dive time. Bridging that gap requires a physics-based evolution model (the wave-mixing term) plus honesty about how quickly a forecast horizon degrades accuracy.
None of these are dealbreakers for a useful forecast. All of them matter for the uncertainty estimate. A clarity app that always reports “confident 8–12m viz” is lying; a clarity app that says “7–15m, but our satellite is 72 hours old and the wind has been onshore” is being useful.
What the next generation brings
The satellite-ocean-color field is at an inflection point. NASA’s PACE (Plankton, Aerosol, Cloud, ocean Ecosystem) mission launched in February 2024 and is now delivering hyperspectral ocean color — hundreds of narrow bands instead of a handful of wider ones. For clarity specifically, this means:
- Better discrimination between the three causes of turbidity — phytoplankton, CDOM, and suspended sediment. A pixel of “Kd(490) = 0.4” today could be any of those three; with PACE’s hyperspectral data, we can separate them and apply specific correction models.
- Improved nearshore performance. Hyperspectral inversion handles the sub-pixel mixing problem better than six-band algorithms.
- Public data, free access. Like its predecessors, PACE products flow through NASA Ocean Biology Processing Group to NOAA and are ultimately available via ERDDAP to anyone who wants them.
We’re actively tracking PACE product maturity. When the operational Kd equivalents reach public-release quality, they’ll feed into the Submarius pipeline the same way the VIIRS and MODIS Kd products do today.
Why we built this, honestly
We didn’t invent anything on the oceanography side of this. Every piece — Kd(490), Lee 2015, VIIRS, CoastWatch ERDDAP, USGS discharge — exists in the public domain. The tools sit in NASA, NOAA, and academic papers that anyone can read.
The gap we noticed was the same gap every diver notices eventually: all of this data exists, and no consumer app is plugging it together for you. Fishbrain ignores it. Windy doesn’t touch it. Surfline has never shipped it. The apps that do water-clarity products today are either (a) scientific dashboards for researchers, (b) geographically tiny (VizCheck for AU/NZ, SpearFactor for 30 California spots, DiveViz as a bare-bones experiment), or (c) missing the ground-truth calibration loop that post-dive user reports provide.
Submarius pulls the publicly available science into one forecast — grounded in Lee 2015, honest about uncertainty, and sharpened over time by H3-fuzzed community post-dive reports that never leak the actual dive location. If we’re wrong, we say so and show our work. If we’re right, it’s because the oceanographers were right first.
Further reading
- Lee, Z., S. Shang, C. Hu, K. Du, A. Weidemann, W. Hou, J. Lin, and G. Lin (2015). Secchi disk depth: A new theory and mechanistic model for underwater visibility. Remote Sensing of Environment, 169, 139–149.
- NOAA CoastWatch — operational ocean color and Kd(490) products.
- NASA PACE Mission — the next-generation hyperspectral platform.
- Internal: How Submarius’s water clarity forecast works and How to predict water visibility for diving and spearfishing.