# Van 650 postcodes naar reistijd en een kaart

De voorbeeldpostcodes zijn openbare Nederlandse PC6-codes. Ze zijn ruimtelijk gespreid geselecteerd uit het CBS-bestand 2025, met zoveel mogelijk verschillende vakken van 15 km. De gewichten zijn onafhankelijk getrokken met seed 1012, als gehele getallen van 1 tot en met 25. De bestemming is het representatieve punt van postcode **1012JS** in Amsterdam. [CBS · Kerncijfers en geometrie per postcode](https://www.cbs.nl/nl-nl/dossier/nederland-regionaal/geografische-data/gegevens-per-postcode)

## 1. Pak de bestanden uit

- `postcodes.csv` bevat 650 postcodes en hun fictieve aantallen.
- `postcodepunten.csv` bevat lengte- en breedtegraden voor de herkomstpostcodes en 1012JS.
- `grenzen.geojson` bevat vereenvoudigde gemeentegrenzen als kaartachtergrond.
- `reisafstand.py` rekent en tekent. `requirements.txt` bevat de Python-pakketten.

## 2. Start OSRM

Open Docker Desktop of start de Docker-daemon. Voer onderstaande opdrachten uit in een map voor het wegennet. Gebruik dezelfde image voor alle stappen. Noteer voor reproduceerbaarheid de gebruikte imageversie en de datum van het OSM-bestand. [OSRM · Quick Start](https://github.com/Project-OSRM/osrm-backend#quick-start) · [Geofabrik · Nederland](https://download.geofabrik.de/europe/netherlands.html)

```bash
curl -fLO https://download.geofabrik.de/europe/netherlands-latest.osm.pbf
image=ghcr.io/project-osrm/osrm-backend
docker run --rm -v "$PWD:/data" "$image" osrm-extract -p /opt/car.lua /data/netherlands-latest.osm.pbf
docker run --rm -v "$PWD:/data" "$image" osrm-partition /data/netherlands-latest.osrm
docker run --rm -v "$PWD:/data" "$image" osrm-customize /data/netherlands-latest.osrm
docker run --rm -p 127.0.0.1:5000:5000 -v "$PWD:/data" "$image" osrm-routed --algorithm mld /data/netherlands-latest.osrm
```

Laat de laatste opdracht draaien. Bij een volgende run volstaat die laatste opdracht als het voorbereide wegennet nog in dezelfde map staat.

## 3. Draai het voorbeeld

Open een tweede terminal in de uitgepakte voorbeeldmap. De opdracht gebruikt de meegeleverde punten.

```bash
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt
python reisafstand.py
```

De map `uitvoer/` bevat de route-CSV en zes PNG-figuren voor dit voorbeeld. `afstand-verdeling.png` gebruikt klassen van 20 km, `verdeling.png` klassen van 30 minuten. De gekleurde lijnen tonen de voorbeeldpostcodes op Texel, Terschelling, Ameland en in Vaals als die in de invoer voorkomen. Dezelfde kleuren en lijnstijlen staan op de kaart `voorbeeldroutes.png`. `heen_km` is de afstand van de gekozen heenroute. `retour_min` telt de apart berekende heen- en terugtijd op. OSRM schat autorijtijd op basis van het wegennet en het gebruikte profiel. Reistijden kunnen verschillen bij een ander wegenbestand of postcodepunt. [OSRM · Route API](https://project-osrm.org/docs/v5.24.0/api/#route-service)

## 4. Gebruik eigen PC6-codes

Maak een CSV met kolom `postcode` en optioneel `aantal`. Zonder `aantal` telt iedere regel één keer. Het script telt dubbele postcodes op. Pak het volledige CBS PC6 GeoPackage uit en wijs het script naar dat bestand. Het script kiest een punt binnen ieder relevant postcodevlak. Een eigen puntenbestand met kolommen `postcode,lon,lat` kan ook via `--punten`.

```bash
python reisafstand.py --input mijn-postcodes.csv \
  --cbs cbs_pc6_2025_v1.gpkg --bestemming 1012JS
```

Controleer de dekking die het script afdrukt en de statuskolom in de uitvoer. Het gewogen gemiddelde is de som van tijd × aantal, gedeeld door het aantal personen met een geldige route. Gebruik BAG-adresgegevens eventueel eerder in het proces om een ontbrekende postcode uit straat, huisnummer en woonplaats te reconstrueren. Bij een bestaande PC6-lijst kun je direct de postcodepunten koppelen.

Bronnen voor de figuren zijn CBS en Esri Nederland voor postcodegeometrie, CBS en Kadaster voor gemeentegrenzen en OpenStreetMap-bijdragers voor het wegennet. [CBS · Wijk- en buurtkaart](https://www.cbs.nl/nl-nl/dossier/nederland-regionaal/geografische-data/wijk-en-buurtkaart-2025) · [OpenStreetMap · Bronvermelding](https://www.openstreetmap.org/copyright)

## 5. Vat de retourtijden samen in hexagonen

Gebruik de route-CSV uit stap 3. In deze kaart telt elke postcode één keer. Het script berekent de mediaan van de retourrijtijden in een vast RD-hexagonraster van 10 km tussen tegenoverliggende zijden. Cellen zonder voorbeeldpunten blijven leeg.

```bash
python hexagonen.py
```

De opdracht schrijft `hexagonen.png`. Voor een fijner raster kun je `python hexagonen.py --zijdeafstand-km 5` gebruiken.
