Global Population Projections (H3-indexed)
WorldPop SSP 1km population projections (2025–2100) aggregated to H3 hexagonal cells in optimized Parquet format. Eight H3 resolutions (1–8), one file per resolution, sorted by h3_index. v2 (recommended) uses BIGINT h3_index with 17 columns; v1 (legacy) uses VARCHAR h3_index with geometry/lat/lon/area_km2.
Quick Start
1 -- DuckDB (v2, recommended)
2 INSTALL h3 FROM community; LOAD h3;
3 INSTALL httpfs; LOAD httpfs;
4 SET s3_region = 'us-west-2' ;
5
6 SELECT h3_index,
7 h3_h3_to_string(h3_index) AS h3_hex,
8 h3_cell_to_lat(h3_index) AS lat,
9 h3_cell_to_lng(h3_index) AS lng,
10 pop_2025, pop_2050, pop_2100,
11 (pop_2100 / pop_2025):: FLOAT AS growth_ratio
12 FROM read_parquet( 's3://us-west-2.opendata.source.coop/walkthru-earth/indices/population/v2/scenario=SSP2/h3_res=5/data.parquet' )
13 ORDER BY pop_2025 DESC
14 LIMIT 20 ;
1 -- DuckDB (v2, recommended)
2 INSTALL h3 FROM community; LOAD h3;
3 INSTALL httpfs; LOAD httpfs;
4 SET s3_region = 'us-west-2' ;
5
6 SELECT h3_index,
7 h3_h3_to_string(h3_index) AS h3_hex,
8 h3_cell_to_lat(h3_index) AS lat,
9 h3_cell_to_lng(h3_index) AS lng,
10 pop_2025, pop_2050, pop_2100,
11 (pop_2100 / pop_2025):: FLOAT AS growth_ratio
12 FROM read_parquet( 's3://us-west-2.opendata.source.coop/walkthru-earth/indices/population/v2/scenario=SSP2/h3_res=5/data.parquet' )
13 ORDER BY pop_2025 DESC
14 LIMIT 20 ;
1 # Python (v2)
2 import duckdb
3
4 con = duckdb.connect()
5 con.install_extension( "httpfs" ); con.load_extension( "httpfs" )
6 con.execute( "INSTALL h3 FROM community" ); con.load_extension( "h3" )
7 con.sql( "SET s3_region = 'us-west-2'" )
8
9 df = con.sql( """
10 SELECT h3_index,
11 h3_cell_to_lat(h3_index) AS lat,
12 h3_cell_to_lng(h3_index) AS lng,
13 pop_2025, pop_2050, pop_2100
14 FROM read_parquet(
15 's3://us-west-2.opendata.source.coop/walkthru-earth/indices/population/v2/scenario=SSP2/h3_res=5/data.parquet'
16 ) WHERE h3_cell_to_lat(h3_index) BETWEEN 20 AND 35
17 AND h3_cell_to_lng(h3_index) BETWEEN 68 AND 90
18 """ ).fetchdf()
1 # Python (v2)
2 import duckdb
3
4 con = duckdb.connect()
5 con.install_extension( "httpfs" ); con.load_extension( "httpfs" )
6 con.execute( "INSTALL h3 FROM community" ); con.load_extension( "h3" )
7 con.sql( "SET s3_region = 'us-west-2'" )
8
9 df = con.sql( """
10 SELECT h3_index,
11 h3_cell_to_lat(h3_index) AS lat,
12 h3_cell_to_lng(h3_index) AS lng,
13 pop_2025, pop_2050, pop_2100
14 FROM read_parquet(
15 's3://us-west-2.opendata.source.coop/walkthru-earth/indices/population/v2/scenario=SSP2/h3_res=5/data.parquet'
16 ) WHERE h3_cell_to_lat(h3_index) BETWEEN 20 AND 35
17 AND h3_cell_to_lng(h3_index) BETWEEN 68 AND 90
18 """ ).fetchdf()
Files
1 walkthru-earth/indices/population/
2 v2/scenario=SSP2/ # recommended
3 h3_res=1/data.parquet 430 cells
4 h3_res=2/data.parquet 2,222 cells
5 h3_res=3/data.parquet 12,310 cells
6 h3_res=4/data.parquet 71,552 cells
7 h3_res=5/data.parquet 414,388 cells
8 h3_res=6/data.parquet 2,288,660 cells
9 h3_res=7/data.parquet 11,421,958 cells
10 h3_res=8/data.parquet 44,888,216 cells
11 _metadata.json
12 v1/scenario=SSP2/ # legacy (VARCHAR h3_index, has geometry/lat/lon/area_km2)
13 h3_res=1/data.parquet .. h3_res=8/data.parquet
1 walkthru-earth/indices/population/
2 v2/scenario=SSP2/ # recommended
3 h3_res=1/data.parquet 430 cells
4 h3_res=2/data.parquet 2,222 cells
5 h3_res=3/data.parquet 12,310 cells
6 h3_res=4/data.parquet 71,552 cells
7 h3_res=5/data.parquet 414,388 cells
8 h3_res=6/data.parquet 2,288,660 cells
9 h3_res=7/data.parquet 11,421,958 cells
10 h3_res=8/data.parquet 44,888,216 cells
11 _metadata.json
12 v1/scenario=SSP2/ # legacy (VARCHAR h3_index, has geometry/lat/lon/area_km2)
13 h3_res=1/data.parquet .. h3_res=8/data.parquet
Compression: ZSTD level 3. Row groups: 1,000,000 rows.
Schema (v2, recommended)
17 columns total. Geometry, lat/lon, and area_km2 from v1 are derivable from h3_index via the DuckDB h3 extension (e.g., h3_cell_to_lat(h3_index), h3_cell_to_lng(h3_index)).
Sample values (res 5, most populated cells, SSP2 2025):
How It Works
WorldPop 1 km rasters are read in 5° × 5° geographic windows
Each pixel is assigned to an H3 cell via h3.latlng_to_cell()
Population counts are summed per H3 cell (correct for count data)
Overlapping window-boundary cells are deduplicated via GROUP BY h3_index, SUM()
Final Parquet is sorted by h3_index (v2 stores BIGINT h3_index only; v1 legacy includes native GEOMETRY via DuckDB spatial)
All resolutions produce consistent world totals (~8.19 billion for 2025).
More Examples
1 -- Population growth hotspots (2025 → 2100)
2 SELECT h3_index,
3 h3_cell_to_lat(h3_index) AS lat,
4 h3_cell_to_lng(h3_index) AS lng,
5 pop_2025, pop_2100,
6 (pop_2100 / pop_2025):: FLOAT AS growth_ratio
7 FROM read_parquet( 's3://us-west-2.opendata.source.coop/walkthru-earth/indices/population/v2/scenario=SSP2/h3_res=5/data.parquet' )
8 WHERE pop_2025 > 100000
9 ORDER BY growth_ratio DESC
10 LIMIT 20 ;
11
12 -- Continental totals
13 SELECT CASE
14 WHEN h3_cell_to_lat(h3_index) BETWEEN - 35 AND 37 AND h3_cell_to_lng(h3_index) BETWEEN - 20 AND 55 THEN 'Africa'
15 WHEN h3_cell_to_lat(h3_index) BETWEEN 5 AND 55 AND h3_cell_to_lng(h3_index) BETWEEN 60 AND 150 THEN 'Asia'
16 WHEN h3_cell_to_lat(h3_index) BETWEEN 35 AND 72 AND h3_cell_to_lng(h3_index) BETWEEN - 12 AND 45 THEN 'Europe'
17 WHEN h3_cell_to_lat(h3_index) BETWEEN - 56 AND 15 AND h3_cell_to_lng(h3_index) BETWEEN - 82 AND - 34 THEN 'South America'
18 WHEN h3_cell_to_lat(h3_index) BETWEEN 15 AND 72 AND h3_cell_to_lng(h3_index) BETWEEN - 170 AND - 50 THEN 'North America'
19 ELSE 'Other'
20 END AS continent,
21 SUM (pop_2025):: BIGINT AS pop_2025,
22 SUM (pop_2050):: BIGINT AS pop_2050,
23 SUM (pop_2100):: BIGINT AS pop_2100
24 FROM read_parquet( 's3://us-west-2.opendata.source.coop/walkthru-earth/indices/population/v2/scenario=SSP2/h3_res=5/data.parquet' )
25 GROUP BY continent
26 ORDER BY pop_2025 DESC ;
27
28 -- DuckDB-WASM (browser) — use HTTPS URL
29 SELECT h3_index, pop_2025, pop_2050
30 FROM read_parquet(
31 'https://data.source.coop/walkthru-earth/indices/population/v2/scenario=SSP2/h3_res=5/data.parquet'
32 )
33 WHERE h3_cell_to_lat(h3_index) BETWEEN 35 AND 45
34 AND h3_cell_to_lng(h3_index) BETWEEN - 10 AND 5
35 LIMIT 100 ;
1 -- Population growth hotspots (2025 → 2100)
2 SELECT h3_index,
3 h3_cell_to_lat(h3_index) AS lat,
4 h3_cell_to_lng(h3_index) AS lng,
5 pop_2025, pop_2100,
6 (pop_2100 / pop_2025):: FLOAT AS growth_ratio
7 FROM read_parquet( 's3://us-west-2.opendata.source.coop/walkthru-earth/indices/population/v2/scenario=SSP2/h3_res=5/data.parquet' )
8 WHERE pop_2025 > 100000
9 ORDER BY growth_ratio DESC
10 LIMIT 20 ;
11
12 -- Continental totals
13 SELECT CASE
14 WHEN h3_cell_to_lat(h3_index) BETWEEN - 35 AND 37 AND h3_cell_to_lng(h3_index) BETWEEN - 20 AND 55 THEN 'Africa'
15 WHEN h3_cell_to_lat(h3_index) BETWEEN 5 AND 55 AND h3_cell_to_lng(h3_index) BETWEEN 60 AND 150 THEN 'Asia'
16 WHEN h3_cell_to_lat(h3_index) BETWEEN 35 AND 72 AND h3_cell_to_lng(h3_index) BETWEEN - 12 AND 45 THEN 'Europe'
17 WHEN h3_cell_to_lat(h3_index) BETWEEN - 56 AND 15 AND h3_cell_to_lng(h3_index) BETWEEN - 82 AND - 34 THEN 'South America'
18 WHEN h3_cell_to_lat(h3_index) BETWEEN 15 AND 72 AND h3_cell_to_lng(h3_index) BETWEEN - 170 AND - 50 THEN 'North America'
19 ELSE 'Other'
20 END AS continent,
21 SUM (pop_2025):: BIGINT AS pop_2025,
22 SUM (pop_2050):: BIGINT AS pop_2050,
23 SUM (pop_2100):: BIGINT AS pop_2100
24 FROM read_parquet( 's3://us-west-2.opendata.source.coop/walkthru-earth/indices/population/v2/scenario=SSP2/h3_res=5/data.parquet' )
25 GROUP BY continent
26 ORDER BY pop_2025 DESC ;
27
28 -- DuckDB-WASM (browser) — use HTTPS URL
29 SELECT h3_index, pop_2025, pop_2050
30 FROM read_parquet(
31 'https://data.source.coop/walkthru-earth/indices/population/v2/scenario=SSP2/h3_res=5/data.parquet'
32 )
33 WHERE h3_cell_to_lat(h3_index) BETWEEN 35 AND 45
34 AND h3_cell_to_lng(h3_index) BETWEEN - 10 AND 5
35 LIMIT 100 ;
Geometry / Coordinate Derivation
v2 files do not include geometry, lat, lon, or area_km2 columns — these are derivable from the BIGINT h3_index using the DuckDB h3 community extension:
1 INSTALL h3 FROM community; LOAD h3;
2
3 SELECT h3_index,
4 h3_h3_to_string(h3_index) AS h3_hex,
5 h3_cell_to_lat(h3_index) AS lat,
6 h3_cell_to_lng(h3_index) AS lng,
7 h3_cell_area(h3_index, 'km^2' ) AS area_km2
8 FROM read_parquet( 's3://us-west-2.opendata.source.coop/walkthru-earth/indices/population/v2/scenario=SSP2/h3_res=5/data.parquet' )
9 LIMIT 5 ;
1 INSTALL h3 FROM community; LOAD h3;
2
3 SELECT h3_index,
4 h3_h3_to_string(h3_index) AS h3_hex,
5 h3_cell_to_lat(h3_index) AS lat,
6 h3_cell_to_lng(h3_index) AS lng,
7 h3_cell_area(h3_index, 'km^2' ) AS area_km2
8 FROM read_parquet( 's3://us-west-2.opendata.source.coop/walkthru-earth/indices/population/v2/scenario=SSP2/h3_res=5/data.parquet' )
9 LIMIT 5 ;
v1 (legacy) files retain the original schema with VARCHAR h3_index, native Parquet 2.11+ GEOMETRY, lat, lon, and area_km2 columns. v1 is located at indices/population/v1/scenario=SSP2/h3_res={1-8}/data.parquet.
Source
WorldPop Global SSP Projections v0.2 — 30 arc-second (~1 km) gridded population projections for 2025–2100 under five Shared Socioeconomic Pathways (SSP1–SSP5). Float32, LZW-compressed GeoTIFF, EPSG:4326, coverage 60°S–84°N.
WorldPop. (2018). Global 1km-grid population projections, v0.2. University of Southampton. doi:10.5258/SOTON/WP00849
License
This dataset is licensed under CC BY 4.0 by walkthru.earth . The source WorldPop SSP Projections is licensed under CC BY 4.0 by the University of Southampton .