Bestemmingsvlakken met link naar text opvragen voor adres met geofilter

Ik probeer gericht bestemmingsplannen voor een adres op te vragen. En dan alleen het bestemmingsvlak van dit plan wat op deze locatie van toepassing is. Het doel is uiteindelijk om de text uit het bestemmingsplan voor een gegeven locatie in python in te kunnen laden, en dan dus alleen voor de bestemmingsvlakken die van toepassing zijn.

Wat ik nu probeer te doen:

  1. adres - > coordinaten
  2. perceel opvragen van deze coordinaten: service.pdok.nl/kadaster/kadastralekaart/wfs/v5_0
  3. Bestemmingplannen zoeken die binnen de gegeven geometrie vallen.
  4. Bestemmingsvlakken binnen elk gevonden plan zoeken die binnen de gegeven geometrie vallen.
  5. Uit de response de urls naar de tekst halen.

Het probleem is dat filteren met het type ‘Point’ werkt, maar type ‘Polygon’ niet. Bij de laatste krijg ik een 500 error terug.

Voorbeeld van zo’n request:
response = requests.post(
url=“https://ruimte.omgevingswet.overheid.nl/ruimtelijke-plannen/”
f"api/opvragen/v4/plannen/{plan_id}/bestemmingsvlakken/_zoek",
headers={
‘content-crs’: RDS,
‘accept-crs’: RDS,
‘x-api-key’: R_PLANNEN_API_KEY,
},
json={
“_geo”: {
“intersects”: {
“type”: “Polygon”,
“coordinates”: [c for c in polygon.exterior.coords]
}
},
}
)
content = response.json()
print(json.dumps(content, indent=2))

Dit geeft:

{
“title”: “Internal Server Error”,
“status”: 500,
“detail”: “An internal server error has occurred!”
}

Kan iemand mij:

  1. vertellen of dit de juiste manier is om dit te bereiken, het lijken nogal veel requests voor dit doel
    en
  2. of de 500 error aan mijn request ligt of de server?

Het antwoord op je tweede vraag is dat dit een fout aan de server zijde is. De kans is vrij groot dat de server niet om kan gaan met het request dat je stuurt.

Om deze fout te kunnen reproduceren, zou het handig zijn als je aan kan geven wat de waarden van de requests headers (API key natuurlijk niet hier delen, die hebben we niet nodig) en de inhoud van de requestbody zijn. Dat is niet af te leiden uit je code snippet.

url=‘https://ruimte.omgevingswet.overheid.nl/ruimtelijke-plannen/api/opvragen/v4/plannen/NL.IMRO.0363.K1005BPSTD-VG01/bestemmingsvlakken/_zoek’

headers={‘content-crs’: ‘epsg:28992’, ‘accept-crs’: ‘epsg:28992’, ‘x-api-key’: ‘’}

json={’_geo’: {‘intersects’: {‘type’: ‘Polygon’, ‘coordinates’: [[120242.987, 485386.345], [120234.078, 485382.542], [120239.908, 485368.91], [120248.84, 485372.718], [120242.987, 485386.345]]}}}

Een collega heeft het uitgezocht. Er zijn twee problemen:

  1. Er ontbreekt een set blokhaken in de coordinates van de geojson.
  2. De geojson is dus invalide, en had een 400 respons moeten opleveren ipv de 500 die je nu krijgt. Hiervoor is een ticket aangemaakt.
1 like

Aha de blokhaken lossen het inderdaad op. Bedankt voor de snelle reactie!

1 like

Zou een 422 - Unprocessable Content in dit geval niet beter zijn dan een 400 - Bad Request?
Tenslotte is het request goed, alleen de payload is niet correct
 Goed lezend sluit 422 ook niet helemaal aan, maar de korte beschrijving sluit (voor mij althans) beter aan bij het probleem in dit voorbeeld


Dat ligt er aan hoe je de uitleg van de 422 interpreteert:

The HyperText Transfer Protocol (HTTP) 422 Unprocessable Content response status code indicates that the server understands the content type of the request entity, and the syntax of the request entity is correct, but it was unable to process the contained instructions.

the syntax of the request entity is correct 
 en wat valt er dan onder “syntax”?

DSO API strategie zegt er het volgende over:

422: Gebruikt voor een verzoek (body) dat correct is maar dat de server niet kan verwerken.

Is het dan de opbouw van de requestbody (wel correct, want alle keys zitten er in), of ook de waarden (niet correct, want invalide geoJSON) waar je de respons code op baseert?

Zoals je leest, kan ik beide respons codes beargumenteren. Als iemand hier met goede onderbouwing een keuze in kan maken, kunnen we die volgen. Anders wordt het voor dit geval toch een 400

1 like

:grin: dat is precies wat ik bedoelde met “Goed lezend sluit 422 ook niet helemaal aan”.

Als je alleen naar de korte omschrijving kijkt (“Unprocessable Content”), vind ik dat beter passen bij dit specifieke voorbeeld. Als je naar de uitgebreidere omschrijving kijkt, dan klopt het weer niet, want persoonlijk vind ik ook dat die twee (dus de korte beschrijving en de lange uiitleg) niet bij elkaar passen voor 422, semantisch gezien.

Dus laat het maar bij 400 ( hoewel 418 ook nog wel toepasselijk zou kunnen zijn, en in ieder geval meer humor heeft :wink: ).
Dat debat hoeven we hier niet echt te herhalen denk ik, het viel me alleen op dat er voor een geval als dit ( waarbij het request op zich correct is, en dus een 200 zou moeten geven, maar de payload niet correct is, en dus een 500 veroorzaakt tenzij die afgevangen word - je ziet in dergelijke gevallen ook nog wel eens dat je wel een 200 terug krijgt, maar met een error message als payload - zou ook nog een optie kunnen zijn
 ) eigenlijk geen goede http-code is.

Het gebruik van 418 (“teapot”) kan in de context van de Omgevingswet | het DSO ook wel tot verwarring leiden


Besten,

Voor een uitbereiding van IFC Site maker
wil ik eigenlijk hetzelfde doen als Tim1 hierboven. Maar dan vanaf stap 3.

Ik heb dus een gegeven geometrie/coordinaten (bbx).
Graag zou ik opvragen welke bestemmingsplannen hierop geldend zijn. In andere plannen ben ik vooralsnog niet geĂŻnteresseerd.

Met de namen/codes van die plannen zal ik dan vervolgens nieuwe aanvragen doen om de bestemmingsvlakken/bouwvlakke etc. boven tafel te krijgen.

Is er iemand die mij een voorbeeldje kan geven van een request die daar toe zou leiden?

Bij voorbaat hartelijk dank,

Thomas Broos
Moondoor B.V.

Heb je hier al naar gekeken: ReDoc Interactive Demo

Beste Bart,

dank voor je snelle antwoord allereerst. Ik heb daar inderdaad vooraf naar gekeken. Wel moet ik bekennen dat ik de “expand” parameter helemaal over het hoofd heb gezien. Dank dus wederom.

Wel heb ik nog steeds vraagtekens over hoe ik dan een bbox of andere vorm als input meegeef. Bij de verklaring staat namelijk:

Array of strings
Items Enum: “geometrie” “bbox”

Ik geloof dus dat ik daar als input maar keuze heb uit twee specifieke woorden, terwijl ik eerder de input van getallen (x en y van ruimtelijke punten) zou verwachten.

Specifieker dus: hoe voer ik mijn bbox in, en doe ik dat inderdaad bij “expand”?

Alvast bedankt,

Thomas

Je moet een POST doen, met de volgende payload:
(Overigens houd hier mijn technische kennis wel zo’n beetje op, maar er zijn hier genoeg anderen die je verder kunnen helpen
)

Volgensmij kun je gewoon mijn voorbeeld overnemen en in plaats van Polygon, Point gebruiken. En natuurlijk de endpoint voor bestemmingsplannen gebruiken ipv bestemmingsvlakken.

Beste Bart,

Wederom dank hiervoor. Ik ben bij de GET opdrachten gaan kijken, omdat ik iets wil opvragen, niet wil achter laten. Echter, je methode werkte. Ik krijg nu allerlei plannen terug voor ergens in Enschede uit mijn hoofd.

Toch: als ik vervolgens -van welk plan ik dan ook vind met deze methode- met de methoden daaronder bestemmingsvlakken of bouwvlakken probeer op te vragen, krijg ik steeds geldige (200) maar lege resultaten. Ik had natuurlijk op meer gehoopt.

Omdat daar in de voorbeelden wordt gewerkt met {planId} , in plaats van een daadwerkelijk planID, kan ik ook deze niet nabootsen als test:
GET /plannen/{planId}/bestemmingsvlakken en POST /plannen/{planId}/bestemmingsvlakken en POST /plannen/{planId}/bestemmingsvlakken/_zoek

Is er iemand die mij verder kan helpen? Kort gezegd wil ik graag bestemmingsvlakken en bouwvlakken opvragen die voor bepaalde coordinaten / bbox geldig zijn.

Mvg, Thomas

Beste Tim,

Kan je mij vertellen waar je uiteindelijk die blokhaken hebt geplaatst? Ik zou het liefst jouw voorbeeld uitproberen namelijk.

Mvg, Thomas

Request 1

POST {{baseUrl}}/plannen/_zoek

met BODY:

{
“_geo”: {
“contains”: {
“type”: “Point”,
“coordinates”: [
5.14499,
51.79585
]
}
}
}

levert als resultaat onder andere een plan met planID: NL.IMRO.0297.BGBBP20130009-VS02

Request 2

POST {{baseUrl}}/plannen/NL.IMRO.0297.BGBBP20130009-VS02/bestemmingsvlakken/_zoek

met dezelfde body
levert (onder andere) bestemmingsvlakken op.

1 like

Hoi Bart,

Dank voor je aanhoudende hulp. Inmiddels heb ik -inclusief de “expand”: “geometrie” parameter- de boel aan de praat gekregen. Het was me even zoeken, maar ik krijg nu resultaten waar ik iets mee kan. Mijn dank is groot.

Met vriendelijke groet,
Thomas

1 like