Ein Gastbeitrag vom Team Wahre Logistik
Lukas Felzmann, Alexander Opris, Felix Mayer
Datum der Originalveröffentlichung Jan 20. 2023; 6 min read
Ob Dijkstra, A-Star oder Johnson-Algorithmus, pgRouting reichert gewöhnliche Postgres-Datenbanken mit zahlreichen Funktionalitäten rund um's Routing und Netzwerkanalysen an. Und das Beste: pgRouting ist Open Source. Das nehmen wir zum Anlass, um einen kleinen Leitfaden für pgRouting-Einsteiger zu schreiben. Hierbei erklären wir im Wesentlichen ...
- ... wie man OSM-Daten in eine Postgres-Datenbank importiert.
- ... wie man Routen berechnet.
- ... wie man Routen visualisieren kann.
Voraussetzungen
Zunächst ein paar Voraussetzungen, die erfüllt sein müssen, bevor man mit diesem Tutorial beginnt. Folgende Tools müssen bereits installiert sein:
- 1. Postgres
- 2. PostGIS und pgRouting
- 3. R samt der folgenden Packages:
- DBI
- odbc
- leaflet
Sollte die Installation von pgRouting Schwierigkeiten bereiten, so kann man in Windows auch auf den Application Stack Builder zurück greifen. Hier kann man sich in einer GUI benötigte Anwendungen und Extensions "zusammenklicken". Im Falle von pgRouting einfach das PostGIS Bundle unter Spatial Extensions installieren. Der dritte Punkt (also R) ist nur dann relevant, wenn man Routen visualisieren möchte.
Setup
Es wird empfohlen pgRouting nicht auf der Standard-Datenbank postgres zu verwenden. Deshalb legen wir eine separate Datenbank auf unserem Postgres-Server für Routing-Zwecke an. Diese nennen wir routing_db . Auf dieser müssen wir PostGIS und pgRouting noch aktivieren. Hierzu führen wir folgende SQL-Befehle aus:
CREATE EXTENSION PostGiS;
CREATE pgRouting;
Import der OpenStreetMap-Daten
Download:
Unsere Datenbank ist also schonmal bereit. Um jetzt Routen zu berechnen, fehlt aber noch eine entscheidende Zutat: Kartendaten. In diesem Tutorial verwenden wir Daten von QpenStreetMap (OSM). Es stehen verschiedene Mirror zu Verfügung, um OSM-Daten herunterzuladen. Wir verwenden Geofabrik. Geofabrik bietet die Möglichkeit unterschiedlich große Auszüge aus den weltweiten OSM-Daten herunterzuladen (Kontinente, Länder, Bundesländer etc.). Um den Download und den späteren Import vom Zeitaufwand gering zu halten, laden wir im Rahmen dieses Tutorials lediglich Rheinland-Pfalz im Format ". osm.pbf" herunter. Die heruntergeladene Datei sollte also den Namen "rheinland-pfalz-latest. osm. pbf" tragen.
Import
Nun, wo wir unsere Kartendaten haben, stellt sich noch die Frage, wie wir diese in unsere PostgresDB importiert bekommen. Wir haben hierbei gute Erfahrungen mit dem Tool osm2po gemacht. Die Installation von osm2po ist schnell erledigt:
- Herunterladen
- In gewünschtem Verzeichnis ablegen
- Entpacken
Damit osm2po funktioniert, benötigen Sie die Java Runtime Environment (JRE) Version 8 oder höher. Navigieren Sie nun in der Kommandozeile in das Installationsverzeichnis von osm2po und führen Sie den folgenden Befehl aus (PATH_TO_PBF bitte durch den Pfad zur vorhin heruntergeladenen pbf-File ersetzen):
Hierdurch werden zwei SQL-Insert-Skripte im Unterordner rlp erzeugt (eines für die Knoten und eines für die Kanten). Diese müssen wir jetzt noch auf unserer Datenbank ausführen. Hierzu können Sie beispielsweise das Kommandozeilen-Tool psql verwenden (HOST, PORT und USERNAME bitte durch ihre eigene Konfiguration ersetzen):
Wenn alles geklappt hat, sollten sie in ihrer Datenbank die beiden Tabellen r1p_2po_4pgr (Kanten) und "r1p_2po_vertex" (Knoten) vorfinden. Herzlichen Glückwunsch, der schwierigste Teil liegt jetzt hinter uns!
Berechnung von Routen
Also gut, unsere PostgresDB steht, pgRouting ist einsatzbereit und zu guter Letzt haben wir auch noch OSM-Daten für Rheinland-Pfalz in unsere Datenbank importiert. Kurzum: Das eigentliche Vergnügen kann jetzt beginnen.
Unsere erste Route
Wir möchten also unsere erste Route berechnen. Hierfür stellt pgRouting eine Reihe von Funktionen bereit, die sich im gewählten Algorithmus (Dijkstra, A-Star etc.), der Direktionalität (unidirektional vs. bidirektional) und der Anzahl der Start- bzw. Zielknoten (One-to-One, One-to-Many etc.) unterscheiden. Wer mehr zu den verschiedenen Varianten und den jeweiligen Vor- und Nachteilen wissen will, sei auf die pgRouting-Dokumentation verwiesen.
Wir verwenden im Folgenden einfach den unidirektionalen Dijkstra, welcher mit pgr aufgerufen wird. Kommen wir also zu unserer ersten Routenberechnung. Führen Sie dazu folgende Query aus:
- Die Eingabe: Es ist nicht gerade zweckmäßig, pgRouting die Ids der Knoten mitzuteilen, zwischen denen man eine Route berechnen Es wäre intuitiver, einfach Start- und Zielkoordinaten in Längen- und Breitengrad anzugeben.
- Die Ausgabe: Es wäre (analog zur Eingabe) praktischer, nicht die Ids sondern die Koordinaten der Knoten der berechneten Route zu erhalten.
- Die Darstellung: Das Ergebnis einer Routenberechnung macht in Tabellenform nicht gerade viel her. Schöner wäre es, die berechnete Route auf einer Karte zu visualisieren.
Optimierung der Eingabe
Optimierung der Ausgabe
Visualisierung der Route
- library(DBI)
- library(odbc)
- library(leaflet)
Recap
- eine Datenbank angelegt und auf dieser pgRouting aktiviert,
- mithilfe von osm2po OSM-Daten in unsere Datenbank importiert,
- den Dijkstra-Algorithmus genutzt, um eine Route zwischen zwei Koordinaten zu berechnen
- und diese Route in Leaflet "visualisiert.
Transparenzhinweis
Blog: , Seite:
Version: 1.3 Mai 2023, Kontakt: E-Mail Martin Wölker
Pirmasens, Germany, 2018-2024,
ausgelesen am: , Licence
CC BY-NC-SA
Kommentare
Kommentar veröffentlichen