A collection of datasets from various Dutch institutions to demonstrate a Spatial Data Infrastructure built on Portolan.
All buildings in the Netherlands — 24.2 million footprint polygons — from the BAG (Basisregistratie Adressen en Gebouwen, the Dutch national building registry), harmonized to the EU INSPIRE Buildings schema by Kadaster and published via PDOK.
This is the authoritative Dutch building dataset. Every building that has ever been registered in the BAG is here, including historical versions. Construction dates range from before 1800 to present, with ~1 million "planned" entries dated 9999-01-01.
The dataset includes both current and historical building records. To get only
current buildings, filter for endLifespanVersion IS NULL.
No building heights or floor counts. The INSPIRE Buildings 2D profile from PDOK only
includes footprints, construction dates, and identifiers. For heights, use
3DBAG from TU Delft, which derives building heights from the AHN
point cloud and includes fields like h_dak_50pct (median roof height).
Source: https://www.pdok.nl/introductie/-/article/gebouwen-inspire-geharmoniseerd- Provider: Kadaster (Netherlands Cadastre, Land Registry and Mapping Agency) License: CC0 (public domain)
This is a GeoParquet 1.1.0 file with bbox covering columns and Hilbert spatial sorting, making it efficient for spatial range queries. Use DuckDB with the spatial extension.
The file is 2.1 GB. For large queries, DuckDB can stream it efficiently using HTTP range requests — you don't need to download the full file. The bbox covering columns and Hilbert sorting enable DuckDB to skip irrelevant row groups for spatial filters.
The columns you'll actually use are:
localId — BAG building ID (the key identifier)anyPoint — construction dateendLifespanVersion — null means current, non-null means historicalgeometry — building footprint polygonEverything else is either constant, unpopulated, or internal.
geometry (WKB encoded)The dataset contains 24.2M rows total:
endLifespanVersion IS NULL)endLifespanVersion IS NOT NULL)Multiple rows with the same localId represent the version history of a single building.
Always filter for current records unless you specifically need the history.
Peak construction years: 2021 (486K), 2020 (479K), 2019 (446K). The 1950–1999 period dominates — post-war reconstruction and suburban expansion.
This uses the bbox covering columns for fast filtering — DuckDB skips row groups whose
bbox ranges don't overlap. Much faster than ST_Intersects for bounding-box queries.
The first 4 digits of localId encode the municipality code (gemeentecode).
This dataset follows the INSPIRE Buildings 2D profile (bu-core2d). The INSPIRE schema defines many more fields (currentUse, conditionOfConstruction, heightAboveGround, numberOfFloorsAboveGround, etc.) but the Dutch PDOK service only populates the core identity and lifecycle fields listed above. For richer building attributes (height, roof type, floor count, etc.), use the 3DBAG dataset from TU Delft (3dbag.nl) which uses native Dutch BAG field names instead of INSPIRE names.
anyPoint field is an ISO 8601 string, not a
proper date type. Use LEFT(anyPoint, 4) to extract the year, or cast with
CAST(LEFT(anyPoint, 4) AS INT) for numeric comparisons.anyPoint = '9999-01-01T00:00:00+01:00',
meaning the construction date is unknown or the building is planned. Filter these out
for historical analysis.endLifespanVersion IS NULL
to get ~12.6M records.localId encodes the gemeente code in its first
4 digits (e.g., localId 363100000000197 → gemeente 0363 = Amsterdam). But this
requires knowing the digit structure: LPAD(CAST(localId / 10000000000 AS VARCHAR), 4, '0').Two Mapbox GL v8 styles are available for interactive map visualization via the PMTiles file.
Style files are Mapbox GL v8 JSON with relative PMTiles source paths. They can be used with MapLibre GL JS, OpenLayers (via ol-mapbox-style), or any Mapbox GL v8-compatible renderer.
styles/default.json — Gray building footprints with darker outlines. Neutral monochrome rendering, visually distinct from the BAG light version.styles/by-construction-date.json — Construction era analysis. Parses year from the ISO 8601 anyPoint field and applies a brown-to-yellow age ramp. Same analytical purpose as the BAG by-age style but using INSPIRE-harmonized date fields.Style files are at: https://data.source.coop/cholmes/portolan-nl/kadaster/inspire_buildings/styles/
buildings.gml.gz (2.7 GB compressed, ~45 GB uncompressed)
— the original INSPIRE-harmonized GML from PDOK's ATOM download service.buildings.pmtiles — for web map visualization with
MapLibre GL JS or similar. Features are dropped at lower zoom levels for performance.https://service.pdok.nl/kadaster/bu/wfs/v1_0 (slower, paginated).Hand-maintained agent guide (ported from this collection's llms.txt in August 2026). Update it alongside collection.json.
namespace| string |
Always nl-imbag-bu. |
OGC_FID | int64 | Internal row ID from WFS extraction. Not meaningful. |
referenceGeometry | bool | Always true. |
horizontalGeometryEstimatedAccuracy | string | Not populated in this dataset. |
verticalGeometryEstimatedAccuracy | string | Not populated in this dataset. |
beginning | string | Not populated — use anyPoint for construction date. |
end | string | Not populated — use anyPoint for construction date. |