INTERSECTS bij WFS gebruiken in R (studio)

Hoi,

Ik wil graag weten of op een bepaalde locatie een natura 2000 gebied aanwezig is én wat dan bijvoorbeeld de naam is van dat Natura2000 gebied. Ik heb voor de WFS service gekozen.

Ik wil dit doen met een R script.

De gekozen locatie ligt in een Natura2000 gebied. Ik verwacht alléén het polyogon te downloaden waarop het punt ligt. Helaas krijg ik alle Natura2000 gebieden als respons (209 stuks, duurd ca. 15 sec). Dat doe ik met de onderstaande code. Wat gaat er fout?

library(httr)
library(sf)
# RD coordinaten
x <- 144355.3
y <- 410903.8

url <- parse_url("https://geodata.nationaalgeoregister.nl/natura2000/wfs?")
url$query <- list(service = "WFS"
                  ,version = "2.0.0"
                  ,request = "GetFeature"
                  ,typename = "natura2000:natura2000"
                  ,srsName = "EPSG:4326"
                  ,outputFormat = "application/json"
                  ,CQL_FILTER = sprintf("INTERSECTS(geom,POINT(%s %s))",x,y)
)
request <- build_url(url)
st_read(request)

Dit heb ik al geprobeerd:

  • Alle polygonen downloaden en met functie point.in.polygon() het juiste polygon selecteren. (Dit is natuurlijk niet wat men wil)
  • Een kleine BBOX toepassen. Ook hier download hij alle polygonen.

Alvast bedankt,

Lennart Jongen

Hoi @Lennart,

De Natura2000 WFS is een MapServer implementatie die geen CQL_FILTER ondersteund. Vervelend is dat de webservice geen indicatie teruggeeft dat de CQL_FILTER query param niet werkt.

Aan het CQL_FILTER vs WFS native filters zijn overigens al meerdere forum topics gewijd. Vooralsnog kan je bepalen of een PDOK service met MapServer is geïmplementeerd door het service accespoint te bevragen zonder query parameters:

https://geodata.nationaalgeoregister.nl/natura2000/wfs?

Als de response No query information to decode. QUERY_STRING is set, but empty. is, dan weet je zeker dat het een MapServer implementatie betreft en dan werken de CQL_FILTERS niet. Anders is het (waarschijnlijk) een GeoServer implementatie en dan werken de CQL_FILTERS wel. Helemaal waterdicht is deze methode niet en het kan zijn dat we onze MapServers in de toekomst anders gaan africhten.

Daarom raad ik aan om overal WFS native filters te gebruiken, die werken in principe op alle services. Ook omdat we op termijn al onze services naar MapServer gaan migreren.

Met een WFS native filter wordt je request dan (coördinaten punt in EPSG:4326, je query geometrie moet kennelijk in dezelfde projectie staan als de output projectie) :

https://geodata.nationaalgeoregister.nl/natura2000/wfs?service=WFS&version=2.0.0&request=GetFeature&typename=natura2000:natura2000&srsName=EPSG:4326&outputFormat=application/json&Filter=<Filter><Contains><PropertyName>geom</PropertyName><gml:Point><gml:coordinates>5.233268,51.686818</gml:coordinates></gml:Point></Contains></Filter>

Bovenstaand request resulteert in 1 feature in de response.

2 likes

@antonbakker Super bedankt, het werkt! En bedankt voor de uitleg!

1 like