q14·intermediate
When and where do harmful algal blooms occur in my coastal waters?
oceanbiologywater-qualitypublic-health 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:
-71, 41 → -67, 45 (Gulf of Maine)On this page
When and where do harmful algal blooms occur in my coastal waters?
What you can answer
- Chlorophyll-a anomaly maps flagging unusually high productivity (potential bloom)
- Phytoplankton functional type discrimination (PACE hyperspectral) — distinguish cyanobacteria from diatoms
- Bloom seasonality — 22-year MODIS Aqua climatology for your bay/coast
- Spatial extent + persistence of an active bloom
- Trend over the satellite era — has bloom frequency or intensity changed?
What you can NOT answer with these alone
- Toxin concentrations (microcystin, brevetoxin) — requires water sampling
- Health risk without combining with shellfish-bed and beach-use data
- Sub-surface bloom layers — satellites see only the top optical depth (~5-30 m depending on water clarity)
- Definitive species identification — PACE hyperspectral suggests type; species-level needs lab
Code template
import earthaccess
import xarray as xr
import numpy as np
earthaccess.login(strategy="netrc")
# Gulf of Maine harmful algal bloom monitoring
aoi = (-71, 41, -67, 45)
# 1. PACE OCI hyperspectral chlorophyll (the new tool)
pace = earthaccess.search_data(short_name="PACE_OCI_L2_OC_NRT",
bounding_box=aoi,
temporal=("2024-04-01", "2025-12-31"))
# Extract chl-a, plus phytoplankton functional type if available
# Threshold: Chl > 10 mg/m³ → potential bloom
# 2. MODIS Aqua chlorophyll for long-term climatology
modis = earthaccess.search_data(short_name="MODISA_L3m_CHL",
bounding_box=aoi,
temporal=("2002-07-01", "2025-12-31"))
# Compute monthly climatology (mean per pixel per month-of-year)
# Compute current-year anomaly vs climatology
# 3. PACE absorption-by-CDOM (aCDOM)
# High aCDOM = freshwater inputs / runoff (often drives blooms)
pace_cdom = earthaccess.search_data(short_name="PACE_OCI_L2_BGC",
bounding_box=aoi, temporal=("2024-04-01", "2025-12-31"))
# 4. Plot:
# - Current bloom intensity map
# - Bloom-area time series 2002+
# - Phytoplankton-type pie chart per bloom event
Expected output
- Chlorophyll-a anomaly map flagging current bloom-affected pixels
- Time-series: total bloom area (km²) over 22 years showing potential trend
- PFT composition: % cyanobacteria vs diatoms vs other (PACE)
- aCDOM context: when is runoff driving the bloom?
Caveats
- Coastal Case-II waters are hard for satellite ocean-color retrievals (CDOM, sediment, shallow bottom). PACE handles these better than MODIS but algorithms are still maturing.
- Cloud cover destroys retrievals. Aim for 8-day or monthly composites in cloudy regions.
- Chl > threshold ≠ bloom — some bays are naturally productive. Use the ANOMALY (current minus climatology), not absolute chl.
- Toxin concentration is NOT proportional to chl — some species produce intense toxins at low cell counts
- MODIS reprocessing R2022.0 vs R2018.0 — use R2022.0 by default; reprocess any older data
Cross-DAAC composition
OB.DAAC only — both PACE and MODIS Aqua ocean color, single DAAC.
Sources
- PACE ocean color: https://pace.oceansciences.org/oci.htm
- NOAA HAB Operational Forecast (US): https://oceanservice.noaa.gov/hazards/hab/
- OceanColor processing: https://oceancolor.gsfc.nasa.gov/
⚲ How a scientist answers this
Parameters
Near-surface chlorophyll-a concentration (mg/m3) from PACE OCI L2/L3 (hyperspectral, 2024+) and MODIS Aqua (2002+, for the long climatology), plus PACE phytoplankton-functional-type and CDOM absorption products to separate cyanobacteria from diatoms and flag runoff. A bloom is flagged where chlorophyll exceeds a high percentile of the local climatology (or a regional threshold such as >~10 mg/m3 in coastal waters).
Method
Build a per-pixel climatology of chlorophyll for each calendar period from the MODIS-Aqua record, then express the current scene as a standardized anomaly (z-score) or percent-of-normal; map contiguous high-anomaly pixels as bloom extent, track day-to-day persistence, and use PACE functional-type/CDOM bands to discriminate the dominant phytoplankton group.
Validation
Cross-check PACE against the overlapping MODIS/VIIRS record and confirm blooms against in-situ samples or shellfish-monitoring programs, since satellite chlorophyll is uncertain in turbid, CDOM-rich, or shallow coastal water and cannot measure toxin levels or sub-surface layers.
In plain EnglishMeasure how green the surface water is from space, compare it to the normal seasonal greenness for that spot, and flag unusually high values as a possible bloom — confirming the actual species and toxicity needs water samples.
Make it yours → Change the coastal bounding box, the season/months, and the chlorophyll anomaly threshold, and swap MODIS for PACE to gain phytoplankton-type detail.
⌨ Run the core method · no login
The detection / counting above a threshold 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).