Documentation v0.3.0

Historical Population

Population totals derived from GHSL population raster data, by year.

Granularity
City, ADM1 split, ADM2 split
Format
Parquet
Time resolution
Annual
Module version
v0.3.0
License
Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License

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.

Python
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#

NameTypeUnitsDescription
idstring—Parent or child city identifier.
versionstring—Boundary version.
boundary_levelstring—PARENT, ADM1 or ADM2.
yearint64—Year of the population estimate.
pop_sumfloat64PeoplePopulation total for the given year.
pixel_countfloat64—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

Citation
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

View original source

Urban Growth Center

Citation
Development Data Lab. (2026). Urban Growth Center. https://cities.devdatalab.org/