Open planetary indices that turn raw scientific data into a single, H3-hexagonal grid anyone can query with one SQL statement. Every index shares the same cell ID (h3_index), so joining terrain + buildings + population + weather is a one-line JOIN ON h3_index.
Why? Cities shape how people feel — but the data to prove it is scattered across dozens of agencies, formats, and projections. We unify it into one queryable, open layer so researchers, planners, and communities can finally see the full picture. Read more: walkthru.earth/hormones-cities
1flowchart LR
2 subgraph Raw["Raw sources"]
3 DEM_RAW["GEDTM-30m\n(30 m GeoTIFF)"]
4 GBA_RAW["Global Building Atlas\n(2.75 B polygons)"]
5 WP_RAW["WorldPop SSP\n(1 km rasters)"]
6 NOAA_RAW["NOAA AI-NWP\n(0.25° NetCDF)"]
7 end
8
9 subgraph H3["H3 conversion"]
10 direction TB
11 DT["dem-terrain\nelev · slope · aspect · TRI · TPI"]
All datasets: Apache Parquet, ZSTD compression, sorted by h3_index.
v2 (recommended):h3_index is BIGINT (int64) — no geometry, lat, lon, or area_km2 columns (all derivable from the H3 index via DuckDB's h3 extension). Sorted by int64 for better compression and fast range-based spatial queries.
v1 (legacy):h3_index is VARCHAR (hex string) with native Parquet 2.11+ GEOMETRY and lat/lon/area_km2 columns.
Quick start
1-- DuckDB: join buildings + population in one query (v2 — BIGINT h3_index, no geometry)
2INSTALL httpfs; LOAD httpfs;
3INSTALL h3 FROM community; LOAD h3;
4SET s3_region = 'us-west-2';
5
6SELECT b.h3_index,
7 h3_h3_to_string(b.h3_index) AS h3_hex, -- hex string for deck.gl
8 h3_cell_to_lat(b.h3_index) AS lat, -- derive lat on the fly
9 h3_cell_to_lng(b.h3_index) AS lon, -- derive lon on the fly
10 b.building_count, b.building_density,
11 p.pop_2025, p.pop_2050,
12 (b.building_count::FLOAT / NULLIF(p.pop_2025, 0))::DECIMAL(6,3) AS bldg_per_person
13FROM read_parquet('s3://us-west-2.opendata.source.coop/walkthru-earth/indices/building/v2/h3/h3_res=5/data.parquet') b
14JOIN read_parquet('s3://us-west-2.opendata.source.coop/walkthru-earth/indices/population/v2/scenario=SSP2/h3_res=5/data.parquet') p
15 ON b.h3_index = p.h3_index -- BIGINT join — fast
16WHERE p.pop_2025 > 10000
17ORDER BY bldg_per_person DESC
18LIMIT 10;
1-- DuckDB: join buildings + population in one query (v2 — BIGINT h3_index, no geometry)
2INSTALL httpfs; LOAD httpfs;
3INSTALL h3 FROM community; LOAD h3;
4SET s3_region = 'us-west-2';
5
6SELECT b.h3_index,
7 h3_h3_to_string(b.h3_index) AS h3_hex, -- hex string for deck.gl
8 h3_cell_to_lat(b.h3_index) AS lat, -- derive lat on the fly
9 h3_cell_to_lng(b.h3_index) AS lon, -- derive lon on the fly
10 b.building_count, b.building_density,
11 p.pop_2025, p.pop_2050,
12 (b.building_count::FLOAT / NULLIF(p.pop_2025, 0))::DECIMAL(6,3) AS bldg_per_person
13FROM read_parquet('s3://us-west-2.opendata.source.coop/walkthru-earth/indices/building/v2/h3/h3_res=5/data.parquet') b
14JOIN read_parquet('s3://us-west-2.opendata.source.coop/walkthru-earth/indices/population/v2/scenario=SSP2/h3_res=5/data.parquet') p
15 ON b.h3_index = p.h3_index -- BIGINT join — fast