How fast is sea level rising at my stretch of coast, and who is exposed?
Draw a rectangle, then check which collections cover it. Most NASA data is global, so a big box matches a lot.
-74.3, 40.4 → -73.7, 40.9 (New York / New Jersey coast, USA)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.
- Pick your coast. A small latitude/longitude box around it, and the years you care about.
- One number per snapshot. Average the
SLAinside your box for each 5-day map. That gives a time series of how high the sea sat over your coast. - 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.
- (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
SLAfield, in meters relative to the 20-year mean, refreshed every 5 days. - Your local rate of rise. Fit a straight line through years of
SLAand 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
SLAvalue 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
% 360before 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.
SLAis 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, variableSLA, 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 meanSLAof -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), variableSLA, 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
SLAover the New York / New Jersey box (40.4–40.9 °N) = -0.071 m.
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.
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.