Dienstag, 11. Mai 2010

Routenplanung mit Openstreetmap-Daten: Nicht so toll

Einfach aus Interesse, wie man so etwas am besten macht, und aus der Erfahrung heraus, dass alle erhältlichen Routenplaner bei weitem nicht so konfigurierbar sind, wie ich das gerne hätte, hatte ich Mitte letzten Jahres ein Projekt gestartet, um mir meinen eigenen Routenplaner fürs iPhone zu schreiben.
Weit kam ich damals nicht, schon der Import der Openstreemap-Daten aus den riesigen XML-Dateien scheiterte an dafür ungeeigneten Funktionen von Mac OS X. Ich hätte mich mit bekanntermaßen unangenehmen und unübersichtlichen C-Libraries befassen müssen, und meine Unlust darauf stoppte letztlich das Projekt.
Jetzt sieht es ganz anders aus: Mein iPhone habe ich abgeschafft und mir dafür das Nexus One zugelegt; entsprechend ist das Entwicklungsziel nicht mehr Mac OS X / iPhone OS mit Objective C, sondern Java.
Tatsächlich bin ich mittlerweile schon relativ weit: Ich kann OSM-Dateien importieren und auf deren Basis Routen erstellen, allerdings bislang nur auf dem Desktop und ohne grafisches UI. Zu tun ist als nächstes auch noch eine komplette Überarbeitung der genutzten Datenbankschemata, um die Performance weiter zu verbessern.
Soweit, so gut. Oder auch nicht.
Mittlerweile ist mir nämlich klargeworden, dass Openstreetmap-Daten nur sehr schlecht zur Erstellung von Routen geeignet sind. Dass man die Verbindungen von Node zu Node in einer Routing-Datenbank anders darstellen muss, ist ohnehin klar, aber ein anderes Problem ist viel schwerwiegender:
Es ist unmöglich, sicher herauszufinden, ob sich ein Straßenabschnitt innerhalb einer Stadt befindet oder nicht. Die in der OSM-Datenbank abgelegten Straßen sind ausschließlich auf eine gute Kartendarstellung hin optimiert, Routing spielte dabei offensichtlich nicht die geringste Rolle.
Dementsprechend hat eine Landstraße, die durch einen Ort führt, inner- und außerorts immer den gleichen Straßentyp. Nur Straßen in reinen Wohngebieten sind eindeutig gekennzeichnet, auf allen größeren Straßen wird keine Unterscheidung zwischen Stadtgebiet und außerorts getroffen.
Auf einer Seite des Openstreemap-Wiki werden zu diesem Problem einige Vorschläge gemacht, die aber allesamt reichlich ungeeignet sind:
  • Ways (Straßen/Wege/Linien) sind praktisch nie mit is_in getaggt.
  • Places als areas für ganze Städte/Gemeinden habe ich auf der Karte in meinem Umkreis noch überhaupt nicht gesehen.
  • boundary=administrative mit admin_level=8 gibt es hier auch so gut wie nicht. Außerdem haben diese Gebiete normalerweise nichts mit den Grenzen zu tun, ab denen für den Verkehr 50 km/h gilt.
  • Einfach alle landuse-areas, die nicht farm, quarry, forest oder water sind, als Stadt zu betrachten, ist Unsinn. Landuse=residential hilft manchmal bei Dörfern, bei denen entsprechende Grenzen eingetragen sind, vor allem, wenn hier TMC-Daten verarbeitet wurden. Leider gibt es bei weitem nicht für alle Dörfer solche Areas, und vor allem in Städten hilft das auch wenig weiter. Hier sind Wohnegbiete von Industriegebieten, Einkaufszentren und anderem getrennt, und die Straßen, die zwischen den Gebieten verlaufen, sind häufig weder Teil des einen noch des anderen.
  • Irgendwelche Radien um place-Nodes herum als Abschätzung zu benutzen ist vielleicht besser als nichts, aber immer noch eine letztlich ungeeignete Krücke. Straßendörfer mit wenigen Einwohnern können kilometerlang, aber nur 50m breit sein, Städte > 100.000 Einwohner haben im Ruhrgebiet völlig andere Ausdehnungen als in einem ländlichen Ballungsraum usw.
  • Als eigene Idee hatte ich noch, Straßen ohne Namen einfach als außerorts zu behandeln. Leider musste ich feststellen, dass in vielen Fällen im Kartenmaterial auch für außerstädtische Gebiete Straßen mit Namen angelegt sind, so dass auch diese Heuristik bei weitem nicht korrekt genug ist.
Fazit: Soweit man keine real gemessenen Geschwindigkeitsdaten zur Verfügung hat, muss Routing mit Openstreetmap-Daten immer schlechter sein als mit Daten, die von vorneherein für Routing ausgelegt wurden.
Natürlich war mein Plan schon immer, reale Geschwindigkeitsdaten zu sammeln. Auch wenn solche nicht vorhanden sind, sollte mein Routenplaner aber halbwegs sinnvolle Daten ausspucken, was mit diesem Datenmaterial aber eher als Glücksfall zu betrachten wäre.
Ich werde mich jetzt einmal umsehen, was kommerzielles, für Routing besser geeignetes Datenmaterial so kostet. Wenn das bezahlbar ist (also mit kleinen Preisen anfängt und von der Anzahl der verkauften Lizenzen abhängig ist), könnte es eine Alternative sein.
Ansonsten kann ich mich nur so nahe an die Realität herantasten, wie es Openstreetmap eben erlaubt, und hoffen, dass möglichst bald möglichst viele echte Geschwindigkeitsdaten von Usern gesammelt werden.

2 Kommentare:

  1. Deine Seiten - zumindestens aber diese - lässt sich mit dem Firefox nur unvollständig drucken. :/

    AntwortenLöschen
  2. Das würde ich spontan mal für einen Firefox-Bug halten, aber ich werde es bei Gelegenheit mal mit verschiedenen Browsern testen.

    AntwortenLöschen