Een korte tutorial met CBS-postcodepunten, OSRM en Python

Van postcodes naar een kaart en reisafstand

Hoe ver is ver vanaf Amsterdam? Met postcodes, kaarten en reistijden kijken we eerst naar Amsterdam en daarna naar de reis van patiënten naar het Radboudumc.

Hoe ver is ‘ver’ vanaf Amsterdam? Als je binnen de ring woont, voelt de andere kant van de A10 misschien al als een dagtrip. Voor een retour tussen Amsterdam en een voorbeeldpostcode op Texel berekent OSRM bijna vier uur. Voor Terschelling is dat ruim zeven uur. Zelfs Vaals, op meer kilometers afstand, komt in dit voorbeeld uit op iets meer dan zes uur retour.

Wat dichtbij ligt op de kaart kan dus behoorlijk wat reistijd kosten. Dat maakt uit als je een afspraak op één plek organiseert. De kaart laat zien waar de lange reizen beginnen. Met de verdeling kun je aflezen welk deel van de groep meer dan twee uur onderweg is en onderzoeken voor wie een afspraak dichter bij huis verschil zou maken.

We gebruiken 650 openbare PC6-postcodes verspreid over Nederland. Per postcode loten we 1 tot en met 25 fictieve personen. Alle routes gaan naar 1012JS in Amsterdam.

Compleet voorbeeld (ZIP) · Stap-voor-stap bijlage · Python-script

1. Koppel de postcodes aan kaartpunten

Het voorbeeldbestand heeft twee kolommen. Dit zijn de eerste drie regels.

postcode,aantal
1032BC,11
1074VR,6
1106JZ,5

Elke PC6 krijgt een representatief punt binnen het postcodevlak uit het CBS-bestand. De download bevat de punten voor alle voorbeeldpostcodes en voor 1012JS. Voor een eigen lijst kun je rechtstreeks koppelen aan het volledige CBS-postcodebestand. BAG-adresgegevens zijn vooral relevant in een eerdere stap, bijvoorbeeld als je een ontbrekende postcode wilt reconstrueren uit straat, huisnummer en woonplaats. CBS · Kerncijfers en geometrie per postcode

Kaart van 650 voorbeeldpostcodes verspreid over Nederland met 1012JS als bestemming.
Herkomst. Grotere stippen staan voor hogere fictieve aantallen. De ster markeert 1012JS.

2. Bereken heen- en terugroutes met OSRM

OSRM gebruikt het OpenStreetMap-wegennet en draait lokaal via Docker. Python vraagt per postcode twee routes op, één in elke richting. De heenroute levert de rijafstand. De heen- en terugtijd tellen samen op tot de retourrijtijd. De bijlage bevat de installatie en de opdrachten om het voorbeeld te draaien. OSRM · Quick Start · Geofabrik · Nederland

Autoroutes vanuit de voorbeeldpostcodes naar 1012JS.
Heenroutes naar 1012JS. De lijndikte volgt het fictieve aantal per postcode.
Kaart met de berekende retourtijdklasse per voorbeeldpostcode.
Retourtijd per postcode, met vaste kleurklassen. De route begint bij een punt in het postcodevlak.

3. Bereken de uitkomsten voor de hele groep

De uitvoer bevat één regel per postcode en een status voor de koppeling en route. Voor het groepsgemiddelde vermenigvuldig je de afstand of tijd per postcode met het aantal personen. Daarna deel je de som door het aantal personen met een geldige route. Zo telt iedere persoon even zwaar.

In deze run hebben alle 650 postcodes een route. Voor de 8.457 fictieve personen komt de gewogen gemiddelde heenafstand uit op 128,7 km en de gemiddelde retourrijtijd op 222,0 minuten.

In deze fictieve groep is 85% langer dan twee uur onderweg voor een retour.

Hoe ver is dat, en hoe lang ben je onderweg?

De staven tonen hoeveel van de fictieve groep in elke klasse valt. De gekleurde lijnen markeren dezelfde vier voorbeeldpostcodes in beide grafieken.

Voorbeeldpostcode Enkele reisafstand Retourrijtijd
Texel (1791VG) 99 km 3 u 49 min
Terschelling (8881CE) 151 km 7 u 12 min
Ameland (9161BZ) 186 km 6 u 31 min
Vaals (Zuid-Limburg) (6291KJ) 230 km 6 u 10 min
Verdeling van de enkele reisafstand in stappen van 20 km met lijnen voor Texel, Terschelling, Ameland en Vaals.
Enkele reisafstand naar 1012JS. De staven zijn gewogen naar het fictieve aantal personen per postcode.
Verdeling van de retourrijtijd in stappen van 30 minuten met lijnen voor dezelfde vier voorbeeldpostcodes.
Retourtijd naar 1012JS. De lijnen hebben dezelfde kleur en stijl als in de afstandsgrafiek.
De heenroutes van Texel, Terschelling, Ameland en Vaals naar 1012JS, met de kleuren en lijnstijlen uit de histogrammen.
De vier heenroutes naar 1012JS. Iedere route heeft dezelfde kleur en lijnstijl als de bijbehorende lijn in de afstands- en reistijdverdeling.

De voorbeeldroute vanaf Terschelling is 151 km heen, tegenover 230 km vanaf Vaals. Toch schat OSRM de retourrit vanaf Terschelling ongeveer een uur langer. Voor een afspraak vanaf een eiland tellen ook de afvaart en eventuele wachttijd mee. Daarvoor heb je de actuele dienstregeling nodig.

De voorbeeldgroep is ruimtelijk gespreid en dient om de methode te laten zien. De uitkomsten hangen af van de gekozen postcodes, aantallen, bestemming en het gebruikte wegennet. Bij gevoelige invoer kun je de postcodekoppeling en routering lokaal uitvoeren en voor publicatie samengevoegde kaarten en verdelingen gebruiken.

Van postcodepunten naar een reistijdgradiënt

De hexagonkaart vat dezelfde 650 retourroutes naar 1012JS samen. Voor de ruimtelijke gradiënt telt iedere postcode één keer. De fictieve aantallen worden gebruikt voor de groepsgemiddelden en het histogram. Per hexagon, met 10 km tussen tegenoverliggende zijden, toont de kleur de mediane retourrijtijd op een doorlopende schaal. Witte gebieden bevatten geen voorbeeldpunten. De kaart vat de berekende routes samen per cel. Reistijd verandert ook met de ligging van snelwegen, bruggen en veerverbindingen.

Nederland met hexagonen ingekleurd naar de mediane retourtijd naar 1012JS, gebaseerd op 650 openbare postcodepunten.
Mediane retourrijtijd per hexagon op basis van 650 voorbeeldpostcodes. De afstand tussen tegenoverliggende zijden is 10 km. De bijlage bevat de punten en de opdrachten om deze kaart opnieuw te maken.

Hoe ver reizen patiënten naar het Radboudumc?

Nu kijken we vanuit de reiziger naar de bestemming. Hoe ver moeten patiënten rijden voor een afspraak in het Radboudumc in Nijmegen? In de groep met een berekende route is de gemiddelde afstand ongeveer 68 km heen en de geschatte gemiddelde rijtijd ruim twee uur retour. De roze ster markeert de bestemming.

De kaarten vatten de herkomstgegevens samen in hexagonen. De kaart gebruikt een vast raster van 10 km van hoek tot hoek. Een hexagon verschijnt alleen als er minstens vier verschillende postcodepunten in liggen. De aantallen staan in brede klassen. Het roze kader geeft de uitsnede van 100 × 100 km aan. De detailkaart gebruikt hetzelfde raster.

Landelijke kaart met aantallen in brede klassen per hexagon.
Geografische spreiding in een raster van 10 km. De ster markeert het Radboudumc.
Landelijke kaart met de mediane geschatte retourrijtijd per hexagon.
Reistijd naar het Radboudumc. De kleur toont de naar aantal personen gewogen mediaan per cel.
Regionale uitsnede van dezelfde kaart met mediane retourrijtijd per hexagon.
Detail van 100 × 100 km rond Nijmegen, met dezelfde cellen en kleuren als op de landelijke kaart.
Staafdiagram van de geschatte retourrijtijd in klassen van 30 minuten met een samengevoegde staart.
Reistijdverdeling voor de groep met een berekende route. De aandelen zijn afgerond op hele procenten. De langste reistijden staan samen in één klasse.

In deze praktijkanalyse is de retourrijtijd geschat als tweemaal de OSRM-tijd van de heenrit. Het downloadbare Python-voorbeeld berekent beide richtingen afzonderlijk. De verdeling telt alle geldige routes mee, ook routes uit cellen die op de kaart zijn weggelaten.

Hoe ver een reis voelt, hangt ook af van waarvoor je op pad gaat. Voor veel patiënten is een lange rit belastend, terwijl diezelfde rit voor topklinische zorg de moeite waard kan zijn. En voor een Amsterdammer is voorbij de ring misschien al ver genoeg.