Kadastrale kaart Amsterdam downloaden met Python

Hallo,

Ik probeer op dit moment uw service voor de eeste keer uit, maar loop tegen het volgende probleem aan.

==> Response code: 500

Ik probeer momenteel uw service aan te roepen middels de volgende (vermelde voorbeeld) code (gehost in google Colab):


import requests

data = {
  "featuretypes": [
    "perceel",
    "kadastralegrens"
  ],
  "format": "gml",
  "geofilter": "POLYGON((211417.92 475752.4800000001,212390.64000000004 
475896.12,212916.48000000004 475818.84,212879.52000000005 475360.2,212950.08000000002 
475203.12,212839.2 475065.36,212819.04 474981.36,212819.04 474877.2,212772 474857.04,212792.16 
474769.68,212832.48 474705.84,212889.6 474695.76,213010.56000000003 474685.68,213044.16 
474611.76,213030.72 474450.48,212637.6 474423.6,212708.16 473956.56,211122.24000000002 
473849.04,210453.6 473896.08,210315.84000000003 473970,211417.92 475752.4800000001))"
}

url = 'https://downloads.pdok.nl/kadastralekaart/api/v4_0/delta/custom'

response = requests.post(url, data)
print(response)
Response code: 500

Zou iemand mij op weg kunnen helpen waar ik een fout maak?

FYI: de voorbeeldcode komt van de volgende link:
https://downloads.pdok.nl/kadastralekaart/api/v4_0/ui/#/Delta%20Custom/DeltaCustomDownload

Groet,

Robbert

Hoi Robbert,

Je roept de requests.post functie verkeerd aan, zie de requests documentatie. Het volgende voorbeeld voor een post request met json payload:

r = requests.post(url, data=json.dumps(payload))

Om het werkend te krijgen met de kadastrale kaart API moet je ook nog headers toevoegen:

import requests
import json

data = {"featuretypes":["perceel","kadastralegrens"],"format":"gml","geofilter":"POLYGON((211417.92 475752.4800000001,212390.64000000004 475896.12,212916.48000000004 475818.84,212879.52000000005 475360.2,212950.08000000002 475203.12,212839.2 475065.36,212819.04 474981.36,212819.04 474877.2,212772 474857.04,212792.16 474769.68,212832.48 474705.84,212889.6 474695.76,213010.56000000003 474685.68,213044.16 474611.76,213030.72 474450.48,212637.6 474423.6,212708.16 473956.56,211122.24000000002 473849.04,210453.6 473896.08,210315.84000000003 473970,211417.92 475752.4800000001))"}

url = 'https://downloads.pdok.nl/kadastralekaart/api/v4_0/delta/custom'
headers = {'Content-Type':'application/json','Accept': 'application/json'}

r = requests.post(url, data=json.dumps(data), headers=headers)
print(r.status_code)
print(r.text)

Hi Anton,

Super bedankt voor je snelle antwoord! De request geeft nu een mooie 201 terug :slight_smile:

Opportunistisch van mij, maar heb je toevallig ook de Python code om de download te initiëren, gebruikmakend van de ontvangen PDOK download href link?

Groet,

Robbert

Hi Anton,

In navolging van bovenstaande vraag , heb ik gisteravond anders ook nog geprobeerd de data binnen te halen via de de PDOK WFS getFeature request. Na veel zoeken is het mij echter niet gelukt om de documentatie te vinden die mij laat weten wat alle mogelijke parameters zijn en/of hoe ik de parameters (bijv. BBOX) kan aanpassen.

Ik heb de volgende bronnen gebruikt:

Mijn doel is om uiteindelijk een geojson bestand te downloaden met de kadastrale perceel-grenzen van groot-Amsterdam (inclusief BRK informatie).

Zou heel tof zijn als jullie mij hiermee op weg kunnen helpen!

Groet,

Robbert

Hoi Robbert,

Ik had niets klaar liggen, maar ik heb het voorbeeld wat verder uitgewerkt. Het volgende script maakt een custom download aan, en polt hierna elke 5s of de download al klaar is. Daarna wordt het gegeneerde bestand gedownload in de huidige working directory:

import requests
import json
import time
import os
import pathlib

data = {"featuretypes":["perceel","kadastralegrens"],"format":"gml","geofilter":"POLYGON((211417.92 475752.4800000001,212390.64000000004 475896.12,212916.48000000004 475818.84,212879.52000000005 475360.2,212950.08000000002 475203.12,212839.2 475065.36,212819.04 474981.36,212819.04 474877.2,212772 474857.04,212792.16 474769.68,212832.48 474705.84,212889.6 474695.76,213010.56000000003 474685.68,213044.16 474611.76,213030.72 474450.48,212637.6 474423.6,212708.16 473956.56,211122.24000000002 473849.04,210453.6 473896.08,210315.84000000003 473970,211417.92 475752.4800000001))"}

url = 'https://downloads.pdok.nl/kadastralekaart/api/v4_0/delta/custom'
headers = {'Content-Type':'application/json','Accept': 'application/json'}

r = requests.post(url, data=json.dumps(data), headers=headers)

if r.status_code != 202:
    print("error occured creating custom download")
    print("response status: " + str(r.status_code))
    print("response body: " + r.text)
    exit(1)

response_object = json.loads(r.text)
status_path = response_object["_links"]["status"]["href"]
download_request_id = response_object["downloadRequestId"]
status_url = "https://downloads.pdok.nl" + status_path
while True:
    r = requests.get(status_url)
    status_object = r.json()
    custom_status = status_object["status"]
    print("status generating download: " + custom_status)
    if custom_status == "COMPLETED":
        download_path = status_object["_links"]["download"]["href"]
        download_url = "https://downloads.pdok.nl" + download_path
        break
    elif custom_status == "RUNNING":
        progress = status_object["progress"]
        print("progress generating download:  " + str(progress))
    else:
        break
    time.sleep(5)

if download_url:
    filename = download_request_id + '_' + os.path.basename(download_url) 
    filepath = os.path.join(pathlib.Path().absolute(), filename)
    print("downloading file " + download_url + " to " + filepath)
    r = requests.get(download_url)
    with open(filepath, 'wb') as f:
        f.write(r.content)
else:
    print("error occured generating download")

De NGR documentatie is inderdaad nogal summier over de WFS en er zitten weinig praktische voorbeelden in. Deze zijn wel op het forum te vinden. Zie bijvoorbeeld:

Voorbeeld van een WFS GetFeature request met bbox filter op de kadastralekaartv3 (bbox in EPSG:28992, de NL projectie):

https://geodata.nationaalgeoregister.nl/kadastralekaart/wfs/v4_0?version=2.0.0&request=GetFeature&service=wfs&typename=kadastralekaartv4:perceel&bbox=122079.6081,487370.4744,122250.7416,487504.8943

Je kan ook een de bbox in EPSG:4326 meegeven (let op in latlon, niet lonlat), zie https://gis.stackexchange.com/a/225537:

https://geodata.nationaalgeoregister.nl/kadastralekaart/wfs/v4_0?request=GetFeature&service=wfs&typename=kadastralekaartv4:perceel&bbox=52.373222,4.903786,52.374440,4.906286,urn:ogc:def:crs:EPSG:4326&version=2.0.0

Als je de WFS output ook in EPSG:4326 wil hebben dan voeg dan deze query parameter toe: srsname=EPSG:4326. Standaard geven de PDOK services namelijk de features terug in EPSG:28992.

3 likes

Overigens kan je met deze tool eenvoudig bbox strings genereren in elk gewenste projectie: http://bboxfinder.com/

Hi Anton,

Nogmaals dank voor het delen van de code. Als beginnende Pythoneer help je mij (maar ik denk ook vele anderen nieuwkomers) hier enorm mee!

Ik heb mbt tot de Python code nog 2 vragen om volgens mij daarna helemaal onafhankelijk aan de slag te kunnen.

  1. Als je kijkt naar de variabel ‘data’, dat fungeert als geofilter voor de API-request, wat is de meest gangbare/gebruikelijk manier om je eigen custom geo-filter te maken? Ben jij bekend met een tool die ik hiervoor kan gebruiken?

  2. Bij het downloaden van het bestand ontvang ik een (voor mij ongebruikelijk) GML bestand. Welke methode (of beter code) gebruik jij om dit bestand te converteren naar een GeoJson bestand?

Groet,

Robbert

Dit topic is 180 dagen na het laatste antwoord automatisch gesloten. Nieuwe antwoorden zijn niet meer toegestaan.

Naar aanleiding van een persoonlijk berichtje heb ik de code hierboven herschreven in een generieker Python tooltje, voor alle PDOK download APIs. Resultaat staat hier: Python CLI for creating full custom downloads on the PDOK download API · GitHub

Om ook nog even in te gaan op de vragen van @Robbert-cloud (ook al is dat meer dan drie jaar geleden):

  1. het geofilter dient een Polygon of Multipolygon in WKT formaat te zijn (zie de api-docs). Er is een QGIS plugin om geometrien als WKT te exporteren: Get WKT — QGIS Python Plugins Repository
  2. eenvoudigste manier is om de gml data in QGIS in te laden en vanuit daar te exporteren naar een bestandsformaat naar keuze. Als je comfortabel bent met de commandline kan je ogr2ogr gebruiken