CBS Wijken en Buurten 2025 (Neighborhoods and Districts with Demographics)
What This Dataset Is
The definitive Dutch demographic geodataset. Published annually by CBS (Statistics Netherlands),
it provides population, age, household, marital status, migration background, and urbanity
statistics at three nested geographic levels covering the entire Netherlands:
Buurten (neighborhoods): 14,823 areas -- the finest granularity
Wijken (districts): 3,423 areas -- each aggregates multiple buurten
Gemeenten (municipalities): 424 areas -- top-level administrative units
Statistics reflect the situation as of 1 January 2025. All three layers share the same
~42 demographic columns. The dataset is the go-to source for any neighborhood-level
demographic analysis in the Netherlands.
The value -99997 means "data not available or privacy-suppressed." You MUST filter it out
before computing any averages, sums, medians, or other aggregations. If you don't, your
results will be wildly wrong.
Reasons for -99997:
Privacy protection: Areas with fewer than ~50 residents have statistics suppressed to
prevent identification of individuals.
Water areas: Water-only areas (where water = 'JA') have no meaningful demographics.
Buitenland entry: A boundary marker entry labeled 'Buitenland' (Foreign) in each layer
with all statistics set to -99997.
Always add WHERE column_name != -99997 (or > -99997) to your queries.
How to Access
Three separate GeoParquet files, one per geographic level. Use DuckDB with the spatial extension.
File sizes are moderate -- DuckDB can efficiently stream them via HTTP range requests without
downloading the full files.
Geographic Hierarchy and Code System
The three layers form a strict spatial hierarchy. Each buurt belongs to exactly one wijk,
and each wijk belongs to exactly one gemeente. The CBS area codes encode this relationship:
Extracting parent codes from a buurtcode:
Gemeente code: characters 2-6 of buurtcode (e.g., BU00140000 -> GM0014)
Wijk code: characters 2-8 of buurtcode (e.g., BU00140000 -> WK001400)
In SQL:
Schema -- All Columns
All three layers share the same column schema. The area code/name columns differ by layer
(buurtcode/buurtnaam vs wijkcode/wijknaam vs gemeentecode/gemeentenaam), but all statistical
columns are identical.
Identity & Classification Columns
Column
Type
Meaning
buurtcode / wijkcode / gemeentecode
string
CBS area code with prefix BU/WK/GM
buurtnaam / wijknaam / gemeentenaam
string
Human-readable area name
wijkcode
string
Parent district code (buurten layer only)
gemeentecode
string
Parent municipality code (buurten and wijken layers)
gemeentenaam
string
Parent municipality name (buurten and wijken layers)
% born abroad, European background (1st gen European)
perc_geb_buiten_nl_met_herkomstlnd_buiten_europa
% born abroad, non-European background (1st gen non-European)
Area Measurements
Column
Type
Meaning
oppervlakte_totaal_in_ha
int
Total area in hectares (land + water)
oppervlakte_land_in_ha
int
Land area in hectares
oppervlakte_water_in_ha
int
Water area in hectares
Geometry
Column
Type
Meaning
geometry
WKB MultiPolygon
Area boundary in EPSG:28992 (Amersfoort / RD New)
Useful Query Patterns
All examples use the base URL:
BASE = 'https://data.source.coop/cholmes/portolan-nl/cbs/wijken_buurten/'
Population by municipality (top 20 largest)
Densest neighborhoods in the Netherlands
Age distribution for a specific municipality
Neighborhoods with highest percentage of elderly
Filter out water areas and suppressed data properly
Average household size by urbanity class
Single-person household concentration
Migration background diversity by municipality
Join buurten with gemeenten names using code hierarchy
Load into GeoPandas
Geometry Notes
CRS is EPSG:28992 (Amersfoort / RD New) -- the standard Dutch national coordinate
system. You must reproject to EPSG:4326 for web maps or if combining with WGS84 data.
Geometry type is MultiPolygon across all three layers.
Bounding box in WGS84: approximately [3.21, 50.73, 7.24, 53.58] (all of Netherlands).
For spatial filtering with DuckDB, convert the geometry or query coordinates to EPSG:28992.
Caveats
Sentinel value -99997: Always filter this out. It appears in ALL numeric columns for
privacy-suppressed, water, and boundary-marker areas. Forgetting to filter will corrupt
aggregations (averages, sums, etc.) dramatically.
Percentages are integers: All percentage columns are rounded to whole numbers. The five
age groups, four marital statuses, and three migration backgrounds each sum to approximately
100, but rounding may cause +/-1 deviations.
424 gemeenten vs 342 current municipalities: The dataset includes more entries than
currently active municipalities due to historical/special entries. The extra entries include
the 'Buitenland' marker and possibly entries for recent municipal mergers.
Water areas: Areas where water = 'JA' are water bodies with suppressed demographics.
Filter with WHERE water = 'NEE' for land-only analysis.
Municipal mergers: The Netherlands regularly merges municipalities. When this happens,
all buurten and wijken within those municipalities get renumbered. The
indelingswijziging_wijken_en_buurten flag (1 = changed) helps identify areas whose
boundaries changed vs the previous year, making year-over-year comparison unreliable for
those areas.
Population density denominator:bevolkingsdichtheid_inwoners_per_km2 uses land area
only (oppervlakte_land_in_ha), not total area. This is the correct measure but means
areas with large water surfaces may appear denser than expected.
Related Datasets
CBS Gebiedsindelingen: Boundary geometries without demographic data, covering additional
geographic levels (COROP regions, provinces, labor market regions, etc.). Use Wijken en
Buurten when you need statistics; use Gebiedsindelingen when you only need boundaries or
need geographic levels beyond gemeente/wijk/buurt.
Bestuurlijke Gebieden (Kadaster): Authoritative administrative boundaries for
municipalities, provinces, and national territory. CBS boundaries are derived from these
but may differ slightly.
Also Available As
PMTiles (vector tiles):wijken_buurten.pmtiles -- for web map visualization with
MapLibre GL JS. Shows buurten boundaries.
Source GeoPackage: Available from PDOK at
https://service.pdok.nl/cbs/wijkenbuurten/2025/atom/downloads/wijkenbuurten_2025.gpkg
OGC API Features:https://api.pdok.nl/cbs/wijken-en-buurten-2025/ogc/v1
Hand-maintained agent guide (ported from this collection's llms.txt in August 2026). Update it alongside collection.json.
dekkingspercentage
int
% of addresses covered by the most common postal code
jrstatcode
string
Composite key: year + area code (e.g., '2025BU00140000')