Verständnisfrage zu Geokoordinaten -> ReverseGeocoding

Hallo!

Ich habe folgende Geokoordinaten: 51.0649451000000, 13.7401716000000

Lasse ich mir diese Koordinaten in OSM und in GMaps anzeigen, zeigen die beide auf den selben Punkt in der Karte.

Mache ich ein ReverseGeocoding, liefert mir GMaps “B170” und OSM “Hallo Pizza!, Antonstraße”.

Bei GMaps verstehe ich das evtl. noch, weil die “Hallo Pizza!” unter anderen Koordinaten abgespeichert haben und die obigen Koordinaten ja auch auf die B170 zeigen.

Warum wird bei OSM aber “Hallo Pizza!” zurückgeliefert, obwohl auf der Karte ja auch sichtlich zu sehen ist, dass da zwischen dem eigentlichen Laden und dem Punkt auf der Karte dann doch einige Meter dazwischen liegen?

Schaue ich mir den Node “Hallo Pizza!” dann mal genauer an, sind die obigen Koordinaten fest mit dem Laden verknüpft. Von daher sicher auch die zurückgelieferten Daten beim ReversGeocoding. Aber letztlich stimmen diese Geokoordinaten ja nicht, oder?

Oder habe ich einen groben Denkfehler?

Danke!

Machst Du das mit Nominatim?

Das liefert etwas zurück, von dem es glaubt, dass Du das suchst. Bei Deiner Koordinate die Kneipe, bei ( 51.064,13.7394) ein Hotel, bei (51.065,13.7392) einen Bahnsteig und bei (51.0654,13.7392) nur die Straße, weil gerade nichts wichtigeres in der Nähe ist.

Die Entscheidung, was dem Nutzer lieber ist, wenn er auf der Straße steht, aber auch nur 5 Meter vom Hotel weg ist, ist willkürlich. Nominatim hat für seine Abschätzung Umkreise um die POIs definiert (hier der fürs Hotel) innerhalb dessen das Hotel über die Straße gewinnt.

Andere Suchmaschinen werden das ähnlich handhaben. Wer das exakt wissen will, muss ein Stück OSM-Daten runterladen und dort selbst suchen. Alternativ wären vielleicht Wunsch- oder Ausschlusslisten in der Suchmaschine (“ich will keine Hotels, sondern nur Straßen”) hilfreich. Aber da hab ich bei Nominatim nichts gefunden, was beim Suchen nach Koordinaten hilft…

Grüße, Max

Nahmd,

Offensichtlich ist Nominatim so programmiert, dass es etwas “möglichst spezifisches” liefert.

Wenn Du zuerst wie auch immer™ ein nahes OSM-Objekt suchst und statt der Koordinaten dessen Id an Nominatim übergibst, bekommst Du, was Du suchst.

Gruß Wolf

Ja, habe Nominitam genutzt. Hintergrund ist, dass ich einen Reversen Geocoder suche, mit dem ich viele Sätze abfragen kann. Der von Google lässt immer nur eine Anzahl zu, die mir zu gering ist.

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.

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

Danke!

Nahmd,

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.

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. :roll_eyes:

Gruß Wolf

Edit: URL