Van pandID/objectID naar adres gegevens

Hallo iedereen van het GEOforum dit is mijn eerste post.

Weet iemand hoe ik obv een pand ID zoals : NL.IMBAG.Pand.0518100001626948 een adres kan opzoeken?*

Ik ben bezig met een experiment voor mijn bouwkunde opleiding waarbij ik een tool maak in grasshopper die een gebied analyseert voor potentiële groendaken om water overlast tegen te gaan.
Ik heb nu per dakvlak het aantal m² en de object ID verzameld, van deze object id / pand ID wil ik het adres opzoeken.

Eerst had ik dit geprobeerd door de centroids van ieder dakvlak op te zoeken en via de reverse locatieserver, alleen merkte ik al snel dat dit inaccuraat is.

Weet iemand hoe ik obv een pand ID zoals : NL.IMBAG.Pand.0518100001626948* een adres kan opzoeken?

Alvast bedankt voor jullie hulp!!

Hoi 670593,

Welkom! Misschien zou je je naam in iets dat er een beetje vriendelijker uit ziet kunnen wijzigen? Tenslotte is niemand alleen maar een nummer, naar mijn mening :wink:

En met betrekking tot je vraag: ik zou dat via de BAG WFS oplossen. Je kunt via de WFS de verblijfsobjecten opzoeken waarvan de pandidentificatie gelijk is aan 0518100001626948, dat is vrij eenvoudig te doen. Gebruik een filter als volgt:

<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>

En dan krijg je netjes een stukje json terug met het volledige adres.

Oh, bijna vergeten: let wel op dat je voor 1 Pand meerdere verblijfsobjecten (en dus adressen) terug kunt krijgen. Denk bijvoorbeeld aan flats, bedrijfsverzamelgebouwen, gesplitste bouwwerken, enzovoorts.

voor de (school)opdracht zal het niet veel uitmaken maar hou er rekening mee dat de BAG Pandgeometrie ook de onderbouw bevat. Denk aan ondergrondse garages of een kelder naast de woning. Herkenbaar aan een mooi stuk gras/gazon op de luchtfoto wat toch overlapt met BAG pandgeometrie. In eerste instantie zal je als gebruiker kunnen denken dat de BAG Pandgeometrie niet klopt. In werkelijkheid zit een gedeelte van het pand onder de grond.
Afhankelijk van hoeveel tijd je hebt zal je de Algemene Hoogtekaart Nederland erbij kunnen pakken om te zien of (dat deel van) het pand boven of onder maaiveld ligt.
Succes!

Bedankt voor uw antwoord :slight_smile: , ik heb in RHINO de RhinoCityJson tool gebruikt:
Rhino CityJSON | Food4Rhino

Hierdoor kan ik het Json bestand met al zijn eigenschappen inladen en uitlezen met Grasshopper, ik kan van de centroids de hoogte uitlezen. Ook kan ik de sufaces filteren op type zoals dakvlakken.

Bedankt voor het antwoord :slight_smile: @sbjager Ik heb geprobeerd om de WFS aan te maken maar ik kan de parameter niet vinden in de pand

Ik heb geprobeerd om de link te maken obv uw antwoord, maar om eerlijk te zijn ben ik niet zo bekent met WFS dus ik snap niet wat ik fout doe : https://www.opengis.net/wfs/2.0/pandidentificatie=0518100001626948

Hopelijk kunt u mij helpen om de link werken te maken zodat ik de link kan gebruiken in mijn script om de adres gegevens automatisch aan te vragen.

:blush: je mag “je” zeggen hoor :wink:

Ik zal vanavond even een voorbeeldje voor je maken, ben nu even onderweg (en dus op de telefoon bezig: dat maakt het wat onhandig). Komt goed!

Super, dankjewel alvast!

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 :wink:

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 :wink:

Succes,
Stefan

2 likes

De BAG heeft naast de WFS nog een hoop andere opties om de data te verkrijgen en bevragen:

Het /adressen endpoint van de BAG individuele bevragingen API lijkt bijvoorbeeld ook de gestelde vraag te kunnen beantwoorden als je liever een REST API gebruikt: Redoc

1 like

Beste Stefan heel erg bedankt voor de uitgebreide tutorial! :slight_smile:

1 like

Hoi Robin,

Klopt inderdaad dat er meerdere wegen naar Rome zijn, zoals eigenlijk altijd in de geo-informatie: je kunt bijna altijd wel dingen op meer dan 1 manier doen.
Het nadeel van de Individuele Bevragingen API vind ik dat je een API-Key moet aanvragen. Daar heb ik er al zoveel van, dat het onoverzichtelijk begint te worden. Ik geef dus zelf altijd de voorkeur aan een open webservice. Maar dat is mijn persoonlijke voorkeur, anderen zullen daar geheid anders over denken.

Hoi Stefan,

ik probeer met jouw bericht een beetje uit de voeten te komen en heb QGIS gedownload. Ik zou ook via dit programma PAND ID’s om willen zetten naar straat hr + postcode + woonplaats. Maar ik kom er nog niet helemaal uit waar ik deze PAND’ids kan omtoveren tot adressen. En bij voorkeur dus ook meerdere tegelijk. Ik lees dat er een beperking tot 10.000 op zit, ik heb er op dit moment 400.000, maar dat zou ik eventueel in 40 stappen kunnen doen. Kun jij mij toevallig wegwijs maken welke stappen ik in QGIS moet doorlopen om van pand id naar adres te gaan?

Hallo Moos,

Welkom op het Geoforum!

In het geval dat je QGis gebruikt, zou ik uit de BAG WFS de features Pand en Verblijfsobject ophalen via Kaartlagen → Laag toevoegen → WFS laag toevoegen (sorry, heb op dit moment alleen een NL versie van QGis voor m’n neus). Vervolgens kun je die twee ruimtelijk aan elkaar knopen (in de NL-versie: Vector → Datamanagement-gereedschap → Koppel attributen op basis van plaats), om zo de attributen van Verblijfsobject aan Pand te koppelen.
Let er alleen wel op dat je meerdere Verblijfsobjecten (en dus adressen!) per Pand kunt hebben!
Dus het is misschien verstandig om de koppeling andersom te doen: Panden aan de Verblijfsobjecten knopen. Ik heb dit zelf echter nog nooit met QGis geprobeerd, dus heb daar weinig ervaring mee. Verschillende opties proberen is denk ik het advies, totdat je het resultaat rijg wat je zoekt.

400000 is een beetje veel, dus dat zou ik inderdaad in stappen doen. En ik zou ook beginnen met een klein stukje, totdat je de techniek een beetje onder de knie hebt.

Hey Stefan,

Enorm bedankt al, ik denk dat ik al op de goede weg ben. Komen deze adressen er ook als platte tekst uit dat je weet? of kan ik die dan weer downloaden zodat ik ze weer naar een excel kan kopiëren?

Nogmaals thx voor je antwoord!

Je kunt voor een WFS een DescribeFeatureType commando uitvoeren. Als je dat doet voor Verblijfsobject, da zie je dat de Verblijfsobjecten die je ophaalt de volgende attributen hebben:
geom (gml:GeometryPropertyType, nullable=) is altijd een punt voor een VBO
identificatie (string, nullable=)
rdf_seealso (string, nullable=)
oppervlakte (long, nullable=)
status (string, nullable=)
gebruiksdoel (string, nullable=)
openbare_ruimte (string, nullable=) is de straatnaam
huisnummer (long, nullable=)
huisletter (string, nullable=)
toevoeging (string, nullable=)
postcode (string, nullable=)
woonplaats (string, nullable=)
bouwjaar (long, nullable=)
pandidentificatie (string, nullable=)
pandstatus (string, nullable=)
fuuid (string, nullable=)

Dus afhankelijk van wat je precies bedoelt met ‘platte tekst’, kun je hieruit eenvoudig een adres samenstellen.

Hey Stefan,

volgens mij ben ik al wel op de goede weg maar het lukt nog niet helemaal. Want volgens mij gaat hij nu ook aan de slag met alle adressen klopt dat? Ik kan voor zover ik zie nergens bijvoorbeeld een max van 10.000 aangeven, of de ID’s die ik wil omtoveren ingeven. Sorry ik ben nog echt een leek maar ik begrijp er denk ik nog weinig van. Heb je enig idee hoe je mij verder kunt helpen dat ik van mijn groepje PAND_id’s naar adressen kan gaan?

Het hangt er een beetje van af. Je zegt dat je een aantal Pand ID’s hebt, maar hoe heb je die? Als een lijst, of alles binnen een gebied, als een shapefile, excel, of nog een andere manier?

Want wat je moet doen om te voorkomen dat je heel nederland langs loopt, is je invoer-datasets beperken. Maar hoe je dat het makkelijkste doet, is enigszins afhankelijk van hoe je je initiele data hebt. Gezien de hoeveelheid (400.000) weet ik zelfs niet zeker of QGis wel de juiste tool is om dit te doen, want dat is een aardige bak data…

En even over je screenshot: Zoals dat nu is ingesteld, koppel je bag:pand aan bag:pand. Dat is niet zo heel nuttig, 1 van de twee moet op bag:verblijfsobject staan.
Verder zou je handmatig een aantal panden kunnen selecteren, en dan het vinkje ‘Alleen geselecteerde objecten’ aanzetten. dat beperkt in ieder geval de hoeveelheid objecten die gebruikt worden.

En misschien is deze handig voor je: https://www.qgistutorials.com/nl/, specifiek: https://www.qgistutorials.com/nl/docs/3/performing_spatial_joins.html