x

Re: Verständnisfrage zu Geokoordinaten -> ReverseGeocoding


Geschrieben von Netzwolf (Gast) am 10. Februar 2013 22:17:10: [flux]

Als Antwort auf: Verständnisfrage zu Geokoordinaten -> ReverseGeocoding geschrieben von schmalhans (Gast) am 08. Februar 2013 12:14:

Nahmd,

schmalhans wrote:

Aktuell habe ich immer nur Geokoordinaten, nämlich den Standort eines Nutzers, den das GPS-Modul des Handys zurückliefert. Ich möchte daraus dann den konkreten Standpunkt "übersetzen" und diesen auf dem Handydisplay anzeigen.
Also am liebsten wäre mir, wenn ich immer irgendwie den Straßennamen+(Hausnummer?) zurückgeliefert bekomme.

Einfach zu beschreiben ist, aber in der Praxis ganz schön knifflig. Ich versuche das mal zu erklären:

Was man auf der Karte als banale Straße sieht, kann in der Datenbank aus Stücken zusammengesetzt sein. An jeder Stelle, an der sich eine Eigenschaft der Straße ändert (Höchstgeschwindigkeit, Radweg, Einbahnstraße, Buslinie komt dazu), beginnt auch ein neues Teilstück. Die Teilstücke heißen in der Datenbank “ways”. Sie bestehen aus einer Liste von Punkten (in der Datenbank: Nodes), und eine Linie läuft vom ersten Punkt über die Zwischenpunkte bis zum letzten. Zwischen zwei Punkten läuft sie exakt gerade, an Punkten kann sie abknicken. Kurven gibt es also keine; die werden durch hinreichend viel Zwischenpunkte approximiert.

Wenn Du die nächstgelegene Straße suchst, suchst Du den Way mit dem minimalem Abstand von Deinen Koordinaten. Du kannst vereinfachend den nächstgelegene Node suchen, der zu einer Straße gehört. Falls der nur zu einer Straße gehört, hast Du gewonnen. Falls er zu mehreren gehört (Straßenname ändert sich, oder Einmündung, oder Kreuzung), kannst Du die Abstände von Deinen Koordinaten zu den Way-Abschnitten berechnen, die an dem Node beginnen oder enden, und dann den Way mit dem kürzesten Abstand wählen.

Parallel kannst Du das nächste Gebäude suchen, das mit Adressdaten versehen ist, und wenn nah genug, neben der Straße auch die Hausnummer entnehmen. Gebäude mit Adressdaten stehen aber nicht überall™ zur Verfügung – Du solltest Dich nicht allein darauf verlassen.

Ist es möglich, dass ich Einsicht in das Skript bekomme, welches du da für die Suche nach einem OSM-nahen-Objekt nutzt??

Das löst Dein Problem nicht; ich hab das nur gebaut, um die Funktionsweise von Nominatim zu zeigen: selbst wenn Deine Koordinaten exakt auf dem Way liegen, bevorzugt Nominatim nahegelegene POIs. Ich repräsentiere jeden Way durch einen Punkt, der genau in der Mitte des Ways liegt (also auf dem Weg liegt und gleichen Abstand zu beiden Endpunkten hat), und habe den Way gesucht, dessen Repräsentationspunkt den kleinsten Abstand zu Deinen Koordinaten hat.

In der Stadt, wo die Straßen zerschnipselt sind und daher die Ways sehr kurz, funktioniert das. Hast Du längere Ways, kann das Ergebnis übelst daneben liegen.

Ich sehe zwei Lösungswege:

1. Du wendest Dich an eines der Routenfinder-Projekte: die haben immer als Teilaufgabe, zu Koordinaten den Startpunkt auf einer Straße zu finden.

2. Jemand implementiert Dir auf der Basis von Daten aus der Overpass-API den oben angedeuteten Algorithmus.

Für Rapid-Prototyping kannst Du auch meine schrottigen Daten verwenden; und wenn Du mit einer kleinen Region (z.B. Deutschland) zufrieden bist, kannst Du den Kram auch so bekommen, dass Du ihn auf Deinem Server laufen lassen kannst. Aber wirklich nur als Notlösung! Ich weiß, wie leicht Provisorien ein Eigenleben entwickeln: mein ältestes ist eine in einer halben Stunde zusammengehackte “Bilddatenbank” (Textdatei, in der mit grep gesucht wird, mit Zugriff über Web), die seit mittlerweile 16 Jahren in Betrieb ist. 🙄

Gruß Wolf

Edit: URL