Panden opvragen binnen een polygon

Beste forumlezers,

Ik heb een uitdaging, ik probeer alle panden binnen een perceel op te vragen. Nu heb ik al de polygon van een perceel via de BRK api op weten te halen alleen als ik dan via de BAG API alle panden binnen deze polygon probeer op te halen dan lukt dit niet. Het lijkt erop dat de https://api.bag.kadaster.nl/lvbag/individuelebevragingen/v2/panden endpoint alleen een point toe laat en niet een polygon? Klopt dit? en zo ja is er een slimme manier om alsnog aan alle panden komen?

Mijn uiteindelijke doel is om naast het woonhuis ook tuinhuisjes en schuren etc te kunnen vinden binnen het perceel zodat ik daar ook polygons van kan ophalen die ik op een kaart wil plotten.

Kijk eens bij 3D BAG wfs bevragen met polygoon als filter
Misschien werken de tips die daar in staan nog steeds?

Dat heeft geholpen, ik heb het inderdaad voor elkaar gekregen om panden op te vragen binnen de polygon alleen er is iets wat mij niet helemaal duidelijk is. De intersects filter werkt zoals verwacht, ik heb een polygon opgegeven van een perceel en ik krijg de 2 panden die op dit perceel staan in de lijst terug maar ook de 3 overigen panden die er net tegenaan liggen (logisch want intersect). Maar als ik dan de Contains filter gebruik dan krijg ik dus geen enkel pand terug. Enig idee hoe ik dit probleem tackle? Ik wil dus eigenlijk alleen de 2 panden binnen het perceel hebben.

Voorbeeld url mocht je zelf willen spelen:
https://service.pdok.nl/lv/bag/wfs/v2_0?service=WFS&version=2.0.0&typeName=bag:pand&SRSNAME=EPSG:28992&outputFormat=json&Filter=Geometrygml:Polygongml:outerBoundaryIsgml:LinearRinggml:coordinates131876.752+460558.591,131871.413+460555.89,131878.021+460542.779,131883.686+460531.636,131885.91+460532.77,131889.024+460534.347,131876.752+460558.591</gml:coordinates>+</gml:LinearRing></gml:outerBoundaryIs></gml:Polygon>&request=GetFeature

image

Contains betekent dat je zoekt naar panden die je keuze-polygoon bevatten. Je bent juist op zoek de relatie andersom: are within, dus de panden die binnen je keuze polygoon liggen.

Dat klinkt logisch! Alleen Within geeft helaas ook geen resultaten terug.

https://service.pdok.nl/lv/bag/wfs/v2_0?service=WFS&version=2.0.0&typeName=bag:pand&SRSNAME=EPSG:28992&outputFormat=json&Filter=<Filter><Within><PropertyName>Geometry</PropertyName><gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>131876.752+460558.591,131871.413+460555.89,131878.021+460542.779,131883.686+460531.636,131885.91+460532.77,131889.024+460534.347,131876.752+460558.591</gml:coordinates>+</gml:LinearRing></gml:outerBoundaryIs></gml:Polygon></Within></Filter>&request=GetFeature

Helaas zullen noch Contains, noch Within je in dit geval een antwoord geven. Het probleem zit hem in het feit dat de grenzen van alle betrokken polygonen op elkaar liggen, en dat zowel Contains als Within naar het hele object kijken. Overlaps geeft je wel een resultaat, maar dat geeft je ook de naastgelegen panden. Als je het Nine Intersection Model kent en begrijpt, dan is het eenvoudig te zien waarom dat zo is. Het zou erg prettig zijn als WFS een volledig filter-masker volgens 9IM zou ondersteunen, want dan zou je dit eenvoudig kunnen oplossen door alleen te kijken naar de Interiors (overigens is het dan wel een voorwaarde dat de boundaries ook echt goed op elkaar liggen - iets dat niet gegarandeerd is in verband met verschillende inwintechnieken…). Maar helaas is dat niet het geval. Hier is helaas geen simpele oplossing voor, althans, niet dat ik weet zo rechtstreeks uit de WFS in ieder geval. Je zult wat post-processing moeten doen aan de client-zijde. Een mogelijke optie daar is een kleine negatieve buffer nemen van je panden. Dan zouden je panden definitief Within je perceel moeten liggen, hoewel je daar waarschijnlijk ook weer uitzonderingen tegen zult komen.

Edit: Dat Wikipedia artikel is wel erg technisch, dit stukje van Postgis is misschien wat eenvoudiger leesbaar.

1 like

Goed gezien @sbjager, are within werkt inderdaad niet met overlappende grenzen.
Misschien dat je iets kunt doen met een if statement en alleen Overlaps neemt die bijvoorbeeld groter zijn dan 10% van het pand-oppervlak? Dan zou je naastgelegen panden kunnen uitsluiten en eventueel wat uitzonderingen tegen komen van panden die duidelijk over een perceelgrens heen gaan.
Ik weet alleen niet of je in een WFS query dit soort uitgebreide voorwaarden mee kunt geven.

Alternatief is natuurlijk de BAG als gpkg te downloaden en in bijvoorbeeld QGIS dit soort analyses te doen, dan kun je helemaal los gaan qua ruimtelijke selecties. Maar dan moet je een kleine achterstand in actualiteit voor lief nemen.

Aii, daar was ik al bang voor. Vermoedde al dat dat het geval was. Ik denk dat ik toch voor Within ga alleen dan ik het perceel polygon gewoon een klein beetje groter schaal. Ik vermoed dat ik dan de meeste gevallen wel gedekt heb. Het hoeft ook niet helemaal waterdicht en ik heb liever te weinig dan teveel panden terug in dit geval.

Voor context is het denk ik wel goed om rekening te houden (te begrijpen) dat de percelen uit de BRK en panden uit de BAG 2 verschillende objecten zijn met eigen voorwaarden qua nauwkeurigheid, kwaliteit enz… op voor de geometrie.

M.b.t. dit voorbeeld maakt het deze spatial queries dus lastiger zeker omdat de grenzen van deze objecten op elkaar lijken te liggen maar dat wiskundig niet zijn. Waardoor je dit gedrag krijgt met spatial functions als CONTAINS, WITHIN enz…

Waardoor je dit soort acties (helaas) moet toepassen.

Klopt helemaal. Eigenlijk zou je bij elke ruimtelijke operatie/analyse/vergelijking een tolerantie moeten kunnen meegeven, juist ook omdat veel software veel te veel decimalen achter de komma opslaat. Helaas word daar nog veel te weinig rekening mee gehouden. Als je een dergelijke tolerantie combineert met het volledig ondersteunen van een 9IM-operator, dan zou dit soort bevragigen een makkie zijn, waar je met een enkel request direct het antwoord hebt dat je zoekt, zonder dat enige manipulatie of post-processing nodig is.

Kun je niet makkelijker de centroid van de panden opvragen en daarvan kijken of ze in een perceel vallen? Dan heb je wel een issue met panden die bewust over meerdere percelen vallen. Aan de andere kant, er zijn nu ook gebouwen die onbewust over meerdere percelen getekend worden (vanwege verschillende opnames), dat ben je dan weer kwijt.

Ja, dat zou het ook voor een groot deel oplossen. Alleen ondersteund de WFS dat niet direct, voor zover ik kan zien, dus dan blijf je met post-processing zitten aan de client-zijde.

Maar het zou wel kunnen: Panden ophalen met Overlaps uit WFS op basis perceelgeometrie → centroide bepalen van de Panden in het antwoord → Check of centroide binnen perceel valt of er buiten.

Moet je wel opletten dat je niet de zwaartepunt-centroide gebruikt, want die kan buiten het pand vallen (denk aan een hoefijzer-vormig pand).

1 like