Wijk en Buurt informatie opvragen d.m.v. Straat zoekopdracht

Hoi, voor een tool die wij ontwikkelen willen wij graag weten welke wijk(en) en buurt(en) bij een straat behoren. Neem ter voorbeeld de Nieuwe Binnenweg in Rotterdam.

Deze doorkruist drie buurten: Oude Westen, Middelland en het Nieuwe Westen.
En twee wijken: Delfshaven en Rotterdam Centrum.

Door zoekopdrachten (via de locatieserver suggest) uit te voeren op specifieke adressen in een straat kunnen we er natuurlijk achter komen. Maar in het kader van het verzamelen van statistieken zouden we idealiter deze data al willen achterhalen op basis van alleen de straat als gegeven.

Voor context: Via onze tool kunnen gebruikers hun interesse kenbaar maken voor specifieke woningen of straten. Maar qua statistieken willen we ook laten zien hoeveel mensen interesse hebben in de Buurt / Wijk waarin het deel van de straat zich bevindt. Wanneer een woning gezocht wordt in ons systeem, dan leggen we alle gerelateerde data vast en kunnen we deze statistieken invullen. Maar wanneer er alleen gezocht wordt op straatniveau, kunnen we geen Buurt / Wijk informatie vastleggen.

Wanneer een gebruiker een zoekopdracht uitvoert dan gebruiken we deze query: https://geodata.nationaalgeoregister.nl/locatieserver/suggest?fl=weergavenaam,id,type,centroide_ll,huis_nlt,huisnummer,straatnaam,postcode,woonplaatsnaam,gemeentenaam,gemeentecode,provincienaam,provinciecode,buurtnaam,buurtcode,wijknaam,wijkcode&rows=10&q=[invoer gebruiker]

Wanneer het een zoekopdracht op Straat bevat dan filteren we op type:weg.

Creatieve oplossingen zijn ook welkom! Bij voorbaat dank.

Als je van de locatieserver ook de geometrie opvraagt, krijg je bij straten en wegen een vereenvoudigde geometrie terug (meestal een lijn - check wel welk geometrietype het is, soms is het een punt…). Met die geometrie zou je een intersects kunnen opvragen op de WFS Wijken en Buurten van het CBS: Geo services - PDOK

Hoi @sbjager bedankt voor de snelle reactie! Ik schakel tussendoor met mijn ontwikkelaar (die is Portugees dus lastig om hem hier zelf te laten posten).

Het eerste stukje is hem duidelijk. In de query naar de locatieserver voegen we geometrie_ll toe en ontvangen we verschillende coördinaten die delen van de straat markeren.

Van de WFS services maken we nog geen gebruik en het is hem ook niet direct duidelijk hoe we deze informatie daar kunnen aanleveren om de Wijken en Buurten (als JSON data) terug te krijgen. Is het misschien mogelijk dat je daar een voorbeeld voor aanlevert?

Niet de ll! Gewoon in RD blijven, da’s veel makkelijker, dus de geometrie_rd opvragen.

In deze post: Gebouw omtrek maken op basis van latitude en longitude - #14 door sbjager
Geef ik een voorbeeld van een WFS request met filter op de BAG wfs. Die CBS wfs zou hetzelfde moeten werken, dus wsl kan je developer daar wel mee verder. Zo niet, moet ie ff tot maandag wachten, als ik m’n laptops weer opgestart heb :wink:

Oké! Bedankt voor het voorbeeld! Ook wij gaan er pas maandag op studeren :grinning: geniet van het weer!

1 like

Hallo @sbjager , mijn collega heeft er inmiddels naar gekeken maar geeft aan dat hij op basis van jouw voorbeeld nog steeds niet begrijpt hoe we de informatie moeten opvragen waar wij naar zoeken.

Ik ben ook bang dat ik voor ruis zorg omdat ik dingen die hij mij verteld misschien niet goed verwoord in een reactie naar jou.

Is het een mogelijkheid om deze conversatie in het Engels voort te zetten? Dan kan hij zelf direct schakelen met jou. :grimacing:

Sure, no problem! I’ll set up a quick example.

Awesome, thanks! We are curious :smile:

OK, here goes:

Search for a streetname…

https://geodata.nationaalgeoregister.nl/locatieserver/suggest?&q=Nieuwe Binnenweg, Rotterdam

{
  "response":{"numFound":1424,"start":0,"maxScore":26.588642,"docs":[
      {
        "type":"weg",
        "weergavenaam":"Nieuwe Binnenweg, Rotterdam",
        "id":"weg-df31116df439b1c7a6dcccc5ddc9a711",
        "score":26.588642},

Next request: get de details of th street found:

https://geodata.nationaalgeoregister.nl/locatieserver/v3/lookup?id=weg-df31116df439b1c7a6dcccc5ddc9a711

{
  "response":{"numFound":1,"start":0,"maxScore":15.756616,"docs":[
      {
        "type":"weg",
        "weergavenaam":"Nieuwe Binnenweg, Rotterdam",
        "id":"weg-df31116df439b1c7a6dcccc5ddc9a711",
        "identificatie":"0599300000003475",
        "geometrie_rd":"MULTILINESTRING((90503 436114,90787 436356,91546 436573,91596 436615,91629 436705,91663 436746,92106 436908),(91872 436823,92078 436898))"}]
  }}

This is where it gets a bit tricky. I don’t know what software you use, or what libraries, but the trickiness is that this requests returns a WKT (Well Known Text) geometry. But for the WFS request you’ll need a GML geometry. Best is if you use software that can properly convert between those two formats, in order to avoid mistakes. In this case, it is quite simple to just copy the coordinates and insert them into a bit of GML, in order to create the filter we want. Which looks like this:

<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
<ogc:Intersects>
<ogc:PropertyName>geom</ogc:PropertyName>
<gml:LineString  srsName="28992">
<gml:coordinates>90503 436114,90787 436356,91546 436573,91596 436615,91629 436705,91663 436746,92106 436908,91872 436823,92078 436898
</gml:coordinates>
</gml:LineString >
</ogc:Intersects>
</ogc:Filter>

You can see it’s a fairily simple bit of xml. You can either POST this to the WFS, or use GET. POST is better if you expect really large geometries, since there is a limit to what you can pass along using GET, but in this case a GET-request works fine:

https://service.pdok.nl/cbs/wb2021/wfs/v1_0?service=WFS&version=2.0.0&request=GetFeature&typename=wb2021:wijken&outputFormat=json&filter=<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc"><ogc:Intersects><ogc:PropertyName>geom</ogc:PropertyName><gml:LineString srsName="28992"><gml:coordinates>90503 436114,90787 436356,91546 436573,91596 436615,91629 436705,91663 436746,92106 436908,91872 436823,92078 436898</gml:coordinates></gml:LineString></ogc:Intersects></ogc:Filter>

The response to this request will be the following:


{
"type": "FeatureCollection",
"numberMatched": 2,
"name": "wijken",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:EPSG::28992" } },
"features": [
{ "type": "Feature", "properties": { "wijkcode": "WK059901", "wijknaam": "Rotterdam Centrum", "gemeentecode": "GM0599", "gemeentenaam": "Rotterdam", "indelingswijzigingWijkenEnBuurten": 1, "water": "NEE", "omgevingsadressendichtheid": 6294, "stedelijkheidAdressenPerKm2": 1, "bevolkingsdichtheidInwonersPerKm2": 8855, "aantalInwoners": 36600, "mannen": 18900, "vrouwen": 17695, "percentagePersonen0Tot15Jaar": 9, "percentagePersonen15Tot25Jaar": 17, "percentagePersonen25Tot45Jaar": 41, "percentagePersonen45Tot65Jaar": 21, "percentagePersonen65JaarEnOuder": 13, "percentageOngehuwd": 69, "percentageGehuwd": 21, "percentageGescheid": 8, "percentageVerweduwd": 2, "aantalHuishoudens": 21735, "percentageEenpersoonshuishoudens": 60, "percentageHuishoudensZonderKinderen": 25, "percentageHuishoudensMetKinderen": 15, "gemiddeldeHuishoudsgrootte": 1.6, "percentageWesterseMigratieachtergrond": 19, "percentageNietWesterseMigratieachtergrond": 38, "percentageUitMarokko": 6, "percentageUitNederlandseAntillenEnAruba": 1, "percentageUitSuriname": 7, "percentageUitTurkije": 4, "percentageOverigeNietwestersemigratieachtergrond": 20, "oppervlakteTotaalInHa": 488, "oppervlakteLandInHa": 413, "oppervlakteWaterInHa": 75, "jaarstatcode": "2021WK059901", "jaar": 2021 }, "geometry": { "type": "MultiPolygon", "coordinates": [ <snipped>  ] } },
{ "type": "Feature", "properties": { "wijkcode": "WK059903", "wijknaam": "Delfshaven", "gemeentecode": "GM0599", "gemeentenaam": "Rotterdam", "indelingswijzigingWijkenEnBuurten": 1, "water": "NEE", "omgevingsadressendichtheid": 5639, "stedelijkheidAdressenPerKm2": 1, "bevolkingsdichtheidInwonersPerKm2": 14907, "aantalInwoners": 76845, "mannen": 38970, "vrouwen": 37875, "percentagePersonen0Tot15Jaar": 16, "percentagePersonen15Tot25Jaar": 15, "percentagePersonen25Tot45Jaar": 35, "percentagePersonen45Tot65Jaar": 23, "percentagePersonen65JaarEnOuder": 10, "percentageOngehuwd": 65, "percentageGehuwd": 24, "percentageGescheid": 9, "percentageVerweduwd": 2, "aantalHuishoudens": 39560, "percentageEenpersoonshuishoudens": 52, "percentageHuishoudensZonderKinderen": 20, "percentageHuishoudensMetKinderen": 28, "gemiddeldeHuishoudsgrootte": 1.9, "percentageWesterseMigratieachtergrond": 14, "percentageNietWesterseMigratieachtergrond": 54, "percentageUitMarokko": 13, "percentageUitNederlandseAntillenEnAruba": 1, "percentageUitSuriname": 9, "percentageUitTurkije": 12, "percentageOverigeNietwestersemigratieachtergrond": 20, "oppervlakteTotaalInHa": 596, "oppervlakteLandInHa": 516, "oppervlakteWaterInHa": 81, "jaarstatcode": "2021WK059903", "jaar": 2021 }, "geometry": { "type": "MultiPolygon", "coordinates": [<snipped> ] } }
]
}

For brevity I’ve snipped out the actual geometries, but you do get the full geometry of the Wijken as well.
Now it depends a bit on what you want to do with this result: if you want to display it on a map as well, you can request several different coordinate systems. Check the Capabilities document and the DescribeFeatureType to see exactly which ones.

If you want the buurten as well, either combine both featuretypes in one request, or send another request using the featuretypename wb2021:buurten (feature type names can be found in the Capabilities document - always check that one…)

I use this technique in several places using Javascript and Openlayers, to show stuff on the map, or get more information about interesting bits.

HTH,
Stefan

`

1 like

Wow, thanks for your efforts!

For now, we just need to get (all the) the wijknaam, wijkcode, buurtnaam and buurtcode info from the response. So it looks like we can use exactly this to get what we need.

Implementation is pending some discussing, so if we have any questions, it might take some time for us to respond here. But I will certainly let you know the outcome.

You can add

propertyName=wijknaam,wijkcode

to the WFS request, then you’ll only get those attributes (and the geometry). Minimizes the response a bit if you don’t need it.

:slight_smile: you’re welcome! But it is mostly copy and paste from my own code, just changing a few variables here and there, so it’s not that big an effort for me.

Well, any time you spend helping us out is valuable :slightly_smiling_face:

Thanks again and @fbarrenho or myself will get back to you!

1 like

Hi @sbjager

Thank you so much for your assistance! I got a question though, if we want to reduce the request number to only one, basically querying just for the buurten info, is there any way to get back in the reply the wijknaam and wijkcode of the wijk that a buurt belongs to?

Thank you!

Best regards,
Filipe

Hi Filipe,

Partly. the featuretype buurten does contain the attribute wijkcode, but not wijknaam, so with just querying buurten you won’t get everything you want.

You can query both featuretypes at the same time, but that becomes a bit complicated: WFS then wants a filter per featuretype, and wants the propertynames listed for both featuretypes. If I try that using json as a requested response type, I actually get an error (400 bad request, but the message says internal server error, so it is wrong on all counts :wink: ). So this:


https://service.pdok.nl/cbs/wb2021/wfs/v1_0?service=WFS&version=2.0.0&request=GetFeature&typename=wb2021:wijken,wb2021:buurten&propertyName=(wijknaam,wijkcode)(buurtnaam,buurtcode)&outputFormat=json&filter=(<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc"><ogc:Intersects><ogc:PropertyName>geom</ogc:PropertyName><gml:LineString  srsName="28992"><gml:coordinates>90503 436114,90787 436356,91546 436573,91596 436615,91629 436705,91663 436746,92106 436908,91872 436823,92078 436898</gml:coordinates></gml:LineString></ogc:Intersects></ogc:Filter>)(<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc"><ogc:Intersects><ogc:PropertyName>geom</ogc:PropertyName><gml:LineString  srsName="28992"><gml:coordinates>90503 436114,90787 436356,91546 436573,91596 436615,91629 436705,91663 436746,92106 436908,91872 436823,92078 436898</gml:coordinates></gml:LineString></ogc:Intersects></ogc:Filter>)

Does not work properly. If, however, you leave out the propertynames, and use the default responseformat, you do get an answer back, so if you can also deal with GML, then try this:


https://service.pdok.nl/cbs/wb2021/wfs/v1_0?service=WFS&version=2.0.0&request=GetFeature&typename=wb2021:wijken,wb2021:buurten&filter=(%3Cogc:Filter%20xmlns:ogc=%22http://www.opengis.net/ogc%22%3E%3Cogc:Intersects%3E%3Cogc:PropertyName%3Egeom%3C/ogc:PropertyName%3E%3Cgml:LineString%20%20srsName=%2228992%22%3E%3Cgml:coordinates%3E90503%20436114,90787%20436356,91546%20436573,91596%20436615,91629%20436705,91663%20436746,92106%20436908,91872%20436823,92078%20436898%3C/gml:coordinates%3E%3C/gml:LineString%3E%3C/ogc:Intersects%3E%3C/ogc:Filter%3E)(%3Cogc:Filter%20xmlns:ogc=%22http://www.opengis.net/ogc%22%3E%3Cogc:Intersects%3E%3Cogc:PropertyName%3Egeom%3C/ogc:PropertyName%3E%3Cgml:LineString%20%20srsName=%2228992%22%3E%3Cgml:coordinates%3E90503%20436114,90787%20436356,91546%20436573,91596%20436615,91629%20436705,91663%20436746,92106%20436908,91872%20436823,92078%20436898%3C/gml:coordinates%3E%3C/gml:LineString%3E%3C/ogc:Intersects%3E%3C/ogc:Filter%3E)

Single request gets you both featuretypes. But you do need to copy the filter, which seems rather odd (and is very awkward).

Hi @sbjager

I see! I think we will just end up making the 2 requests to WFS and then post-process the results to build the data we need.

Thank you once again!

Best regards,
Filipe

Seems like we got a working solution!

P.S. the accuracy of the data is very impressive! So much, that I was corrected on my example about the Nieuwe Binnenweg:

Turns out, right at the beginning, the street actually intersects with another neighborhood; “Cool” (no pun intended).

This Data is very valuable to us :smiley:

2 likes