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.