Der Technische Aufbau unseres Lastenrad Routing
In diesem Artikel erfährst du, wie wir unsere erste Version des Lastenrad-Routings gebaut haben. Außerdem gibt es Einblicke, wie wir GraphHopper auf unsere Bedürfnisse angepasst haben und wie wir unseren CargoBikeIndex in das Routing integriert haben. Zudem gehen wir auf Probleme ein, auf die wir gestoßen sind.
Wir verwenden für das Routing ausschließlich OpenStreetMap Daten. Diese Daten verarbeiten wir vor dem Import vor (Data-Preprocessing). Danach werden diese Daten dann in unsere GraphHopper Instanz geladen.
Was ist GraphHopper?
Für unser Routing verwenden wir eine angepasste Version von GraphHopper. GraphHopper ist eine Open-Source Routing Engine und kann darüber hinaus auch noch vieles mehr (bspw. Isochrone berechnen). Der Code ist offen auf unserem GitHub Account.
Vereinfacht ausgedrückt setzen wir GraphHopper zur Lösung des folgenden Problems ein:
Eingabe: OpenStreetMap Daten & Start/Endpunkt der Route
Verarbeitung: Graph Erstellung & Wegefindung
Ausgabe: Beste Lastenrad-Route mit Wegeeigeschaften
GraphHopper bietet eine gute, einfach zu verwendende API, die unter anderem auch Zwischenziele, Custom Routing Profile oder Alternative Routen anbietet. Vor allem nützlich für uns war jedoch die “Path Details” Funktion, welche angegebene Attribute von Wegen (bspw. den Untergrund des Weges) zurückgeben kann. Dies erfordert allerdings gewisse Vorraussetzungen (Stichwort “Encoded Values”).
In GraphHopper existieren darüberhinaus verschiedene vorgefertigte, sogenannte Routing Profile. Diese stehen unter anderem für Wandern, LKW oder eben Fahrräder zur Verfügung. Für unsere Zwecke erstellten wir also eine Cargobike Profil (in GraphHopper auch “Flag Encoder” genannt), welches unsere erweiterten Daten verwendet und unsere eigene Gewichtung von Kanten verwendet. Dieses basiert auf dem Fahrrad Profil.
Vorbereiten der OSM-Daten
Für das Routing verwenden wir insbesondere unseren CargoBikeIndex. Wir haben bereits in diesem Blog Artikel beschrieben, wie wir den CargoBikeIndex berechnen.
Die OpenStreetMap Daten wurden hierfür in eine PostgreSQL bzw. PostGIS Datenbank mit Osmosis geladen. In der Datenbank bewertet unser R Skript dann den CargoBikeIndex und schreibt diese in Form eines OSM-Tags zu dem entsprechenden Wegen. Dabei werden nur die Wege bewertet, die grundsätzlich mit einem Fahrrad befahren werden können. Autobahnen werden also bspw. kategorisch ausgeschlossen.
Wie das Routing funktioniert
GraphHopper löst das algorithmische Problem der kürzesten Pfade. Um dieses Problem zu lösen, muss hierfür zunächst aus dem Straßennetz von OSM ein Graph erstellt werden. Dieser Graph besteht aus Kanten und Knoten. Kanten ensprechen Wegen und Knoten entsprechend Kreuzungen. Kanten können bestimmte Eigenschaften haben, bspw. die Höchstgeschwindigkeit. Aus den Eigenschaften kann die Gewichtung errechnet werden, wobei die Länge des Weges häufig die Eigenschaft mit der größten Relevanz ist.
Bevor eine Wegefindung stattfinden kann, ist die Gewichtung der einzelnen Kanten eines Graphen notwendig. Ausgehend vom “Fahrrad Profil” beziehen wir noch unseren CargoBikeIndex mithinzu. Das Fahrrad Profil betrachtet bereits Einschränkungen bzw. Explizite Erlaubnisse wie Fahren gegen die Einbahnstraße für Radfahrende erlaubt (Verkehrszeichen 267 mit StVO Zusatzzeichen 1022-10 ) oder Fahren auf der Fahrbahn verboten (Verkehrszeichen 254 ). Außerdem verwendet es beschilderte Fahrrad Routen, welche in OpenStreetMap eingetragen sind. Das können lokale, regionale oder auch nationale Routen sein.
Hierfür haben wir ein eigenes Weighting eingeführt.
Der CargoBikeIndex (CBI) bewertet von 0 (nicht passierbar) bis 5 (optimal für Lastenräder) Straßen und Wege. Diese Gewichtung wird derzeit durch einen Natürlichen Logarithmus miteinbezogen. Das bedeutet folgendes: Basierend auf dem Fahrradprofil erhalten Straßen & Wege, die einen CBI von 5 haben eine bessere Gewichtung erhalten, und Wege mit einem CBI von 1 etwa doppelt so schlecht bewertet werden. Dementsprechend haben Wege mit einer Bewertung von 0 ein unendliches Gewicht und werden somit nicht befahren.
Verwendung des Routings: Die API
Für die Interaktion mit verschiedenen Anwendungen bietet GraphHopper eine API an. Damit können Routing Anfragen gestellt werden. Als Antwort wird dann die berechnete Route zurückgegeben.
Der CargoBikeIndex wird als sogenannter Encoded Value im Graph von GraphHopper gespeichert, dies entspricht einem Attribute einer Straße. Dadurch ist es möglich, dass die Route, welche von der API zurückgegeben wird dahingehend zu analysieren. So ist es bspw. möglich zusätzlich zu den Höheninformationen auch den CBI auf den einzelnen Straßen- und Wegeabschnitten nachzuvollziehen. Ein Debugging ist hiermit also auch teils möglich. Außerdem bietet GraphHopper eigene Vector Tiles (MVT), welche die Encoded Values enthalten. Auch hiermit können einzelne Straßen und Wege nach ihren Attributen abgefragt werden. Zukünftig kann es so auch möglich sein potentielle Problemstellen auf der Route von Radfahrenden in der App anzuzeigen.
Offene Punkte
Es gibt derzeit noch Problemstellungen, welche wir noch nicht mit GraphHopper lösen konnten. Diese Informationen wären jedoch wichtig für die Kantengewichtung und somit für ein verbessertes Lastenradrouting. Diese Probleme sollen nun im Folgenden genauer beleuchtet werden.
Node Tags
Derzeit ist es mit GraphHopper noch nicht möglich Attribute von Nodes allgemein oder im speziellen zusätzliche Attribute von Barrieren auszuwerten. Interessant ist das bspw. für die Höhe von Bordsteinen, oder maxwidth
Tags für Breiten von Pollern. Es ist nur festzustellen ob eine Barriere vorhanden ist oder nicht.
Kanten in Flächen
Wir wissen, dass Radfahren vor allem in grüner Umgebung attraktiv ist. Dies gilt natürlich auch für die Lastenradfahrenden. Allerdings ist es in GraphHopper nicht möglich Straßen und Wege, welche bspw. in Parks liegen, besser zu bewerten. Das ist nachvollziehbar, da damit das Erstellen des Graphen deutlich verlängern würde. Daher werden wir hierfür eine alternative Lösung finden.
Weitere Infos
Unser Lastenrad Routing ist bald in unserer Smartphone App verfügbar und wird kontinuierlich weiterentwickelt!
Um auf dem neusten Stand zu bleiben, folge uns gerne auf Twitter.
Wenn du selbst an GraphHopper arbeiten möchtest, hier gibt’s eine kleine Starthilfe.