CQL filter met WFS

Intro: WFS CQL filters om geodata te bevragen

Eerder schreef ik al hoe je response paging kan gebruiken om geodata in brokken op te vragen van een WFS, zonder dat er te veel data in 1 keer terugkomt. Ook als die WFS heel veel data aanbiedt.

Het WFS protocol kent nog meer manieren om gegevens te bevragen. Dat kan op basis van de BBOX-parameter, voor een bepaald gebied bijvoorbeeld. Maar ook met behulp van zogenaamde filters op andere attributen. WFS gebruikt hiervoor het gestandaardiseerde protocol Filter Encoding, van het OGC. Voor de mensen met SQL-kennis: de Filter encoding kan je conceptueel vergelijken met de WHERE-clause van een SQL commando. Dit soort filters moeten in een XML taal opgegeven worden. Soms is dat wat omslachtig.

CQL Filters

GeoServer is open source software, waarmee je geodata via WFS beschikbaar kan stellen (en nog heel, heel veel meer, maar dat is hier even niet relevant). Geoserver ondersteunt de standaard OGC Filter encoding. Maar ook een kortere notatie, die van CQL filters. Zie de documentatie van Geoserver over CQL filters.

Hoewel het niet standaard WFS functionaliteit is, ondersteunen de PDOK WFS services deze CQL filter encoding wel.

Voorbeeld: BAG Verblijfsobject opvragen met postcode en huisnummer

Laten we dit eens gebruiken om de BAG WFS van PDOK te bevragen. Via Twitter kwam de vraag binnen hoe je een BAG verblijfsobject met postcode en huisnummer kan opvragen. De BAG verblijfsobjecten hebben een attribuut “postcode” en “huisnummer” dat we hiervoor gaan gebruiken.

Als CQL filter om toe te voegen aan een WFS GetFeature request, voor een vebrlijfsobject met postcode 3512JE en huisnummer 21, het adres van de Domtoren in Utrecht:

cql_filter=(huisnummer=21 and postcode=’3512JE’)

In een volledig WFS request, waarbij bepaalde tekens als haakjes hierboven in zogenaamde URL encoding staan:

//geodata.nationaalgeoregister.nl/bag/wfs?&REQUEST=GetFeature&SERVICE=WFS&VERSION=2.0.0&TYPENAME=bag:verblijfsobject&SRSNAME=EPSG:4326&OUTPUTFORMAT=json&cql_filter=%28huisnummer=21%20and%20postcode=%273512JE%27%29

Bovenstaand voorbeeld geeft toevallig twee (GeoJSON) resultaten terug, omdat er op 3512JE en huisnummer 21 twee objecten zijn: eentje zonder een huisletter / toevoeging (3512JE 21) en eentje met een huisletter (3512JE 21A).

Let op!

Een paar punten van aandacht:

  1. soms kan je het een WFS moeilijk maken door lastige filters op te stellen. Bijvoorbeeld als de database die de WFS ontsluit niet overal (goede) indexen op heeft staan. Het antwoord kan dan lang duren. En dat lijkt in bovenstaand BAG-voorbeeld het geval te zijn.
  2. als je de CQL filter parameter gebruikt, kan je niet tegelijkertijd ook de BBOX parameter gebruiken.

Meer informatie: