TL;DR
Wir überarbeiten in der Geofabrik gerade Routing-Views des OSM Inspectors und suchen Leute, die sich dessen gemeldete Fehler ansehen.
Hallo,
in der Geofabrik sind wir gerade dabei, das Backend des Routing-Views neu zu schreiben, weil die PostGIS-basierende Lösung zur Ermittlung fehlender Verbindungen im Straßennetz zunehmend an Grenzen stößt. (Inseln, Quellen und Senken ermittelt OSRM für uns – sie sind ein Abfallprodukt des Updateprozesses eines unserer Routingserver.)
Im Rahmen dieser Tätigkeit habe ich auf GraphHopper-Basis einen Ersatz geschrieben, der all das auf einmal und zügig ausrechnen soll. Der Ersatz hat nicht das Ziel, exakt oder annähernd dieselben Ergebnisse wie die alten Programme zu erzeugen. Stattdessen habe ich nur mit der groben Vorgabe, fehlenden Verbindungen zu finden, angefangen.
Während Inseln, Quellen und Senken recht gut definiert sind und man sich nur darüber streiten oder wundern kann, wie man Durchfahrtsverbote auswertet, gibt es bei unverbundenen Straßen keine exakte Definition, welche Fehlermeldungen zutreffend sind. Ich habe daher einmal für die ganze Welt ausgerechnet, wo Verbindungen im Straßennetz fehlen könnten. Dazu habe ich für jeden Knoten im Routinggraphen, der nur eine Kante hat (also Sackgassen) ermittelt, welche andere Kanten die nächstgelegenen sind. Um die Anzahl der False Positives zu reduzieren, habe ich folgende Maßnahmen ergriffen:
- noexit=yes und entrance=* (außer entrance=no) werden nicht gemeldet
- Kanten, die Nachbarn der Sackgasse sind, zählen nicht als Treffer.
- Kanten, die Nachbarn von Nachbarn der Sackgasse sind, zählen auch nicht als Treffer.
Regel 2 und 3 sind erforderlich, weil sonst Sackgassen an Stellen mit dichtem Mapping, wo die Kanten oft kürzer als der Suchradius sind, auf sich selbst oder ihre Zugänge matchen. Das betrifft v.a. Parkplatzwege und Fußwege in Grünanlagen. Sie führen manchmal aber auch zu unsinnig erscheinenden Treffern, weil deutlich näher liegende Kanten nicht berücksichtig worden sind.
Der Suchradius beträgt 15 Meter.
Leider war es mit diesen Regeln nicht getan. In meinem Testgebiet waren unzählige False Positives dabei. Ich finde es nicht gut, wenn der OSM Inspector seine Benutzer dazu verleitet, in einer Gegend noexit=yes mit der Gießkanne zu verteilen, um Qualitätssicherungsdienste ruhigzustellen. Deshalb berechne ich für jeden Treffer noch ein paar numerische Maße. Wenn ihr auf die Punkte klickt, werden sie in der rechten Seitenleiste angezeigt.
- distance: Entfernung in Metern
- ratio: Quotient aus der Entfernung der zwei Punkte über den Graphen und der Luftlinie
- angle1: Winkel zwischen dem letzten Segment der Sackgassen-Kante und dem Segment der Kante, die als Treffer gewählt wurde
- angle2: meist wie angle1, außer der nächstgelegene Punkt ist ein Knoten im Graphen oder ein Stützpunkt einer Kante
Die fehlenden Verbindungen werden jeweils zweimal doppelt dargestellt:
- Jeder gefundene Punkt wird farbig ausgegeben. Der nächstegelegene, nicht aus irgendwelchen Gründen verworfene, Punkt auf dem Graphen wird in schwarzer Farbe in Zoomstufe 18 gerendert.
- Es gibt drei Layer, in denen die Punkte nach der Entfernung gerendert werden, sowie drei Layer, in denen sie nach dem Wert der Spalte ratio gerendert werden.
Ich habe in meinem Testgebiet (Straubenhardt) beobachtet, dass Treffer mit einer ratio kleiner als 11 in der Regel False Positives sind.
unverbunde Punkte klassifiziert nach Entfernung
Leider ist mein Horizont beschränkt, sodass ich mich freuen würde, wenn ihr euch bekannte Gegenden, aber auch abgelegene Gegenden (z.B. HOT-Aktivitätsregionen, das TIGER-Land, das Canvec-Land, Städte mit separat gemappten Bürgersteigen usw.) anschauen würdet. Vielleicht liefert meine Software dort hilfreiche oder hinderliche Hinweise? Das Feedback von Mappern mit einem Fokus auf Qualitätssicherung liegt uns sehr am Herzen.
Noch ein paar Anmerkungen:
- Den Quellcode findet ihr unter https://github.com/geofabrik/osmi_routing. Es wird ein Fork von GraphHopper als Git-Submodul verwendet, den ich auch für OpenRailRouting verwende. Die Ausgabe erfolgt im GeoJSON-Format. Der Betrieb mit mehr als einem Thread ist empfohlen. Der Speicherbedarf ist mit dem originalen GraphHopper ohne Contraction Hierarchies vergleichbar.
- Unter https://kunden.geofabrik.de/ccfe3e46ecf224aad3fc9407fe9fffdd/ könnt ihr die gefundenen Fehler als Shapefiles (gesamter Planet) herunterladen.
- Abbiegeverbote und Durchfahrtsverbote werden nicht berücksichtigt. Es kommt ein Allweg-Routingprofil zum Einsatz, das alle Straßen und Wege nutzt. Einbahnstraßen werden ebenfalls ignoriert.
- Routinginseln werden eliminiert und ausgegeben. Es werden keine Quellen/Senken ausgegeben, weil das verwendete Routingprofil Einbahnstraßen ignoriert.
- Nur für die Sackgassen-Nodes sind momentan OSM-Node-IDs enthalten. Wenn der nächstgelegene Punkt kein Node, sondern ein Way-Segment in OSM ist, könnte ich dazu eine Way-ID ermitteln.
- Der Testdatensatz wird nicht aktualisiert und nur wenige Tage lang verfügbar sein, bis wir genügend Feedback erhalten haben. Später wird der View dann aber täglich im OSMI ausgerechnet und dort abrufbar sein.
Viele Grüße
Michael