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)

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

📚 Problem Finder KB

Not yet tracked in the KB.