Ik was benieuwd of er een mogelijkheid is om inwonersaantallen binnen een polygon op te vragen. Het mooiste zou zijn binnen een viewer zoals PDOK o.i.d., maar ik heb ook beschikking tot QGIS.
Da’s een beetje erg open vraag. Inwonersaantallen gaan over het algemeen over een gemeente, stad, dorp of zoiets. Maar het klinkt alsof je op zoek bent naar iets waarmee je een willekeurige polygoon kunt tekenen, en dan opvragen hoeveel mensen er binnen die polygoon geregistreerd staan als daar wonend. Het probleem daarmee is dat je dat met de beschikbare open data niet zo eenvoudig kunt doen.
Als je 't op woonplaatsniveau doet bijvoorbeeld, hoe tel je dan het inwonersaantal van een woonplaats die maar gedeeltelijk door je polygoon word overlapt mee?
Dat gezegd hebbende: Zelf zou ik waarschijnlijk er voor kiezen om de WFS van de CBS-Postcode6 gebieden te bevragen. Daar kun je rechtstreeks je polygoon naar toe gooien, en dan krijg je alle Postcode6-gebiedjes terug - die hebben een attribuut aantalInwoners. Die kun je dan vervolgens bij elkaar optellen, al of niet gecorrigeerd voor de mate van overlap (die je overigens wel zelf zult moeten berekenen, dat krijg je niet terug van de WFS). Dan heb je de meest gedetailleerde variant, waarbij je overigens vooral in buitengebieden wel moet oppassen. Als je polygoon bijvoorbeeld het noordelijke deel van CBS postcodegebied 1647CD raakt, dan is dat voornamelijk weiland. Het inwonersaantal daarvan zit in een stukje lintbebouwing door het midden van dat gebied, en dat soort zaken zorgt dus voor een vertekening van het beeld. Dat is het gevaar van een creëren van gebieden op basis van interpolatie van een verzameling punten…
Idealiter zou je dus uit de BAG alle VBO’s met een postcode halen, en die verzameling punten onder je polygoon leggen. Overlaps kun je dan aan de hand van postcode opzoeken in de CBS dataset om het inwonersaantal op te halen. Op die manier ben je een stuk nauwkeuriger en betrouwbaarder, en vermijd je het weiland-probleem dat ik beschreef, maar je hebt ook aardig wat meer werk en data te verhapstukken.
Bedankt voor je uitgebreide antwoord, je verwoord het inderdaad beter dan hoe ik het had opgeschreven.
Ik dacht dat het wellicht op BAG niveau beschikbaar zou zijn (de gemeente weet tenslotte hoeveel mensen er per adres ingeschreven zijn).
Ik kwam online wel deze kaart tegen: Gemeentekaart bevolking en huishoudens Nederland
Maar die gaat ook per hele gemeente. Per wijk/postcode zou al een stuk nauwkeuriger zijn.
Je hebt me iig de goede richting in gestuurd, ik ga even hobbiën of ik wat voor elkaar krijg. Dankjewel!
Wellicht bieden de CBS vierkantstatistieken een oplossing?
https://www.pdok.nl/introductie/-/article/cbs-vierkantstatistieken-100m
Het CBS heeft het allemaal al panklaar staan:
Per 4-positie postcode:
https://opendata.cbs.nl/statline/#/CBS/nl/dataset/85640NED/table?ts=1730195036764
Per wijk & buurt:
https://opendata.cbs.nl/statline/#/CBS/nl/dataset/85984NED/table?ts=1730195153731
Je zou de benadering dan beter kunnen maken door de inwoners te verdelen op basis van het aantal BAG panden.
Dat is dus ook wat ik in tweede instantie beschrijf, alleen zou ik de VBO’s gebruiken, niet de panden.
Sorry, niet goed gelezen …
Edit: nu zie ik dat @barthuijbers dit ook gesuggereerd had, hieronder een voorbeeld van de methodiek met wat overwegingen.
Een andere optie is om de CBS vierkantstatistieken 100 m WFS te gebruiken. De WFS kan voor je een ruimtelijke filter uitvoeren om alleen de features binnen (Within) of snijdend (Intersects) met je polygon op te halen. Zie bijv. het volgende WFS request:
https://service.pdok.nl/cbs/vierkantstatistieken100m/2023/wfs/v1_0?request=GetFeature&service=WFS&typename=vierkantstatistieken100m:vierkant_100m&version=2.0.0&propertyName=vierkantstatistieken100m:aantalInwoners&outputFormat=application/json&filter=<Filter><Intersects><PropertyName>Geometry</PropertyName><gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>190583.15271569273318164 443914.7804533647140488, 190505.51984753369470127 443737.33389757265103981, 190857.64035668363794684 443548.7969320435076952, 190971.3170564879255835 443659.70102941361255944, 190852.09515181512688287 443898.1448387592099607, 190583.15271569273318164 443914.7804533647140488</gml:coordinates> </gml:LinearRing></gml:outerBoundaryIs></gml:Polygon></Intersects></Filter>
Vervolgens is het een kwestie van alle aantalInwoners
attributen optellen.
Bij deze methode moet wel worden aangetekend dat je of een overshoot hebt (bij intersects) of een undershoot (bij within) van geselecteerde features. Zie screenshot:
Intersects:
Within:
Shell oneliner voor bevragen WFS en optellen attributen:
Intersects:
curl -s "https://service.pdok.nl/cbs/vierkantstatistieken100m/2023/wfs/v1_0?request=GetFeature&service=WFS&typename=vierkantstatistieken100m:vierkant_100m&version=2.0.0&propertyName=vierkantstatistieken100m:aantalInwoners&outputFormat=application/json&filter=%3CFilter%3E%3CIntersects%3E%3CPropertyName%3EGeometry%3C/PropertyName%3E%3Cgml:Polygon%3E%3Cgml:outerBoundaryIs%3E%3Cgml:LinearRing%3E%3Cgml:coordinates%3E190583.15271569273318164%20443914.7804533647140488,%20190505.51984753369470127%20443737.33389757265103981,%20190857.64035668363794684%20443548.7969320435076952,%20190971.3170564879255835%20443659.70102941361255944,%20190852.09515181512688287%20443898.1448387592099607,%20190583.15271569273318164%20443914.7804533647140488%3C/gml:coordinates%3E%20%3C/gml:LinearRing%3E%3C/gml:outerBoundaryIs%3E%3C/gml:Polygon%3E%3C/Intersects%3E%3C/Filter%3E" |
jq "[.features[] | .properties.aantalInwoners] | add"
> 2475
Within:
curl -s "https://service.pdok.nl/cbs/vierkantstatistieken100m/2023/wfs/v1_0?request=GetFeature&service=WFS&typename=vierkantstatistieken100m:vierkant_100m&version=2.0.0&propertyName=vierkantstatistieken100m:aantalInwoners&outputFormat=application/json&filter=%3CFilter%3E%3CWithin%3E%3CPropertyName%3EGeometry%3C/PropertyName%3E%3Cgml:Polygon%3E%3Cgml:outerBoundaryIs%3E%3Cgml:LinearRing%3E%3Cgml:coordinates%3E190583.15271569273318164%20443914.7804533647140488,%20190505.51984753369470127%20443737.33389757265103981,%20190857.64035668363794684%20443548.7969320435076952,%20190971.3170564879255835%20443659.70102941361255944,%20190852.09515181512688287%20443898.1448387592099607,%20190583.15271569273318164%20443914.7804533647140488%3C/gml:coordinates%3E%20%3C/gml:LinearRing%3E%3C/gml:outerBoundaryIs%3E%3C/gml:Polygon%3E%3C/Within%3E%3C/Filter%3E" |
jq "[.features[] | .properties.aantalInwoners] | add"
655
Eventueel kan je het verschil tussen Within
en Intersects
middelen en bij de Within optellen voor een betere (maar ook nog steeds groffe) benadering. Of je polygonen aanpassen dat ze matchen met het 100m grid van het CBS
Hoe nauwkeurig deze methodiek is zou je moeten evalueren en controleren of dat voldoet voor je specifieke usecase.
Een andere optie is om relatieve oppervlakte van elke gridcel binnen je polygon te berekenen en naar rato het aantalInwoners te nemen. Daarvoor kan je m.i. beter de dataset downloaden via de ATOM service en lokaal de analyse uitvoeren.
Overigens moet je wel oppassen dat je geen NoData waardes gaat gebruiken, dus die moet je er nog wel uit filteren (kan in het WFS filter meegenomen worden). Zie ook de CBS documentatie: 4. Beschrijving cijfers | CBS
Wat betreft het uitvoeren van deze analyse in QGIS; zie: