-
-
Latest available, Burnaby, BC: Low flood impact (0.7 km² of new water); the normal 11.3 km route stays safe with no detour.
-
Latest available view of Manila: an Oct 3, 2026 Sentinel-2 pass turned into a water map, flagged roads and a flood-aware route.
-
Search a place and date: SatRelief found a cloud-free Sentinel-2 image taken the same day, Sep 10, 2023, over flooded Larissa.
-
Abbotsford, BC flood (Nov 21, 2021): 27.6 km² of new water on Sumas Prairie, 143 flooded roads, rerouted 15.1 km (+4.2 km).
-
Emilia-Romagna floods, Conselice, Italy (May 23, 2023): Severe impact, 127 flooded roads, safe route found with a 7.5 km detour.
Inspiration
In a flood, the road that was safe yesterday can be underwater today, and navigation apps don't know. Meanwhile, free satellite archives show exactly where the water is, but almost nobody turns that data into decisions. We built SatRelief to connect the two: satellite observations in, flood-aware evacuation routes out.
What it does
SatRelief finds flooded roads from satellite imagery and routes around them, for any location and date covered by Sentinel-2 (2015 onwards).
- Two modes: Historical explores a past flood on a chosen date (using the nearest cloud-free image); Latest available uses the most recent usable satellite pass. Search any place, or use your browser location.
- Satellite flood detection: finds the clearest Sentinel-2 image for your area, computes the MNDWI water index, masks clouds and snow, and compares against a dry-weather baseline image, so only new water counts and rivers don't block bridges.
- Flooded roads → safe route: flood areas are overlaid on OpenStreetMap roads, flooded segments are removed from the road graph, and A* finds the safest remaining route. If none exists, it says so.
- Honest results: every view shows the real satellite acquisition date and time and a flood impact rating (None / Low / Moderate / Severe) based on the area of new water.
- Interactive map: flood extent, flooded roads, original vs. safe route, distance and detour, a step-by-step Run analysis walkthrough, and the actual Sentinel-2 image from the flood date.
Sentinel-2 image → MNDWI water index → flood polygons → flooded roads → graph update → A* safe route
How we built it
- Satellite data: Copernicus Sentinel-2 Level-2A, searched through the Earth Search STAC catalogue on AWS Open Data. It's free, with no account needed. We read only the area of interest from Cloud-Optimized GeoTIFFs with
pystac-clientandrasterio. - Flood detection: bands B03 (green, 10 m) and B11 (short-wave infrared, 20 m) are aligned onto one grid, then
$$ \text{MNDWI} = \frac{\text{Green} - \text{SWIR}}{\text{Green} + \text{SWIR}} $$
Water reflects green light but absorbs SWIR, so water pixels have \( \text{MNDWI} > 0 \). ESA's scene classification layer removes clouds, shadows and snow, and pixels that were already water in a dry-weather image are excluded.
- GIS:
rasterio.features.shapesvectorises the flood mask; Shapely and GeoPandas clean, merge and simplify it in a metric projection (UTM); the result is exported as EPSG:4326 GeoJSON. - Routing: OSMnx downloads and caches OpenStreetMap road networks; GeoPandas finds the roads intersecting the flood; NetworkX A* uses a great-circle heuristic and edge costs
$$ c(e) = \begin{cases} \text{length}(e) & \text{if } e \text{ is dry} \\ 10^{9} & \text{if } e \text{ is flooded} \end{cases} $$
plus a final check that rejects any route through a flooded road.
- Backend: FastAPI with background jobs for new areas (about 15–60 s, then cached and instant), and place search via OpenStreetMap Nominatim.
- Frontend: Next.js and React with MapLibre GL JS.
- Testing: 75 automated backend tests, plus an end-to-end smoke test that runs a live satellite analysis.
Challenges we ran into
- Clouds: the official cloud percentage covers a whole 110 km satellite tile. For Abbotsford it rated the key flood image 87% cloudy, while our area was 85% clear. We score cloud cover over the user's area instead.
- Rivers vs. floods: MNDWI flags all water, so permanent rivers blocked every bridge. Comparing with a dry-weather image fixed it. We also discovered that snow looks like water and masked it out.
- Coordinate systems: aligning 10 m and 20 m bands, measuring areas in metres (never degrees), and keeping GeoJSON's
[longitude, latitude]order straight. - Honesty in the UI: a requested date rarely has its own image, so we always show both the requested date and the real acquisition date.
Accomplishments that we're proud of
- A fully automated chain from a satellite archive to a route, for any place: search "Larissa, Greece", 2023-09-10, and SatRelief finds Storm Daniel's floodwater and reroutes around 814 flooded roads.
- Real-world validation: for the Abbotsford, BC 2021 flood it detects 27.6 km² of new water, flags the Trans-Canada Highway as flooded (it really was closed), and reroutes with a 4.2 km detour.
- The examples and cached areas run offline, so the demo doesn't depend on Wi-Fi.
What we learned
How multispectral indices actually find water, why cloud cover has to be measured locally, how much work coordinate systems hide, and that being explicit about data limits (satellite images are snapshots, not a live feed) makes a tool more trustworthy.
What's next for SatRelief
- Sentinel-1 radar for flood detection through clouds and at night.
- Elevation models and river forecasts to estimate which roads may flood next.
- Lower-latency imagery, including small satellites like ALEASAT, so routes refresh as new passes arrive.
- Voice alerts for drivers and a lightweight responder app.
- Exportable flood maps (GeoJSON) and an open API for municipalities and humanitarian groups, in support of UN SDGs 11.5, 13.1 and 17.
Built with
Python · FastAPI · rasterio · NumPy · GeoPandas · Shapely · pyproj · pystac-client · OSMnx · NetworkX · Next.js · React · TypeScript · MapLibre GL JS · Copernicus Sentinel-2 · OpenStreetMap
Source: github.com/AJAA20/StormHacks-2026. Contains modified Copernicus Sentinel data. Road data © OpenStreetMap contributors.
Built With
- copernicus
- css3
- dosis
- elevenlabs
- eslint
- fastapi
- geopandas
- gps
- maplibre
- matplotlib
- next.js
- node.js
- numpy
- openstreetmap
- pydantic
- python
- rasterio
- react
- typescript
- uvicorn
Log in or sign up for Devpost to join the conversation.