Documentation v0.3.0
Historical Population
Population totals derived from GHSL population raster data, by year.
Coverage and granularity#
Every DDL boundary with a population raster overlap, at parent, ADM1 and ADM2 split levels.
9,849 of 9,849 parent cities · 1975–2025 · 681,666 rows across the package
- City: 9,849 of 9,849 boundary IDs
- ADM1: 387 of 387 boundary IDs
- ADM2: 3,130 of 3,130 boundary IDs
Row key: id, version, year
Examples in the City Explorer: Kinshasa, Guangzhou, Osaka.
Source: GHS-POP R2023A — GHS population grid multitemporal (1975–2030)
Joining this data#
A Python example using GeoPandas and pandas. Replace the file paths with your local downloads. See boundary levels and join keys.
import geopandas as gpd
import pandas as pd
# Match the boundary file to the module's geographic level.
level = "PARENT"
boundaries = gpd.read_file("parent.gpkg")
observations = pd.read_parquet("ddl-population-historical.parquet")
observations = observations.loc[observations["boundary_level"].eq(level)]
joined = boundaries.merge(
observations, on="id", how="left", validate="one_to_many"
)
print(joined.head())Methodology#
Upstream population counts come from the European Commission Joint Research Centre GHS-POP R2023A multitemporal grid, released as five-year epochs from 1975 through 2030 on a 1km resolution raster (EPSG:54009). For each five-year source epoch, we run zonal statistics on its raster against the parent city polygon, summing pixel values to produce pop_sum and recording the contributing pixel_count. Population for ADM1 and ADM2 splits is calculated by running zonal statistics against the split polygons. Population figures for years between the five-year epochs are linearly interpolated.
Schema#
| Name | Type | Units | Description |
|---|---|---|---|
id | string | — | Parent or child city identifier. |
version | string | — | Boundary version. |
boundary_level | string | — | PARENT, ADM1 or ADM2. |
year | int64 | — | Year of the population estimate. |
pop_sum | float64 | People | Population total for the given year. |
pixel_count | float64 | — | Number of raster pixels contributing to pop_sum at five-year source epochs. May be null. |
Notes#
- The population history follows the same released boundary through time. Growth describes population change inside that footprint; it does not measure how the urban boundary expanded.
- Years between the five-year GHS-POP epochs are linearly interpolated by UGC, and are not measured directly in the upstream dataset.
Citation#
When using these data, cite Urban Growth Center and the original source below, where applicable.
Original source
Schiavina, M., Freire, S., Carioli, A., MacManus, K. (2026). GHS-POP R2023A — GHS population grid multitemporal (1975–2030). European Commission, Joint Research Centre (JRC). doi:10.2905/2FF68A52-5B5B-4A22-8F40-C41DA8332CFE
Urban Growth Center
Development Data Lab. (2026). Urban Growth Center. https://cities.devdatalab.org/