Alle wegen leiden naar het GeoFort - 2

Webmapper berekende de routes vanaf 3.000 willekeurige locaties in Nederland naar het GeoFort in Herwijnen. Hoe we dat aanpakten? Dat lees je in deze blog.


Screenshot video op YouTube
Alle wegen leiden naar Geofort

Bestemming: Geofort!

De bestemming van iedere route is het GeoFort. Op de contactpagina staat de locatie in graden, minuten en seconden aangegeven als 51° 51′51.51″ N, 5° 07′ 33.33″ E. Geef je deze notatie op in Google Maps (https://www.google.com/maps/place/51°51′51.5″N+5°07′33.3″E/), dan krijg je de decimale notatie terug als 51.864306, 5.125917: precies wat we nodig hebben voor onze berekeningen!

Vertrekpunten

Om de routes te berekenen hebben we de naast de bestemming natuurlijk ook nog eens 3.000 willekeurige vertrekpunten in Nederland nodig. Waar halen we zo snel een niet al te gedetailleerd kaartje van Nederland vandaan?

PDOK biedt een Web Feature Service (WFS) van de CBS Gebiedsindelingen met onder andere een generaliseerde provinciekaart uit 2017 waar de binnenwateren uitgeknipt zijn. We missen dus de grenscorrectie bij Eijsen-Margraten en we zullen de provincies zelf moeten samenvoegen. Met deze WFS-bevraging haal de geometrie (in WGS-84), naam en provinciecode binnen als GeoJSON-bestand:

https://geodata.nationaalgeoregister.nl/cbsgebiedsindelingen/ows?request=GetFeature&Service=WFS&version=2.0.0&typename=cbsgebiedsindelingen:cbs_provincie_2017_gegeneraliseerd&outputFormat=application/json&srsName=EPSG:4326&propertyName=statcode,statnaam,geom

Klik met de rechter muisknop op deze link om de kaart naar je computer te downloaden. Sla de kaart op als provincies2017.geojson. Om de provincies samen te voegen gebruiken we Mapshaper. Met deze Web tool kan je geografische bestanden converteren, versimpelen en bewerken:

  1. Sleep het bestand provincies2017.geojson naar de Web browser, waarin je Mapshaper hebt geopend en laat het los
  2. In de pop-up druk je op de knop Import, waarna de kaart in de Web browser verschijnt.
  3. Rechtsboven in het scherm druk je op de knop Console.
  4. In het scherm dat verschijnt, type je -dissolve en druk je op de Enter-knop van je toetsenbord om de provincies samen te voegen.
  5. Rechtsboven in het scherm druk je op de knop Export om de kaart op te slaan als nederland.geojson.

Nu importeren we nederland.geojson naar een tabel in PostGIS met bijvoorbeeld ogr2ogr. Met ST_GeneratePoints maken we dan eindelijk die 3000 willekeurige locaties in Nederland:

CREATE TABLE
random_start_locations
AS SELECT
(ST_Dump(
ST_GeneratePoints(i.geom, 3000)
)).geom
FROM
nederland AS i;

We schrijven deze coördinaten met ogr2ogr weer naar een CSV-bestand vertrekpunten.csv om als input te dienen voor de volgende stap.

Routes berekenen

Als wegennet gebruiken we OpenStreetMap. Bij het Duitse bedrijf GeoFabrik kan je heel Nederland in een keer downloaden. De routeberekening doen we met Open Source Routing Machine (OSRM). Met 4 Docker-commando’s heb je op http://localhost:5000 een eigen OSRM-server draaien met het Nederlandse wegennet:

docker run -t -v /data/geofort:/data osrm/osrm-backend osrm-extract -p /opt/car.lua /data/netherlands-latest.osm
docker run -t -v /data/geofort:/data osrm/osrm-backend osrm-partition /data/netherlands-latest.osrm
docker run -t -v /data/geofort:/data osrm/osrm-backend osrm-customize /data/netherlands-latest.osrm
docker run -t -i -p 5000:5000 -v /data/geofort:/data osrm/osrm-backend osrm-routed --algorithm mld /data/netherlands-latest.osrm

Je geeft 2 coördinatenparen op in WGS-84. Even spelen met de extra variablen die je mee kan geven en je slaat het antwoord o in een GeoJSON-bestand!

Met onze lijst van 3000 willekeurige punten (het CSV-bestand vertrekpunten.csv) kunnen we een bash-script draaien om de API 3000 keer te bevragen. Hoelang dat duurt? 20 minuten: even naar de WC, even koffie en klaar!

while IFS=, read -r lon lat id
do
echo "$lon|$lat"
curl "http://localhost:5000/route/v1/driving/$lon,$lat;5.125061,51.865723?generate_hints=false&steps=false&geometries=geojson&annotations=false&overview=full" > $id.json
done < vertrekpunten.csv

Nu hebben we 3000 JSON-bestanden met daarin de geometrie van iedere route als GeoJSON geformuleerd. Om alle routes in QGIS te bekijken, moeten we die GeoJSON van de routes uit de losse JSON-bestanden halen en dan voegen we deze samen tot 1 GeoJSON-bestand. Dit doe we met JavaScript:

fs.readdir(testFolder, (err, files) => {
files.forEach(file => {
fs.readFileSync(testFolder+'/'+file, (err, data) => {
if (err) throw err;
var route = JSON.parse(data);
if (route.code=='Ok') {
var properties = {
"distance": route.routes[0].distance,
"duration": route.routes[0].duration,
"weight_name": route.routes[0].weight_name,
"weight": route.routes[0].weight
}
var newFeature = {
"type": "Feature",
"geometry": route.routes[0].geometry,
"properties": properties
}
geojson['features'].push(newFeature);
} else {
console.log("nope")
}
});
});
});

Nu hebben we 1 GeoJSON-bestand met 3000 routes naar het GeoFort van 72,8 MB! Dat vindt QGIS niet leuk om in te laden! Dus maken we er een GeoPackage-bestand van:

ogr2ogr -f "GPKG" total_route_random.gpkg total_route_random.geojson 

Met de vertrekpunten erbij ziet dat er zo uit in QGIS:

In deel 3 gaan we met D3.js aan de slag om van deze routes een animatie te maken.

contact

Meer weten? Bel of mail ons gerust!

Webmapper is gevestigd in de
Social Impact Factory Utrecht:

Vredenburg 40

3511 BD Utrecht

info@webmapper.net

06 456 08 910