Hoi Teun,
OK, eerst een beetje achtergrond:
WFS staat voor Web Feature Service. Dat is een webservice die specifiek ruimtelijke gegevens in een vector-formaat publiceert. Je stuurt zo’n WFS-service aan door middel van url query string parameters, in het formaat naam=waarde. Je krijgt dan een bestandje terug dat de opgevraagde informatie bevat in een bepaald formaat, de default van de huidige PDOK services is GML (een geo-specifieke XML versie). Dat is makkelijk door bijvoorbeeld javascript te lezen en gebruiken, maar ook voor eigenlijk wel alle GIS software. Maar je kunt opgeven wat je graag terug wil krijgen, zie onder in het voorbeeld.
Deze webservices moeten zogeheten Capabilities-documenten publiceren, waarin je kunt vinden wat ze precies publiceren. Deze moet je eigenlijk altijd raadplegen voordat je ze daadwerkelijk gaat gebruiken.
De Basisregistratie Adressen en Gebouwen (BAG) kun je raadplegen door middel van zo’n WFS. In de BAG vind je Panden, daar ben je al enigszins mee bekend. In een Pand liggen 1 of meer Verblijfsobjecten (denk bijvoorbeeld aan een gebouw met 4 appartementen: dan heb je 1 Pand met 4 Verblijfsobjecten er in). Het zijn de Verblijfsobjecten die een adres hebben (elk appartement in ons Pand heeft immers meestal z’n eigen adres). Jij bent op zoek naar ‘het’ adres van een Pand, dus dan moet je opzoeken welk Verblijfsobject zich in dat Pand bevind (zoals gezegd, het kunnen er dus meer zijn - dan zul je moeten kiezen wat je daarmee doet - of je alleen de eerste neemt, of allemaal, of nog iets anders). Overigens kan het ook voorkomen dat 1 Verblijfsobject in meerdere Panden ligt, maar door de zoekmethode die ik ga beschrijven zul je daar in jouw geval weinig last van hebben. Als je meer wil weten over het datamodel van de BAG, dan gebruik ik meestal de Praktijkhandleiding BAG. En je kunt natuurlijk altijd hier vragen stellen
Dat als een beetje achtergrond. Nu jouw specifieke vraag: hoe vind ik het adres bij een pand? In het Capabilities-document van de BAG WFS vind je onder andere het featuretype bag:verblijfsobject, en als je de describeFeatureType functie gebruikt, zie je dat een Verblijfsobject een attribuut pandidentificatie heeft. Omdat jij al de identificatie’s van je Panden hebt, is het vrij eenvoudig om alle Verblijfsobjecten op te vragen waarvan het attribuut pandidentificatie een bepaalde waarde bevat. Via de BAG WFS doe je dat als volgt:
https://service.pdok.nl/lv/bag/wfs/v2_0 Basis url BAG WFS, deze kun je hier vinden.
Er zijn bij WFS een aantal verplichte query parameters bij een WFS:
service=wfs Het servicetype dat je wil bevragen.
version=2.0.0 De versie die je wil gebruiken - ik neem altijd de laatste, dus 2.0.0.
request=getfeature Het soort request dat je wil uitvoeren - zie ook de Capabilities url, daarbij is de waarde van deze parameter “getcapabilities”.
Nu iets specifieker voor jouw vraag:
typename=bag:verblijfsobject We zijn op zoek naar een verblijfsobject, dus we willen het featuretype bag:verblijfsobject raadplegen.
outputFormat=application/json In dit geval vraag ik de output op in Json. Maar je kunt ook tekst, of xml kiezen, als je dat makkelijker vind, of als dat beter werkt met jouw applicatie.
filter= De inhoud van deze query parameter is een stukje xml, waarmee we aan de server vertellen dat we specifiek op zoek zijn naar een Verblijfsobject met een specieke identificatie. In mijn eerdere post liet ik dit stukje xml al zien.
Als we dit nu allemaal bij elkaar voegen, dan krijgen we een url die er zo uit ziet:
https://service.pdok.nl/lv/bag/wfs/v2_0?service=wfs&version=2.0.0&request=getfeature&typename=bag:verblijfsobject&outputFormat=application/json&filter=<fes:Filter xmlns:fes="http://www.opengis.net/fes/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0/wfs.xsd"><fes:PropertyIsEqualTo><fes:PropertyName>pandidentificatie</fes:PropertyName><fes:Literal>0518100001626948</fes:Literal></fes:PropertyIsEqualTo></fes:Filter>
Als je die vervolgens in je browser uitvoert, kun je ook zien wat er terug komt:
{
"type": "FeatureCollection",
"numberMatched": 1,
"name": "verblijfsobject",
"crs": {
"type": "name",
"properties": {
"name": "urn:ogc:def:crs:EPSG::28992"
}
},
"features": [
{
"type": "Feature",
"id": "verblijfsobject.ec4e2998-2042-4dd5-b6bb-3ae6a1650efd",
"properties": {
"identificatie": "0518010001626949",
"rdf_seealso": "http://bag.basisregistraties.overheid.nl/bag/id/verblijfsobject/0518010001626949",
"oppervlakte": 151,
"status": "Verblijfsobject in gebruik",
"gebruiksdoel": "industriefunctie",
"openbare_ruimte": "Van der Kunstraat",
"huisnummer": 14,
"huisletter": "A",
"toevoeging": "",
"postcode": "2521BB",
"woonplaats": "'s-Gravenhage",
"bouwjaar": 2011,
"pandidentificatie": "0518100001626948",
"pandstatus": "Pand in gebruik"
},
"bbox": [
81752.225,
453527.608,
81752.225,
453527.608
],
"geometry": {
"type": "Point",
"coordinates": [
81752.225,
453527.608
]
}
}
],
"bbox": [
81752.225,
453527.608,
81752.225,
453527.608
]
}
En hier kun je vervolgens gemakkelijk het adres uit halen.
Let op dat als je software gebruikt die over een aantal panden heen loopt, dat je alleen de waarde in de <fes:Literal>
tag hoeft te vervangen - de rest van de url en query parameters kunnen gelijk blijven.
Let ook op dat je alleen het numerieke gedeelte van de identificatie neemt, dus niet nl.imbag.pand.0518100001626948 maar alleen 0518100001626948 gebruiken (inclusief voorloopnul! Dus niet als int of zo definieren, maar als string).
En let er op dat als je je filter vergeet, dat je in theorie alle 9 miljoen (of zo - ergens rond de 9 miljoen) adressen zou terugkrijgen. PDOK heeft dat beperkt tot (ik meen) 10.000, om overbelasting te voorkomen, dus het zal zo’n vaart niet lopen, maar je wil ook niet zo’n bak aan data in 1 keer ophalen.
Hopelijk is het zo een beetje duidelijker. Ik denk dat je hiermee wel verder kunt, maar als je nog vragen hebt - stel ze gerust! Daar is het GeoForum voor
Succes,
Stefan