q31·advanced

How fast is sea level rising at my stretch of coast, and who is exposed?

oceanclimatecoastalpublic-health Datasets: 3 30–60 min

Sea level anomaly is just "how high is the sea right now, compared to its own long-term average?" A satellite flying overhead bounces radar off the water and measures the height of the sea surface to within centimeters. The ocean doesn't rise at the same speed everywhere. Winds, currents, and warm water all tilt the surface, so the rate at your harbor can differ from the global average. You can measure your own coast from orbit.

How fast is sea level rising at my stretch of coast, and who is exposed?

Sea level anomaly is just “how high is the sea right now, compared to its own long-term average?” A satellite flying overhead bounces radar off the water and measures the height of the sea surface to within centimeters. The ocean doesn’t rise at the same speed everywhere. Winds, currents, and warm water all tilt the surface, so the rate at your harbor can differ from the global average. You can measure your own coast from orbit.

Which data to use, and how

Use this dataset: MEaSUREs gridded sea level anomaly (short name SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205). It stitches decades of satellite radar measurements into one tidy map: a value every ~18 km (a 1/6° grid), a fresh snapshot every 5 days, back to the early 1990s. The value you want is called SLA (sea level anomaly), the sea-surface height in meters, relative to its 20-year average.

Then do four steps. The runnable code further down does all of this; this is just the idea.

  1. Pick your coast. A small latitude/longitude box around it, and the years you care about.
  2. One number per snapshot. Average the SLA inside your box for each 5-day map. That gives a time series of how high the sea sat over your coast.
  3. Fit a straight line. Draw the long-term trend through those years. The slope of that line is your local rate of rise, in millimeters per year. Up means the sea is climbing, flat means steady.
  4. (Optional) Find who’s exposed. Overlay a 30 m elevation map and a population grid to count how many people live on low-lying land near the water.

That’s the whole method. Below, “How a scientist answers this” names the exact tools, and the Run it cell does it live on synthetic data so you can see each step work.

What you can find out

  • How high the sea sits over your coast right now, and back to the early 1990s. The SLA field, in meters relative to the 20-year mean, refreshed every 5 days.
  • Your local rate of rise. Fit a straight line through years of SLA and read the slope in mm/year. Coastal rates often differ from the global ~3.4 mm/year average.
  • The seasonal cycle and year-to-year swings. Winters and El Niño years (a recurring Pacific warm spell) ride higher or lower than the trend line.
  • Who sits low enough to care. Overlay Copernicus DEM (GLO-30) to find land below a chosen elevation, then count people there with WorldPop’s 1 km grid (both free, no login).
  • A first-pass exposure tally. Population living below, say, 2 m elevation inside your box, as a screening number to flag where deeper study is worth it.

What it can’t tell you

  • Actual flood risk for a given street. The SLA value is open-ocean sea level on a coarse ~18 km grid. It can’t see harbors, tidal creeks, or storm surge, which are the things that actually flood streets.
  • Whether your land is sinking. Many coasts subside (sink) from groundwater pumping or settling sediment. The rise people feel is sea-going-up plus land-going-down. For that you need tide gauges or land-motion data (GPS/InSAR) added in.
  • Tides and storm surge. This product is de-tided and averaged over 5 days, so it deliberately smooths away the brief high-water events that do the flooding.
  • Block-by-block detail. A 1 km population grid and a 30 m elevation map give screening estimates, not parcel-level counts. Buildings, sea walls, and floodgates aren’t in the data.
  • The future. A fitted line describes the past, not a forecast. Projecting ahead needs climate-model sea-level scenarios, a different kind of product.

Gotchas to watch for

  • Longitudes run 0–360, not -180 to 180. This grid numbers the globe from 0° going east all the way around to 360°, so a western longitude like -74° is stored as 286°. If you slice your box with the negative number you’ll get empty water. The fix: wrap your west/east edges with % 360 before slicing (the code below does it).
  • A 5-day map is a snapshot, not a trend. Any single granule is one moment, and it can read high or low for seasonal reasons. To get a rate, you must fit a line through many years. One map alone tells you almost nothing about the long-term direction.
  • It’s open-ocean sea level, not your harbor. The ~18 km grid measures the sea offshore. Treat it as “the regional water level my coast sits in,” not the water lapping a specific dock.
  • Values are relative, and can be negative. SLA is height compared to the long-term average, so a negative number (e.g. -0.07 m) just means the sea was below its own average that day. It doesn’t mean the sea vanished.

The real-data code

The Run it cell above runs the method on synthetic data with no login. Below is the whole recipe against the real archive: search, open each 5-day map, average SLA over your box, fit the local rate of rise in mm/year, and plot it. It needs a free Earthdata Login.

Verified locally. SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205, variable SLA, is a global 5-day NetCDF on a 1/6° grid. Longitudes run 0–360, so convert your western longitudes before slicing. Values are in meters relative to the long-term mean. For the New York / New Jersey coast (40.4–40.9 °N), the granule centered 3 Jan 2015 read a mean SLA of -0.071 m (about 7 cm below the multi-year mean) over the box, a single winter snapshot.

import warnings, earthaccess, xarray as xr, numpy as np
import matplotlib.pyplot as plt
warnings.filterwarnings("ignore")   # hush earthaccess FutureWarnings

earthaccess.login(strategy="netrc")   # free Earthdata Login

SN = "SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205"
W, S, E, N = -74.3, 40.4, -73.7, 40.9       # your coast (New York / New Jersey)
Wp, Ep = W % 360, E % 360                     # grid longitudes run 0-360, so wrap the box

# 1. Search every 5-day map over the altimetry era for this stretch of coast.
grans = earthaccess.search_data(
    short_name=SN, bounding_box=(W, S, E, N),
    temporal=("1993-01-01", "2023-12-31"))

# 2. One number per snapshot: open each NetCDF map, slice the box (0-360 lons),
#    and area-average the SLA field. Carry the granule's own timestamp along.
times, sla_box = [], []
for fh in earthaccess.open(grans):
    ds = xr.open_dataset(fh, engine="h5netcdf")
    sla = ds["SLA"].sel(Longitude=slice(min(Wp, Ep), max(Wp, Ep)),
                        Latitude=slice(S, N))
    m = float(sla.mean(skipna=True))
    if not np.isnan(m):
        times.append(np.datetime64(ds["Time"].values[0]))
        sla_box.append(m)
times, sla_box = np.array(times), np.array(sla_box)

# 3. Fit a straight line through the years. Its slope is the local rate of rise:
#    convert decimal years -> meters/year -> mm/year.
t_years = (times - np.datetime64("1993-01-01")) / np.timedelta64(365, "D") + 1993.0
slope, intercept = np.polyfit(t_years, sla_box, 1)
rate_mm = slope * 1000
print(f"Local sea-level trend: {rate_mm:+.1f} mm/year "
      f"(vs ~3.4 mm/yr global) over {t_years[0]:.0f}-{t_years[-1]:.0f}")

# 4. Plot the 5-day SLA series and the fitted trend line.
plt.plot(t_years, sla_box, lw=0.6, alpha=0.6, label="SLA (5-day)")
plt.plot(t_years, slope * t_years + intercept, "r", lw=2,
         label=f"trend {rate_mm:+.1f} mm/yr")
plt.axhline(0, ls="--", c="k", lw=0.5)
plt.ylabel("sea level anomaly (m)"); plt.xlabel("year")
plt.legend(); plt.tight_layout(); plt.show()

# Before you trust it: cross-check the slope against a NOAA tide gauge at this coast
# (e.g. The Battery, NYC) — and recall this is open-ocean SLA, not land subsidence
# or the harbor water that actually floods streets (see the gotchas above).

Where the data comes from

The sea-level maps come from NASA through one free login (Earthdata Login): the MEaSUREs gridded sea level anomaly product lives at the PO.DAAC archive (NASA’s ocean-data center) and arrives as NetCDF files. The two exposure layers are separate and free with no login at all — Copernicus DEM (GLO-30) supplies the 30 m elevation, and WorldPop supplies the 1 km population grid. You combine all three locally on your own machine.

Sources

  • MEaSUREs gridded sea level anomaly (SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205), variable SLA, global 5-day NetCDF on a 1/6° grid; longitudes 0–360, meters relative to the long-term mean.
  • Verified locally: granule centered 3 Jan 2015, mean SLA over the New York / New Jersey box (40.4–40.9 °N) = -0.071 m.
How a scientist answers this
Parameters
Gridded sea level anomaly (`SLA`, meters relative to the ~20-year mean) from MEaSUREs satellite altimetry (SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205, 1/6°, every 5 days, early-1990s–), with Copernicus DEM GLO-30 elevation and WorldPop 1 km population to map who sits low. The global mean rate is ~3.4 mm/yr; local rates differ.
Method
Area-average `SLA` over the coastal box into a time series, optionally deseasonalize, and fit a robust linear trend (Theil–Sen slope with Mann–Kendall significance) to read the local rise in mm/yr; intersect a sea-level scenario with the DEM to delineate low-lying land and overlay WorldPop to count exposed population.
Validation
Cross-check the altimetry rate against the nearest tide-gauge record (e.g. PSMSL/NOAA), state that altimetry measures absolute sea surface while gauges include vertical land motion, and confirm the SLA baseline period; flag short records as noisy for trend estimation.
In plain EnglishWatch the sea-surface height over your coast for decades, fit a line to get the rise in millimeters per year, then drape it over an elevation map and population grid to see who's in the path.

Make it yours → Set the coastal box, the trend years, and the flood-elevation scenario in the notebook; swap the population or elevation layer as needed.

🧪 Virtual Mock Lab stand-in data · runs in your browser · no login

A safe place to practise the method on SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205. The code is the real earthaccess workflow, but we feed it stand-in data shaped like the real product — so you can run it, change the numbers, and break it without an account. When you want the real data, use the recipe under “The real-data code” above, or download the notebook below.

editable · runs in your browser
Recipe ready · not yet run The recipe and the Virtual Mock Lab above are ready to use. We haven't yet run this question end-to-end on real data, so it has no verified answer yet — only the questions we've actually computed carry one. That's the honest line between a method and a result.