Overview
Modelled riverine flood inundation along the global river network for seven return periods, 10 to 500 years, at 3 arc-seconds (~90 m), from the European Commission Joint Research Centre (JRC) for the Copernicus Emergency Management Service (CEMS). River flows come from the LISFLOOD hydrological model driven by the Global Flood Awareness System (GloFAS) v4.0 reanalysis; inundation is simulated with the LISFLOOD-FP hydraulic model. Each return period has a water-depth map in metres and a hazard map of four depth classes plus not flooded, with two auxiliary masks: permanent water bodies used to patch the maps, and spurious depths where the model is known to over-predict. Source Cooperative serves the maps as cloud-optimized GeoTIFF tiles, and the Hub publishes GDAL virtual raster (VRT) mosaics with one band per return period and STAC GeoParquet indexes that open those tiles in place.
Important note
Static modelled hazard with no temporal coverage; only land is covered. Very high depths can be artefacts of the hydraulic model, the 90 m resolution, sinks in the elevation model or tile boundaries, and the spurious-depths mask flags only the known cases. The VRTs reference the tiles over HTTPS with GDAL's /vsicurl, so open them with GDAL-based tools (rasterio, terra) rather than downloading the .vrt alone, and read a window or a few tiles at a time: every read touches Source Cooperative directly, so visualising or reading the whole mosaic issues thousands of requests and is very slow.
Quick start
import rioxarray
url = "https://digital-atlas.s3.amazonaws.com/domain=climate/type=flood/source=jrc-glofas/region=east-africa/processing=return-period/variable=flood-depth/rp=10/flood-depth_rp10.tif"
da = rioxarray.open_rasterio(url, masked=True)library(terra)
url <- "/vsicurl/https://digital-atlas.s3.amazonaws.com/domain=climate/type=flood/source=jrc-glofas/region=east-africa/processing=return-period/variable=flood-depth/rp=10/flood-depth_rp10.tif"
r <- rast(url)Intended uses
- flood-prone baseline by magnitude for exposure and risk assessment
- population, cropland and infrastructure exposure to river flooding at a given return period
- modelled counterpart to observed flood extents from satellite monitoring
Not recommended for
Why: static return-period hazard from a historical reanalysis, with no dates or scenarios.
Use instead: satellite flood extent products, such as Copernicus Global Flood Monitoring, for what actually flooded and when.
Why: only riverine inundation along the modelled river network is simulated.
Why: known model over-prediction in small channels.
Use instead: treat masked cells as flood-prone with unknown depth, or use the hazard class.
Access & use
Files, endpoints, and worked examples for each distribution.
Data
Flood depth tiles, one Source Cooperative collection per return period (depth-rp10 ... depth-rp500). Open the VRT for a single seven-band mosaic, bands in return-period order and described rp10 to rp500, or a GeoParquet file to list and query the tiles of one return period.
Format: Cloud-Optimized GeoTIFF — best for single-file downloads, visualisation, and traditional GIS tools
File indexes
GDAL VRThttps://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/depth.vrt
Seven bands, rp10 to rp500; tile paths are HTTPS (/vsicurl)
Usage examples
import rioxarray
# The VRT opens as one raster; its tiles are read on demand
da = rioxarray.open_rasterio("https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/depth.vrt", masked=True)library(terra)
# The VRT opens as one raster; its tiles are read on demand
r <- rast("/vsicurl/https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/depth.vrt")# The VRT opens as one raster; its tiles are read on demand
gdalinfo /vsicurl/https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/depth.vrtGDAL VRThttps://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/depth-rp{return_period}.vrt7 files
One single-band VRT per return period, the band sources of depth.vrt
List of files 7 filesDownload CSV
Individual file
https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/depth-rp10.vrt
Usage examples
import rioxarray
# The VRT opens as one raster; its tiles are read on demand
da = rioxarray.open_rasterio("https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/depth-rp10.vrt", masked=True)library(terra)
# The VRT opens as one raster; its tiles are read on demand
r <- rast("/vsicurl/https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/depth-rp10.vrt")# The VRT opens as one raster; its tiles are read on demand
gdalinfo /vsicurl/https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/depth-rp10.vrtSTAC-GeoParquethttps://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/depth-rp{return_period}.parquet7 files
One STAC GeoParquet per return period, listing that period's tiles
List of files 7 filesDownload CSV
Individual file
https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/depth-rp10.parquet
Usage examples
import rioxarray
import rustac
url = "https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/depth-rp10.parquet"
# As STAC items: search reads only the rows that match (area, time, ids…)
items = rustac.search_sync(url, bbox=[28, -12, 52, 18])
# ...or every item, as a FeatureCollection: rustac.read_sync(url)
# As one mosaic through GDAL's tile index driver (GDAL 3.10+). If items have
# several assets, pick one: open_rasterio(..., LOCATION_FIELD="assets.<key>.href")
da = rioxarray.open_rasterio(f"GTI:/vsicurl/{url}", masked=True)library(duckdb)
library(terra)
url <- "https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/depth-rp10.parquet"
# As STAC: one row per item, with its assets and properties
con <- dbConnect(duckdb())
items <- dbGetQuery(con, sprintf("SELECT id, datetime, assets FROM read_parquet('%s')", url))
# As one mosaic through GDAL's tile index driver (GDAL 3.10+). If items have
# several assets, pick one: rast(..., opts = "LOCATION_FIELD=assets.<key>.href")
r <- rast(paste0("GTI:/vsicurl/", url))# As STAC items (pip install rustac): search reads only the rows that match
rustac search "https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/depth-rp10.parquet" --bbox=28,-12,52,18 items.json
# ...or every item: rustac translate "https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/depth-rp10.parquet" items.json
# As one mosaic through GDAL's tile index driver (GDAL 3.10+). If items have
# several assets, add: -oo LOCATION_FIELD=assets.<key>.href
gdalinfo "GTI:/vsicurl/https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/depth-rp10.parquet"Other access methods
Kenya-window crop of the depth maps, one COG per return period on Adaptation Atlas storage. Same values as the global tiles; use it when only that window is needed.
Format: Cloud-Optimized GeoTIFF — best for single-file downloads, visualisation, and traditional GIS tools
Coverage: Kenya · [33.9, -4.7, 41.9, 5.5]
List of files 7 filesDownload CSV
Individual file
https://digital-atlas.s3.amazonaws.com/domain=climate/type=flood/source=jrc-glofas/region=east-africa/processing=return-period/variable=flood-depth/rp=10/flood-depth_rp10.tif
Usage examples
import rioxarray
url = "https://digital-atlas.s3.amazonaws.com/domain=climate/type=flood/source=jrc-glofas/region=east-africa/processing=return-period/variable=flood-depth/rp=10/flood-depth_rp10.tif"
da = rioxarray.open_rasterio(url, masked=True)
# Clip a window (East Africa)
window = da.rio.clip_box(
minx=28, miny=-12, maxx=52, maxy=18
)
# ...or sample a single point
point = da.sel(x=36.8, y=-1.3, method="nearest")library(terra)
url <- "/vsicurl/https://digital-atlas.s3.amazonaws.com/domain=climate/type=flood/source=jrc-glofas/region=east-africa/processing=return-period/variable=flood-depth/rp=10/flood-depth_rp10.tif"
r <- rast(url)
# Clip a window (East Africa)
window <- crop(r, ext(28, 52, -12, 18))
# ...or sample a single point
point <- extract(r, cbind(36.8, -1.3))Other access methods
File pattern: rp={return_period}/flood-depth_rp{return_period}.tif
Hazard class tiles, one collection per return period (hazard-rp10 ... hazard-rp500). Same layout as depth: the VRT holds seven bands in return-period order, described rp10 to rp500.
Format: Cloud-Optimized GeoTIFF — best for single-file downloads, visualisation, and traditional GIS tools
File indexes
GDAL VRThttps://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/hazard.vrt
Seven bands, rp10 to rp500; tile paths are HTTPS (/vsicurl)
Usage examples
import rioxarray
# The VRT opens as one raster; its tiles are read on demand
da = rioxarray.open_rasterio("https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/hazard.vrt", masked=True)library(terra)
# The VRT opens as one raster; its tiles are read on demand
r <- rast("/vsicurl/https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/hazard.vrt")# The VRT opens as one raster; its tiles are read on demand
gdalinfo /vsicurl/https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/hazard.vrtGDAL VRThttps://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/hazard-rp{return_period}.vrt7 files
One single-band VRT per return period, the band sources of hazard.vrt
List of files 7 filesDownload CSV
Individual file
https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/hazard-rp10.vrt
Usage examples
import rioxarray
# The VRT opens as one raster; its tiles are read on demand
da = rioxarray.open_rasterio("https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/hazard-rp10.vrt", masked=True)library(terra)
# The VRT opens as one raster; its tiles are read on demand
r <- rast("/vsicurl/https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/hazard-rp10.vrt")# The VRT opens as one raster; its tiles are read on demand
gdalinfo /vsicurl/https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/hazard-rp10.vrtSTAC-GeoParquethttps://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/hazard-rp{return_period}.parquet7 files
One STAC GeoParquet per return period, listing that period's tiles
List of files 7 filesDownload CSV
Individual file
https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/hazard-rp10.parquet
Usage examples
import rioxarray
import rustac
url = "https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/hazard-rp10.parquet"
# As STAC items: search reads only the rows that match (area, time, ids…)
items = rustac.search_sync(url, bbox=[28, -12, 52, 18])
# ...or every item, as a FeatureCollection: rustac.read_sync(url)
# As one mosaic through GDAL's tile index driver (GDAL 3.10+). If items have
# several assets, pick one: open_rasterio(..., LOCATION_FIELD="assets.<key>.href")
da = rioxarray.open_rasterio(f"GTI:/vsicurl/{url}", masked=True)library(duckdb)
library(terra)
url <- "https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/hazard-rp10.parquet"
# As STAC: one row per item, with its assets and properties
con <- dbConnect(duckdb())
items <- dbGetQuery(con, sprintf("SELECT id, datetime, assets FROM read_parquet('%s')", url))
# As one mosaic through GDAL's tile index driver (GDAL 3.10+). If items have
# several assets, pick one: rast(..., opts = "LOCATION_FIELD=assets.<key>.href")
r <- rast(paste0("GTI:/vsicurl/", url))# As STAC items (pip install rustac): search reads only the rows that match
rustac search "https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/hazard-rp10.parquet" --bbox=28,-12,52,18 items.json
# ...or every item: rustac translate "https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/hazard-rp10.parquet" items.json
# As one mosaic through GDAL's tile index driver (GDAL 3.10+). If items have
# several assets, add: -oo LOCATION_FIELD=assets.<key>.href
gdalinfo "GTI:/vsicurl/https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/hazard-rp10.parquet"Other access methods
Permanent water body mask tiles, one collection.
Format: Cloud-Optimized GeoTIFF — best for single-file downloads, visualisation, and traditional GIS tools
File indexes
GDAL VRThttps://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/permanent-water.vrt
Usage examples
import rioxarray
# The VRT opens as one raster; its tiles are read on demand
da = rioxarray.open_rasterio("https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/permanent-water.vrt", masked=True)library(terra)
# The VRT opens as one raster; its tiles are read on demand
r <- rast("/vsicurl/https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/permanent-water.vrt")# The VRT opens as one raster; its tiles are read on demand
gdalinfo /vsicurl/https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/permanent-water.vrtSTAC-GeoParquethttps://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/permanent-water.parquet
Usage examples
import rioxarray
import rustac
url = "https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/permanent-water.parquet"
# As STAC items: search reads only the rows that match (area, time, ids…)
items = rustac.search_sync(url, bbox=[28, -12, 52, 18])
# ...or every item, as a FeatureCollection: rustac.read_sync(url)
# As one mosaic through GDAL's tile index driver (GDAL 3.10+). If items have
# several assets, pick one: open_rasterio(..., LOCATION_FIELD="assets.<key>.href")
da = rioxarray.open_rasterio(f"GTI:/vsicurl/{url}", masked=True)library(duckdb)
library(terra)
url <- "https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/permanent-water.parquet"
# As STAC: one row per item, with its assets and properties
con <- dbConnect(duckdb())
items <- dbGetQuery(con, sprintf("SELECT id, datetime, assets FROM read_parquet('%s')", url))
# As one mosaic through GDAL's tile index driver (GDAL 3.10+). If items have
# several assets, pick one: rast(..., opts = "LOCATION_FIELD=assets.<key>.href")
r <- rast(paste0("GTI:/vsicurl/", url))# As STAC items (pip install rustac): search reads only the rows that match
rustac search "https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/permanent-water.parquet" --bbox=28,-12,52,18 items.json
# ...or every item: rustac translate "https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/permanent-water.parquet" items.json
# As one mosaic through GDAL's tile index driver (GDAL 3.10+). If items have
# several assets, add: -oo LOCATION_FIELD=assets.<key>.href
gdalinfo "GTI:/vsicurl/https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/permanent-water.parquet"Other access methods
Spurious depth mask tiles, one collection.
Format: Cloud-Optimized GeoTIFF — best for single-file downloads, visualisation, and traditional GIS tools
File indexes
GDAL VRThttps://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/spurious-depths.vrt
Usage examples
import rioxarray
# The VRT opens as one raster; its tiles are read on demand
da = rioxarray.open_rasterio("https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/spurious-depths.vrt", masked=True)library(terra)
# The VRT opens as one raster; its tiles are read on demand
r <- rast("/vsicurl/https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/spurious-depths.vrt")# The VRT opens as one raster; its tiles are read on demand
gdalinfo /vsicurl/https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/spurious-depths.vrtSTAC-GeoParquethttps://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/spurious-depths.parquet
Usage examples
import rioxarray
import rustac
url = "https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/spurious-depths.parquet"
# As STAC items: search reads only the rows that match (area, time, ids…)
items = rustac.search_sync(url, bbox=[28, -12, 52, 18])
# ...or every item, as a FeatureCollection: rustac.read_sync(url)
# As one mosaic through GDAL's tile index driver (GDAL 3.10+). If items have
# several assets, pick one: open_rasterio(..., LOCATION_FIELD="assets.<key>.href")
da = rioxarray.open_rasterio(f"GTI:/vsicurl/{url}", masked=True)library(duckdb)
library(terra)
url <- "https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/spurious-depths.parquet"
# As STAC: one row per item, with its assets and properties
con <- dbConnect(duckdb())
items <- dbGetQuery(con, sprintf("SELECT id, datetime, assets FROM read_parquet('%s')", url))
# As one mosaic through GDAL's tile index driver (GDAL 3.10+). If items have
# several assets, pick one: rast(..., opts = "LOCATION_FIELD=assets.<key>.href")
r <- rast(paste0("GTI:/vsicurl/", url))# As STAC items (pip install rustac): search reads only the rows that match
rustac search "https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/spurious-depths.parquet" --bbox=28,-12,52,18 items.json
# ...or every item: rustac translate "https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/spurious-depths.parquet" items.json
# As one mosaic through GDAL's tile index driver (GDAL 3.10+). If items have
# several assets, add: -oo LOCATION_FIELD=assets.<key>.href
gdalinfo "GTI:/vsicurl/https://digital-atlas.s3.amazonaws.com/cdh/data/jrc-glofas-v2.1.2/spurious-depths.parquet"Other access methods
Data dictionary
What each file holds. A layout describes how the data is stored in a file: its variables, the dimensions they vary over, and any keys.
File layouts
| Files | Format | Variables | Dimensions | No data |
|---|---|---|---|---|
| depth | Cloud-Optimized GeoTIFF | depth | cell × return_period | -9999 |
| depth-east-africa | Cloud-Optimized GeoTIFF | depth | cell × return_period | NaN |
| hazard | Cloud-Optimized GeoTIFF | hazard | cell × return_period | 255 |
| permanent-water | Cloud-Optimized GeoTIFF | permanent_water | cell | 255 |
| spurious-depths | Cloud-Optimized GeoTIFF | spurious_depths | cell | 255 |
In every file
Dimensions
3 arc-seconds (~90 m at the equator).
Grid spacing: 0.000833333 degree
Only in depth
Variables
| Variable | Type | Unit | Description |
|---|---|---|---|
| depth | float32 | m | Modelled flood water depth. 0 means not flooded at that return period. |
Dimensions
Flood recurrence interval in years.
Unit: year
10205075100200500
Only in depth-east-africa
Variables
| Variable | Type | Unit | Description |
|---|---|---|---|
| depth | float32 | m | Modelled flood water depth. 0 means not flooded at that return period. |
Dimensions
Flood recurrence interval in years.
Unit: year
10205075100200500
Only in hazard
Variables
| Variable | Type | Description |
|---|---|---|
| hazard | uint8 | Water depth class, consistent with the GloFAS "Flood hazard 100-year return period" static layer without its permanent-water class.
|
Dimensions
Flood recurrence interval in years.
Unit: year
10205075100200500
Only in permanent-water
Variables
| Variable | Type | Description |
|---|---|---|
| permanent_water | uint8 | Permanent water bodies used to patch the flood hazard maps.
|
Only in spurious-depths
Variables
| Variable | Type | Description |
|---|---|---|
| spurious_depths | uint8 | Areas where modelled depth exceeds 10 m in channels draining under 3,000 km2 at the 10-year return period, plus a 2 km buffer.
|
Technical metadata
The full spatial, temporal, and modeling detail behind the summaries elsewhere on this page.
Spatial
- CRS
- EPSG:4326
- Extent (W S E N)
- [-170.0013, -59.9871, 179.9696, 80.0013]
- Coverage
- World
- Grid spacing
- 3 arc-seconds (~93 m at the equator)
Provenance
Ordered processing steps, from source to publication.
- source
River flows from LISFLOOD driven by the GloFAS v4.0 hydrological reanalysis, inundation from LISFLOOD-FP on a MERIT-DEM and MERIT-Hydro base, published by JRC as 271 GeoTIFF tiles per layer.
- cloud-optimize
Tiles converted to cloud-optimized GeoTIFFs with internal overviews and published on Source Cooperative as one STAC collection per layer, by Nissim Lebovits (Radiant Earth).
- index2026-09-29
Upstream STAC collections snapshotted to STAC GeoParquet, one file per collection, and mosaicked into VRTs that reference the Source Cooperative tiles in place. depth.vrt and hazard.vrt stack the return periods as bands. No data is copied.
- crop-cog
Depth tiles cropped to a Kenya window and written as one COG per return period.
How to cite
Please cite the dataset and any associated peer-reviewed publications.
Calum Baugh, Juan Colonese, Claudia D'Angelo, Francesco Dottori, Jeffrey Neal, Christel Prudhomme, Peter Salamon (2024) Modelled flood inundation for different return period scenarios at the global scale. Version 2.1.2. European Commission, Joint Research Centre (JRC). https://jeodpp.jrc.ec.europa.eu/ftp/jrc-opendata/CEMS-GLOFAS/flood_hazard/. Accessed through the CGIAR Climate Action Data Hub, https://cgiar-climate-data-hub.github.io/catalog/jrc-glofas_2.1.2/.
BibTeX
@misc{jrc_glofas_2024,
title = {Modelled flood inundation for different return period scenarios at the global scale},
author = {Baugh, Calum and Colonese, Juan and D'Angelo, Claudia and Dottori, Francesco and Neal, Jeffrey and Prudhomme, Christel and Salamon, Peter},
year = {2024},
version = {2.1.2},
publisher = {European Commission, Joint Research Centre (JRC)},
url = {https://jeodpp.jrc.ec.europa.eu/ftp/jrc-opendata/CEMS-GLOFAS/flood_hazard/},
note = {Accessed through the CGIAR Climate Action Data Hub, https://cgiar-climate-data-hub.github.io/catalog/jrc-glofas_2.1.2/}
}Attribution
Reproduce this credit line wherever you reuse the data.
Contains modified Copernicus Emergency Management Service information [year]
Contacts
Who produced this dataset, and who to reach about it.