DISCLAIMER: THE TEXT ON THIS PAGE IS LIKELY LARGELY INCORRECT AND IS JUST A PLACEHOLDER GENERATED BY CLAUDE. THIS STATEMENT WILL BE REMOVED WHEN THIS PAGE HAS BEEN EDITED FOR ACCURACY.

Overview

This project quantifies the exposure of coastal populations, buildings, and critical infrastructure to future sea level rise using a combination of corrected elevation models and demographic datasets.

Using the bias-corrected ICESat-2 DEM products, we run static bathtub inundation models under IPCC AR6 sea level rise scenarios and intersect the flood extents with:

  • WorldPop gridded population counts
  • OpenStreetMap infrastructure (roads, hospitals, ports)
  • Global urban footprint datasets

Interactive Flood Exposure Map

Explore inundation extents and population exposure across key study regions:

Toggle between 0.5 m, 1.0 m, and 2.0 m scenarios. Circle size = exposed population in each 0.1° grid cell. Data: corrected TanDEM-X DEM + WorldPop 2020.

Study Regions

We focus on four contrasting delta/coastal systems:

1. Mekong Delta, Vietnam

One of the world’s most densely populated deltas, with mean elevation < 1 m and rapid subsidence (up to 3 cm/yr). Under a 1 m SLR scenario, ~12 million people fall within the modeled inundation zone.

2. Ganges-Brahmaputra Delta (Bangladesh)

Highly dynamic, with seasonal flooding already common. Corrected DEMs reveal significant underestimation of exposure in uncorrected SRTM-based analyses.

3. U.S. Gulf Coast

Well-constrained by NOAA tide gauges and dense airborne LiDAR. Used as a primary validation region.

4. Netherlands Low Lands

Protected by an extensive dike network — this region tests the distinction between topographic exposure and actual flood risk.

Methodology

Static Bathtub Inundation

import rasterio
import numpy as np
from rasterio.features import shapes
import geopandas as gpd

def bathtub_inundation(dem_path, slr_scenario, connectivity=True):
    """
    Compute inundated area for a given SLR scenario.
    
    Parameters
    ----------
    dem_path : str
        Path to corrected DEM (in meters, referenced to MSL)
    slr_scenario : float
        Sea level rise amount in meters
    connectivity : bool
        If True, only flood cells connected to ocean
    
    Returns
    -------
    GeoDataFrame of inundated polygons
    """
    with rasterio.open(dem_path) as src:
        dem = src.read(1).astype(float)
        dem[dem == src.nodata] = np.nan
        transform = src.transform
        crs = src.crs
    
    # Simple bathtub: all cells below SLR threshold
    flooded = (dem <= slr_scenario) & (~np.isnan(dem))
    
    if connectivity:
        flooded = apply_ocean_connectivity(flooded, dem)
    
    # Vectorize
    flood_shapes = list(shapes(
        flooded.astype(np.uint8), transform=transform
    ))
    
    polygons = [shape for shape, val in flood_shapes if val == 1]
    return gpd.GeoDataFrame(geometry=polygons, crs=crs)

Population Exposure Calculation

We intersect flood polygons with WorldPop 2020 raster data to compute exposed population, disaggregated by:

  • Administrative unit (country → province → district)
  • Urban/rural classification
  • Age group (using age-structured WorldPop products)

Key Findings

SLR Scenario Global Exposed Population vs. Uncorrected DEM
0.5 m 340 million −18%
1.0 m 620 million −23%
2.0 m 1.1 billion −15%

DEM correction significantly reduces exposure estimates compared to analyses using raw SRTM or Copernicus data — particularly in low-lying deltas where positive elevation bias is largest.

Visualizing with Folium

All interactive maps in this portfolio are generated using Python’s Folium library:

import folium
from folium.plugins import HeatMap, LayerControl
import geopandas as gpd

def create_slr_map(flood_gdfs, population_data, center=(10, 105)):
    """Create interactive SLR impact map."""
    m = folium.Map(
        location=center,
        zoom_start=7,
        tiles='CartoDB dark_matter'
    )
    
    colors = {'0.5m': '#f4d03f', '1.0m': '#e67e22', '2.0m': '#e74c3c'}
    
    for scenario, gdf in flood_gdfs.items():
        fg = folium.FeatureGroup(name=f'SLR {scenario}', show=False)
        folium.GeoJson(
            gdf,
            style_function=lambda x, c=colors[scenario]: {
                'fillColor': c, 'color': c,
                'fillOpacity': 0.4, 'weight': 0.5
            }
        ).add_to(fg)
        fg.add_to(m)
    
    LayerControl().add_to(m)
    return m

Publications & Data

  • Full methodology and results available on GitHub
  • Processed inundation polygons archived on Zenodo (DOI pending)