v1 now, v2 after review
v2 is a repackaging, not a recomputation. The numbers do not change. The rasters become Cloud-Optimized GeoTIFFs, and the basins gain a vector form.
| v1 | v2 | |
|---|---|---|
| Date | 22 May 2026 | after the ESSD review |
| DOI | 10.5281/zenodo.20344113 | same DOI, new version |
| Rasters | GeoTIFF, DEFLATE, one strip per row | COG, 512×512 tiles, ZSTD‑15 |
| Tables | CSV | CSV |
| Vectors | none | GeoPackage |
| Total | 142.2 GB, 100 files | about 92 GB |
| Packing | one zip per region, stored uncompressed | same |
The zips are not compressed a second time — the GeoTIFFs inside are already DEFLATE-compressed, so there is nothing to gain. One consequence is useful: the bytes sit in the zip unchanged, so GDAL can read a single window out of a 3 GB zip without downloading it.
The masks as single files
This page is not a second archive. It carries the basin and region masks as single files, so you can see what the data looks like, check whether it fits your problem, and take one layer without downloading 142 GB.
Rasters — native 90 m
bsn_global_90m.tif the global basin mask — all 24,587,290 basins, down to the single-pixel coastal outlets · UInt32, nodata 0 · Cloud-Optimized GeoTIFF · 251 MB
rgn_global_90m.tif the global region mask — which of the 96 regions each pixel belongs to · UInt8, nodata 0 · Cloud-Optimized GeoTIFF · 34 MB
Tables — native 90 m
bat_global_90m_gt1km2.csv bat_global_90m.csv cut to the 340,991 basins above 1 km², all 27 columns · 60 MB. Those cover more than 99.5% of the land; the full table of 24,587,290 rows is on Zenodo.
rat_global_90m.csv the region attribute table — 96 rows, 11 columns · 10 kB
rat_global_90m_with_tiles.csv the same 96 rows with the full MERIT Hydro tile list for each region · 20 kB
Vectors — simplified
bsn_global_gt1km2.gpkg 340,955 basin polygons. Where a separate basin sits enclosed inside another it shows as a hole, so each polygon is the area that basin actually occupies · 143 MB
bnd_global_gt1km2.gpkg the outer boundary of those same basins, as lines. No interior holes — nicer to draw · 141 MB
rgn_global.gpkg the 96 region outlines · 22 MB
The outlines are simplified; the numbers are not. Kept at full resolution these polygons come to 6.9 GB, so they are simplified for use as a mask — to see extents, to clip by basin, to drop an outline into a figure. Every number — area, outlet, bounding box — is computed on the native 90 m grid and is not measured from these outlines; when the boundary itself matters, take the rasters. global_basin_id is the same in the vectors, the tables and the rasters, so they join directly. 36 of the 340,991 basins in the table are too small to survive the simplification and have no polygon.
This site runs on a basic hosting plan with a fixed number of requests a day. If a map stops loading, it is most likely that a lot of people are using it at once — try again in a few minutes. The archived files on Zenodo are never affected.
Every file in the dataset
This is Table 1 of the paper, with two columns added: where each file can be downloaded. All native-resolution rasters share one global grid, 432,000 × 174,000 pixels at 3 arcsec. The file-name wildcard * is the region_id, written without padding.
Read the compressed column, not the raw one. Nothing is distributed at its uncompressed size — that column is there to show what the compression is doing.
| File | Variable | Type | NoData | Compressed | Raw | Here | Zenodo |
|---|---|---|---|---|---|---|---|
| Input baseline topology — MERIT Hydro, not redistributed | |||||||
| dir_global_90m.tif | Flow direction | UInt8 | 247 | ~6.5 GB | ~70 GB | ✗ | ✗ |
| upg_global_90m.tif | Flow accumulation in cells | UInt32 | 0 | ~18 GB | ~280 GB | ✗ | ✗ |
| upa_global_90m.tif | Flow accumulation in km² | Float32 | −9999 | ~36 GB | ~280 GB | ✗ | ✗ |
| Basin and region masks with attribute tables — global | |||||||
| bsn_global_90m.tif | Basin mask | UInt32 | 0 | ~0.8 GB | ~280 GB | ✓ | ✓ |
| rgn_global_90m.tif | Region mask | UInt8 | 0 | ~0.1 GB | ~70 GB | ✓ | ✓ |
| bat_global_90m.csv | Basin attribute table — all 24,587,290 rows. Here: the 340,991 rows above 1 km² only. | CSV | — | 4.3 GB | — | ✓ | ✓ |
| rat_global_90m.csv | Region attribute table | CSV | — | 10 kB | — | ✓ | ✓ |
| Basin and region masks with attribute tables — per-region tiles | |||||||
| bat_region*_90m.csv | Basin attribute table | CSV | — | 6.3 GB | — | ✗ | ✓ |
| bsn_region*_90m.tif | Basin mask | UInt32 | 0 | ~0.85 GB | ~280 GB | ✗ | ✓ |
| bsn_region*_90m_remapped.tif | Basin mask renumbered with the local basin id | UInt32 | 0 | ~0.85 GB | ~280 GB | ✗ | ✓ |
| DFS interval index — per-region tiles | |||||||
| dfs_in_region*_90m.tif | DFS entry timestamp | Int32 | −1 | ~40 GB | ~280 GB | ✗ | ✓ |
| dfs_out_region*_90m.tif | DFS exit timestamp | Int32 | −1 | ~40 GB | ~280 GB | ✗ | ✓ |
| Upstream morphometric attributes — per-region tiles, populated where upstream area reaches 10 km² | |||||||
| mean_elev_upstream_region*_90m.tif | Mean upstream elevation | Float32 | −9999 | ~3 GB | ~280 GB | ✗ | ✓ |
| min_elev_upstream_region*_90m.tif | Minimum upstream elevation | Float32 | −9999 | ~3 GB | ~280 GB | ✗ | ✓ |
| max_elev_upstream_region*_90m.tif | Maximum upstream elevation | Float32 | −9999 | ~3 GB | ~280 GB | ✗ | ✓ |
| std_elev_upstream_region*_90m.tif | Standard deviation of upstream elevation | Float32 | −9999 | ~3 GB | ~280 GB | ✗ | ✓ |
| mean_slope_upstream_region*_90m.tif | Mean upstream slope | Float32 | −9999 | ~3 GB | ~280 GB | ✗ | ✓ |
| std_slope_upstream_region*_90m.tif | Standard deviation of upstream slope | Float32 | −9999 | ~3 GB | ~280 GB | ✗ | ✓ |
| perimeter_catchment_region*_90m.tif | Catchment perimeter | Float32 | −9999 | ~3 GB | ~280 GB | ✗ | ✓ |
| length_basin_region*_90m.tif | Basin length | Float32 | −9999 | ~3 GB | ~280 GB | ✗ | ✓ |
| width_basin_region*_90m.tif | Basin width | Float32 | −9999 | ~3 GB | ~280 GB | ✗ | ✓ |
| convexity_planform_region*_90m.tif | Planform convexity | Float32 | −9999 | ~3 GB | ~280 GB | ✗ | ✓ |
| relief_basin_region*_90m.tif | Basin relief | Float32 | −9999 | ~3 GB | ~280 GB | ✗ | ✓ |
| hypsometric_integral_region*_90m.tif | Hypsometric integral | Float32 | −9999 | ~3 GB | ~280 GB | ✗ | ✓ |
| elongation_ratio_region*_90m.tif | Elongation ratio | Float32 | −9999 | ~3 GB | ~280 GB | ✗ | ✓ |
| compactness_gravelius_region*_90m.tif | Gravelius compactness | Float32 | −9999 | ~3 GB | ~280 GB | ✗ | ✓ |
| circularity_ratio_region*_90m.tif | Circularity ratio | Float32 | −9999 | ~3 GB | ~280 GB | ✗ | ✓ |
| lemniscate_ratio_region*_90m.tif | Lemniscate ratio | Float32 | −9999 | ~3 GB | ~280 GB | ✗ | ✓ |
Added on this site
Five files that are not in the paper. They are cuts and vector forms of what is already in Table 1, made so the data can be opened without a raster workflow. The outlines are simplified — at full resolution they would come to 6.9 GB. They will go into Zenodo with v2.
| File | What it is | Type | Size | Here | Zenodo |
|---|---|---|---|---|---|
| bat_global_90m_gt1km2.csv | The basin table cut to the 340,991 basins above 1 km², all 27 columns | CSV | 60 MB | ✓ | v2 |
| bsn_global_gt1km2.gpkg | 340,955 basin polygons, simplified, holes kept | GeoPackage | 143 MB | ✓ | v2 |
| bnd_global_gt1km2.gpkg | Outer boundary of those basins, as lines, no holes | GeoPackage | 141 MB | ✓ | v2 |
| rgn_global.gpkg | The 96 region outlines, simplified | GeoPackage | 22 MB | ✓ | v2 |
| rat_global_90m_with_tiles.csv | The region table plus the MERIT Hydro tile list for each region | CSV | 20 kB | ✓ | v2 |
Regions
rat_global_90m.csv that describe them.Every region box is a whole number of degrees. At 3 arcsec one degree is exactly 1,200 cells, so a region’s row and column offsets are always multiples of 1,200. That is why a region can be cut straight out of the global rasters with integer arithmetic — gdal_translate -srcwin and nothing else — with no resampling and no half-pixel shift.
IDs run 11–92 for the 65 continental regions, 10001–10002 for the two that cross the antimeridian, and 20001–20029 for the 29 island groups.
How the 96 regions were formed
Regions follow the manually drawn upper levels of HydroBASINS. Each basin is assigned to a level-3 polygon by area overlap; level-3 children are then merged back into their level-2 parent, but only where the merged region still fits inside an INT32 raster index. Parents that fail that test keep their level-3 children as separate regions. Basins that cross the antimeridian and isolated islands are grouped on their own. The result is 96 regions: 65 continental (IDs 11–92), two antimeridian groups (10001–10002) and 29 island groups (20001–20029).
Basins
bat_global_90m.csv that describe them.The raster and the table share one address. A basin ID read out of the mask is table_index + 1: basin 1 is row 0, basin 2 is row 1, and so on. Going from a pixel to its record is an array offset, never a join and never a lookup table. Rows are sorted by area, which is why basin 1 is the Amazon.
The full table has one row for every basin, down to the 13.3 million single-pixel coastal outlets. The cut below carries the 340,991 basins above 1 km², which together cover more than 99.5% of the land.
The outlines are simplified; the numbers are not. Every attribute column — area, outlet, bounding box — is computed on the native 3 arcsec (1/1200°) grid and is not measured from these outlines. When the boundary itself matters, take the 90 m rasters.
Read one window over HTTP
Every file on this page is served with HTTP range requests, so GDAL, rasterio and DuckDB can read a window straight off the network.
import rasterio
url = "https://data.fullhydro.org/v1/bsn_global_90m.tif"
with rasterio.open(url) as src:
basin_id = next(src.sample([(-60.0, -3.0)]))[0]
The Zenodo archive works the same way, and so does the inside of each zip, because the zips are stored uncompressed.
export GDAL_HTTP_USERAGENT="your-tool/1.0" # Zenodo rejects an empty user agent
ZIP=/vsicurl/https://zenodo.org/api/records/20344113/files/region_00064.zip/content
TIF=dfs_interval/dfs_in/dfs_in_region_00064_90m.tif
gdallocationinfo -valonly "/vsizip/{$ZIP}/$TIF" 16200 13200
Without GDAL_HTTP_USERAGENT the request comes back 403. Every other HTTP client sends a user agent by default; GDAL does not.
How to cite
The MERIT Hydro layers this is built on are not redistributed here. Cite them separately: Yamazaki et al. (2019), MERIT Hydro: a high-resolution global hydrography map based on latest topography datasets, Water Resources Research.