Filteren aan de bron: CQL2 komt naar de PDOK-api!

PDOK test een nieuwe filterfunctionaliteit op de BAG OGC API. Ik testte, gaf feedback, en zorg dat pdokr is voorbereid!

Data & R
Auteur

Coen Eisma

Publicatiedatum

17 september 2026

Illustratie van een grote trechter waar allerlei soorten panden in vallen en identieke huisjes in een net raster uit komen, met Coen aan de hendel

PDOK heeft een demo online gezet van een hele fijne functionaliteit: échte filterfunctionaliteit op de BAG OGC API, op basis van CQL2. Ik heb de demo uitgebreid getest en feedback gegeven en ik ben het pdokr package al aan het voorbereiden.

Waarom dit fijn is: filteren aan de bron

Wie nu met pdokr werkt kent het patroon: je haalt een laag op (eventueel voorgefilterd op een gebied of jaargang) en filtert daarna lokaal met dplyr. Dat werkt prima voor buurten of gemeenten, maar bij grote lagen zoals de BAG — miljoenen panden en adressen — wil je niet eerst alles binnenhalen om vervolgens bijna alles eruit te filteren.

En daarom is CQL2 zo fijn: hiermee gebeurt het filteren op de server! Denk aan query’s als bouwjaar < 1900, gebruiksdoel = 'onderwijsfunctie' of huisnummer BETWEEN 1 AND 3. Alleen het resultaat wordt vervolgens ingeladen. Het resultaat: minder data, snellere analyses, en vragen die eerst onpraktisch of praktisch onmogelijk waren te beantwoorden (“alle schoolgebouwen van Nederland”), zijn ineens wél mogelijk.

Meegetest en feedback gegeven

PDOK vroeg op het forum om de demo te testen, dus ik ben aan de slag gegaan. De belangrijkste bevindingen heb ik op het forum teruggekoppeld:

  1. Huisnummers zijn strings. huisnummer BETWEEN 1 AND 3 leverde ook huisnummers 10, 122 en 137 op omdat er alfabetisch wordt vergeleken in plaats van numeriek.
  2. Te lange filters geven geen foutmelding. Bij lange URL’s (in het geval van de test zo’n 1.400 BAG-identificaties in een IN-lijst) verbreekt de verbinding zonder foutmelding.
  3. Toegestane waarden zijn niet gedocumenteerd. Velden als gebruiksdoel en status hebben een vaste waardenlijst, maar die zijn via de API niet op te vragen en alleen in de API-documentatie te vinden. Dat maakt het voor ‘gewone’ gebruikers lastig in gebruik.

Leuk om te zien dat PDOK het eerste punt gelijk heeft opgepakt.

Zo gaat het eruitzien in pdokr

Op mijn ontwikkelmachine werkt het al: pdok_read() krijgt een filter-parameter. Je kunt straks filteren in R-stijl — zoals je van dplyr gewend bent, maar de server doet het werk — of een ruwe CQL2-query meegeven:

# R-stijl: vertrouwde syntax, uitgevoerd op de server
panden <- pdok_read(
  "kadaster/bag", "pand",
  filter = bouwjaar < 1900
)

# of als ruwe CQL2-query
adressen <- pdok_read(
  "kadaster/bag", "adres",
  filter = "huisnummer BETWEEN 1 AND 3"
)

Het is nog werk in uitvoering en de filterfunctionaliteit zit nog niet in de productie-API, maar dit is hoe het in de package waarschijnlijk zal werken.

Hoe verder?

De demo draait tot 5 oktober op een apart endpoint (v2-demo). Daarna is het aan PDOK om de CQL2-functionaliteiten in de reguliere API te implementeren. Ik hoop dat dat — inclusief de aangedragen suggesties — snel gaat gebeuren, want het maakt het werken met écht grote geodatasets een stuk makkelijker!

Zodra dat het geval is volgt een nieuwe pdokr-release.