Ich möchte einen unbekannten Zielort (Längen- und Breitengradkoordinaten) herausfinden. Es gibt 3 bekannte Punkte (Koordinatenpaare von Breite und Länge) und für jeden Punkt eine Entfernung in Kilometern zum Zielort. Wie kann ich die Koordinaten des Zielorts berechnen?
Angenommen, ich habe die folgenden Datenpunkte
37.418436,-121.963477 0.265710701754km
37.417243,-121.961889 0.234592423446km
37.418692,-121.960194 0.0548954278262km
Was ich möchte, ist, was die Mathematik für eine Funktion ist, die das als Eingabe annimmt und 37.417959, -121.961954 als Ausgabe zurückgibt.
Ich verstehe, wie man den Abstand zwischen zwei Punkten berechnet, von http://www.movable-type.co.uk/scripts/latlong.html Ich verstehe das allgemeine Prinzip, dass man mit drei Kreisen wie diesen genau einen Überlappungspunkt erhält. Worauf ich mich einlasse, ist die Mathematik, die benötigt wird, um diesen Punkt mit dieser Eingabe zu berechnen.
Antworten:
Nach einigem Hin und Her bei Wikipedia und der gleichen Frage / Antwort bei StackOverflow dachte ich, ich würde es versuchen, die Lücken zu füllen.
Zunächst einmal: Ich bin mir nicht sicher, woher die Ausgabe stammt, aber sie scheint falsch zu sein. Ich habe die Punkte in ArcMap geplottet, sie auf die angegebenen Entfernungen gepuffert, Schnittpunkte auf den Puffern erstellt und dann den Schnittpunkt erfasst, um die Lösungen zu erhalten. Ihre vorgeschlagene Ausgabe ist der Punkt in Grün. Ich habe den Wert in der Callout-Box berechnet, der ungefähr 3 Meter des Werts entspricht, den ArcMap für die vom Schnittpunkt abgeleitete Lösung ergab.
Die Mathematik auf der Wikipedia-Seite ist nicht allzu schlecht. Sie müssen nur Ihre geodätischen Koordinaten in den kartesischen ECEF umwandeln, den Sie hier finden . Die a / x + h-Terme können durch den authalen Kugelradius ersetzt werden, wenn Sie kein Ellipsoid verwenden.
Am einfachsten ist es wahrscheinlich, wenn Sie einen gut (?) Dokumentierten Code angeben. Hier also in Python
quelle
Ich bin mir nicht sicher, ob ich naiv bin, aber wenn Sie jeden Punkt nach Größe puffern und dann alle drei Kreise schneiden, die Ihnen die richtige Position bringen würden?
Sie können die Schnittmenge mit räumlichen APIs berechnen. Beispiele:
quelle
Die folgenden Hinweise verwenden planarithmische Geometrie (dh Sie müssten Ihre Koordinaten in ein geeignetes lokales Koordinatensystem projizieren).
Meine Argumentation mit einem Beispiel in Python lautet wie folgt:
Nimm 2 der Datenpunkte (nenne sie
a
undb
). Rufen Sie unseren Zielpunkt anx
. Wir kennen bereits die Entfernungenax
undbx
. Wir können die Entfernungab
mit dem Satz von Pythagoras berechnen .Nun können Sie die Winkel dieser Linien berechnen:
Leider fehlt mir die Zeit, um die Antwort für Sie zu vervollständigen. Nachdem Sie jedoch die Winkel kennen, können Sie zwei mögliche Positionen für berechnen
x
. Mit dem dritten Punkt c können Sie dann berechnen, welcher Ort korrekt ist.quelle
Das könnte funktionieren. In Python können Sie dies schnell wieder in den Rumpf einer Funktion einfügen: xN, yN = Koordinaten von Punkten, r1 & r2 = Radiuswerte
rx & ry-Werte sind die Rückgabewerte (sollten in einem Array liegen) der beiden Schnittpunkte auf einem Kreis, wenn dies zur Klärung beiträgt.
Tun Sie dies für die ersten 2 Kreise, dann erneut für den ersten und den letzten. Wenn eines der Ergebnisse der ersten Iteration mit den Ergebnissen der zweiten Iteration verglichen wird (wahrscheinlich innerhalb einer gewissen Toleranz), haben Sie den Schnittpunkt. Es ist keine großartige Lösung, besonders wenn Sie anfangen, mehr als Punkte in den Prozess einzufügen, aber es ist die einfachste, die ich sehen kann, ohne ein Gleichungssystem zu lösen.
quelle
Sie können die räumliche API von postgis verwenden (St_Intersection, St_buffer-Funktionen). Wie fmark bemerkt hat, müssen Sie sich auch daran erinnern, dass Postgis planare Algorithmen verwendet, aber für kleine Bereiche führt die Verwendung von äquidistanten Projektionen nicht zu großen Fehlern.
quelle
GEOGRAPHY
Typs und nicht anhand desGEOMETRY
Typs durchführen.Mach es in PHP Sprache:
quelle