WMS/WFS PDOK: BAG objecten met meerdere gebruiksdoelen

PDOK heeft op verzoek van gebruikers de volgende aanpassing doorgevoerd binnen de BAG WMS en WFS van PDOK:

Indien een pand of een verblijfsobject meerdere gebruiksdoelen heeft, werd bij een WFS of WMS tot vandaag het object per gebruiksdoel separaat teruggegeven. Een pand met twee gebruiksdoelen werd dus als twee aparte features teruggeven. Dit is niet vergelijkbaar met de BAG waarbij meerdere gebruiksdoelen binnen één object vallen. Om die reden heeft PDOK een aanpassing doorgevoerd zodat het object nu één keer teruggegeven wordt (met de aanwezige gebruiksdoelen binnen hetzelfde attribuut). Onderaan dit topic voorbeelden van de oude en nieuwe situatie.

N.a.v. testwerkzaamheden en raadplegen van gebruikers verwachten we geen hinder. Mocht er toch nog hinder ondervonden worden dan horen wij dit graag!

Voorbeelden

WMS oud


WMS Nieuw

Voorbeeld WFS
https://geodata.nationaalgeoregister.nl/bag/wfs?request=getFeature&service=WFS&outputFormat=json&typeName=pand&srsName=EPSG:28992&PropertyName=(identificatie,gebruiksdoel)&bbox=136860,454626,136860,454626

Response oud:

{“type”:“FeatureCollection”,“totalFeatures”:2,“features”:[{“type”:“Feature”,“id”:“pand.5677310”,“geometry”:null,“properties”:{“identificatie”:344100000017317,“gebruiksdoel”:“industriefunctie”}},
{“type”:“Feature”,“id”:“pand.5677311”,“geometry”:null,“properties”:{“identificatie”:344100000017317,“gebruiksdoel”:“woonfunctie”}}],“crs”:null}

Response nieuw:

{“type”:“FeatureCollection”,“totalFeatures”:1,“features”:[{“type”:“Feature”,“id”:“pand.5677310”,“geometry”:null,“properties”:{“identificatie”:344100000017317,“gebruiksdoel”:“industriefunctie, woonfunctie”}}],“crs”:null}

Op zich vind ik het loffelijk dat het Kadaster aan gebruikswensen tegemoet komt.

Helaas is de wijziging voor gebruikers een echte wijziging; niet alleen een toevoeging. Dat betekent dat iedereen die een applicatie heeft geschreven op deze service moet kijken of de applicatie nog compatible is met de nieuwe opzet, en eventueel de applicatie moet aanpassen.

Mijn ervaringen met dit soort “brekende” wijzigingen zijn niet positief. Het is bijzonder ontmoedigend wanneer je probeert een applicatie te ontwikkelen en bij te houden die van dit soort services gebruik maakt. In het verleden heb ik geprobeerd een applicatie (plankaartprikker.nl) in de lucht te houden op basis van de services van RuimtelijkePlannen.nl. Vanwege het grote aantal “brekende” wijzigingen heb ik dat op een gegeven moment maar opgegeven. Laten we hopen dat PDOK niet dezelfde kant opgaat.

Mijn suggestie is om dit soort wijzigingen door te voeren door een nieuwe service NAAST de oude te zetten; de oude een “DEPRECATED” vlag te geven; het gebruik van de oude te monitoren en wanneer dit voldoende is teruggelopen dan pas de oude af te sluiten.

@marco_duiker helder verhaal. We hadden de impact niet als breaking change ingeschat maar realiseren ons nu dat het voor sommigen dat toch kan zijn. Bij een volgend vergelijkbare situatie zullen we een nieuwe service naast de oude service neerzetten. Dat doen we normaliter standaard bij breaking changes (zie de webservices van de kadastrale kaart bijvoorbeeld). Excuses voor het eventuele ongemak!

Dank voor het constructieve antwoord.

Helaas is de essentie van een service dat je een dienst levert zonder dat je de klant (goed) kent. Daarmee is het eigenlijk niet goed in te schatten welke changes breaking zijn en welke niet. In mijn beleving is een goede vuistregel dat toevoegen kan zonder breaking te zijn, wijzigen of verwijderen niet.

In dit opzicht vind ik het gedachtegoed zoals dat wordt gehanteerd bij COM-objecten een goede: Bij het publiceren van een service ga je een contract aan met de gebruiker waarin je toezegt hetgeen je levert tot in lengte van dagen te blijven leveren (inclusief eventuele fouten). Daarna kun je daar altijd nog genuanceerd mee omgaan :slight_smile:.

Dat sluit goed aan bij onze insteek. Althans we houden de “oude” service een aanzienlijke tijd in de lucht en sturen regelmatig op overgaan naar de nieuwe service. Qua inschatting van dit specifieke issue dachten we een verbetering te introduceren maar de genoemde vuistregel is wel een goeie, nemen we mee bij een volgende beoordeling. Dank je! :slight_smile:

Voorheen kon ik een filter “gebruiksdoel=‘woonfunctie’” gebruiken en de waarde van “aantal_verblijfsobjecten” uitlezen om te bepalen hoeveel woningen er in een pand waren.

Sinds deze aanpassing werkt de filter niet meer in geval van meerdere gebruiksdoelen in een pand

Nu zou ik de filter “gebruiksdoel like ‘%woonfunctie%’” kunnen gebruiken wat opzich werkt als er meerdere gebruiksdoelen zijn. Helaas laat “aantal_verblijfsobjecten” het totaal voor al die gebruiksdoelen zien.

Hoe bepaal ik nu eenvoudig het aantal verblijfsopjecten PER gebruiksdoel (woonfunctie) PER pand?

Je zou misschien gebruik kunnen maken van een WFS query op verblijfsobjecten.
Als je bijvoorbeeld een pand hebt:
https://geodata.nationaalgeoregister.nl/bag/wfs?SERVICE=WFS&REQUEST=GetFeature&TYPENAMES=bag:pand&CQL_FILTER=identificatie=202100000224743

Kan je het volgende request maken, door het bagid mee te geven aan het filter:

https://geodata.nationaalgeoregister.nl/bag/wfs?SERVICE=WFS&REQUEST=GetFeature&TYPENAMES=bag:verblijfsobject&CQL_FILTER=pandidentificatie=202100000224743

waar uit je de unieke verblijfsobjecten met gebruiksdoel uit kan halen.
En als gebruiksdoel het enige is waarin je geïnteresseerd bent kan je zelf alleen die waarde opvragen (d.m.v. PROPERTYNAME=gebruiksdoel):

https://geodata.nationaalgeoregister.nl/bag/wfs?SERVICE=WFS&REQUEST=GetFeature&TYPENAMES=bag:verblijfsobject&PROPERTYNAME=gebruiksdoel&CQL_FILTER=pandidentificatie=202100000224743

<wfs:FeatureCollection xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:wfs="http://www.opengis.net/wfs/2.0" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:bag="http://bag.geonovum.nl" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" numberMatched="5" numberReturned="5" timeStamp="2017-07-06T13:48:35.665Z" xsi:schemaLocation="http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0/wfs.xsd http://bag.geonovum.nl https://geodata.nationaalgeoregister.nl/bag/wfs?service=WFS&amp;version=2.0.0&amp;request=DescribeFeatureType&amp;typeName=bag%3Averblijfsobject http://www.opengis.net/gml/3.2 http://schemas.opengis.net/gml/3.2.1/gml.xsd">
	<wfs:member>
		<bag:verblijfsobject gml:id="verblijfsobject.8474615">
			<bag:gebruiksdoel>woonfunctie</bag:gebruiksdoel>
		</bag:verblijfsobject>
	</wfs:member>
	<wfs:member>
		<bag:verblijfsobject gml:id="verblijfsobject.6627644">
			<bag:gebruiksdoel>winkelfunctie</bag:gebruiksdoel>
		</bag:verblijfsobject>
	</wfs:member>
	<wfs:member>
		<bag:verblijfsobject gml:id="verblijfsobject.5339867">
			<bag:gebruiksdoel>woonfunctie</bag:gebruiksdoel>
		</bag:verblijfsobject>
	</wfs:member>
	<wfs:member>
		<bag:verblijfsobject gml:id="verblijfsobject.2078403">
			<bag:gebruiksdoel>woonfunctie</bag:gebruiksdoel>
		</bag:verblijfsobject>
	</wfs:member>
	<wfs:member>
		<bag:verblijfsobject gml:id="verblijfsobject.1698544">
			<bag:gebruiksdoel>woonfunctie</bag:gebruiksdoel>
		</bag:verblijfsobject>
	</wfs:member>
</wfs:FeatureCollection>

Of de requesten verder specificeren door het filter via een POST request uit te breiden, zodat je resultaten per gebruiksdoel krijgt:

https://geodata.nationaalgeoregister.nl/bag/wfs?SERVICE=WFS

<wfs:GetFeature service="WFS" version="1.0.0"
  outputFormat="GML2"
  xmlns:wfs="http://www.opengis.net/wfs"
  xmlns:ogc="http://www.opengis.net/ogc"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.opengis.net/wfs
                      http://schemas.opengis.net/wfs/1.0.0/WFS-basic.xsd">
	<wfs:Query typeName="bag:verblijfsobject">
		<ogc:Filter>
			<And>    	
				<ogc:PropertyIsEqualTo>
					<ogc:PropertyName>pandidentificatie</ogc:PropertyName>
					<ogc:Literal>202100000224743</ogc:Literal>
				</ogc:PropertyIsEqualTo>
				<ogc:PropertyIsEqualTo>
					<ogc:PropertyName>gebruiksdoel</ogc:PropertyName>
					<ogc:Literal>woonfunctie</ogc:Literal>
				</ogc:PropertyIsEqualTo>
			</And>
		</ogc:Filter>
	</wfs:Query>
</wfs:GetFeature>
1 like