Algorithmus zum Versetzen eines Breiten- / Längengrads um einige Meter


108

Ich suche nach einem Algorithmus, der mir eine neue Koordinate liefert, wenn man ein Längen- und Breitengradpaar und eine Vektorübersetzung in Metern in kartesischen Koordinaten (x, y) angibt. Irgendwie wie ein Reverse Haversine. Ich könnte auch mit einer Distanz- und einer Steuerkursumwandlung arbeiten, aber dies wäre wahrscheinlich langsamer und nicht so genau. Im Idealfall sollte der Algorithmus schnell sein, da ich an einem eingebetteten System arbeite. Genauigkeit ist nicht kritisch, innerhalb von 10 Metern wäre gut.


Also wäre es gut, die Erde als Kugel zu modellieren?
Underdunkel

1
Ja, das wäre in Ordnung, da ich einen Versatz von <1 km erwarte.
Thomas O

Antworten:


107

Wenn Ihre Verschiebungen nicht zu groß sind (weniger als ein paar Kilometer) und Sie nicht an den Polen sind, verwenden Sie die schnelle und schmutzige Schätzung, dass 111.111 Meter (111.111 km) in y-Richtung 1 Grad (Breitengrad) und sind 111,111 * cos (Breitengrad) Meter in x-Richtung beträgt 1 Grad (Längengrad).


3
@Thomas: Eigentlich kann man den Polen sehr nahe sein. Ich habe gegen eine UTM-Berechnung mit gleichen x- und y-Verschiebungen von 1400 m geprüft (die Gesamtverschiebung beträgt also 2 km). Die Ergebnisse sind gut bis 8,6 Meter oder besser. Der schlechteste Breitengrad (für diese Richtung und den Betrag der Verschiebung) beträgt 81 Grad: Die Annäherung wird tatsächlich genauer, wenn Sie sich nach Norden bewegen, und der Fehler bleibt unter 10 Metern, bis Sie 89,6 Grad überschreiten!
Whuber

60
Übrigens sind diese magischen Zahlen von 111.111 leicht zu merken, wenn man die Geschichte kennt: Die Franzosen haben den Zähler ursprünglich so definiert , dass 10 ^ 7 Meter die Entfernung entlang des Pariser Meridians vom Äquator zum Nordpol sind. Somit entspricht 10 ^ 7/90 = 111,111,1 Metern einem Breitengrad, der vor zwei Jahrhunderten den Fähigkeiten französischer Landvermesser entsprach.
Whuber

3
Wenn ich also mit der Formel von 10,0 N, 10,0 E + 100 m in y-Richtung bewegen wollte, würde ich dann einfach 100/111111 hinzufügen? Wenn Sie sich in x-Richtung + 100 m bewegen, wären es dann 100 ÷ (111,111 × (cos 10))? Ich stelle nur sicher, dass ich das richtig verstanden habe.
Thomas O

5
@Thomas Ja, das stimmt. Man beachte , wie die zweite Formel erweitert die scheinbare x-Verschiebung (durch durch eine Anzahl von Unterteilen von weniger als 1) , wie es sein sollte, weil ein gewisses Maß an Länge kleiner wird , wie sie in Richtung des Pols vom Äquator bewegen. Das einzige mögliche Problem besteht darin, sicherzustellen, dass Sie und Ihre Software-Plattform sich darüber einig sind, was "cos" bedeutet: cos (10) sollte besser als der Cosinus von 10 Grad interpretiert werden , nicht 10 Bogenmaß! (Wenn nicht, zeigt 10 Grad = 10 * pi / 180 Radiant die einfache Umrechnung.) An dieser Stelle sollte der von @haakon_d angebotene Code für Sie völlig sinnvoll sein.
Whuber

7
Jemand hat versucht, diese Antwort zu bearbeiten, um "Meter" durch "km" zu ersetzen. Sie haben wahrscheinlich das Komma "," im europäischen Sinne als Dezimalpunkt gelesen. Ich folge der amerikanischen Konvention (die meines Erachtens auch die Konvention internationaler Veröffentlichungen ist), mit einem Komma lange Ziffernfolgen in Dreiergruppen und Dezimalstellen zu trennen "." anstelle des Kommas. (Diese Verwendung wurde in früheren Kommentaren deutlich gezeigt.) Um Unklarheiten zu vermeiden, habe ich die Antwort bearbeitet, um deutlich zu machen, was Komma und Punkt bedeuten.
Whuber

56

Wie Liedman in seiner Antwort sagt, sind Williams 'Luftfahrtformeln eine unschätzbare Quelle, und um die Genauigkeit bei Verschiebungen von bis zu 1 km auf 10 Metern zu halten, müssen Sie wahrscheinlich die komplexeren verwenden.

Wenn Sie jedoch bereit sind, Fehler über 10 m für Punkte mit einem Versatz von mehr als ca. 200 m zu akzeptieren, können Sie eine vereinfachte Berechnung der flachen Erde verwenden. Ich denke, die Fehler werden bei Offsets bis zu 1 km immer noch weniger als 50 m betragen.

 //Position, decimal degrees
 lat = 51.0
 lon = 0.0

 //Earth’s radius, sphere
 R=6378137

 //offsets in meters
 dn = 100
 de = 100

 //Coordinate offsets in radians
 dLat = dn/R
 dLon = de/(R*Cos(Pi*lat/180))

 //OffsetPosition, decimal degrees
 latO = lat + dLat * 180/Pi
 lonO = lon + dLon * 180/Pi 

Dies sollte zurückgeben:

 latO = 51,00089832
 lonO = 0,001427437

7
Ich möchte nur darauf hinweisen, dass dies mit der von mir angegebenen Antwort identisch ist, außer dass Sie meinen Wert von 111.111 Metern pro Grad durch 111.319,5 ersetzt haben. Ihr Wert ist bei hohen Breiten etwas besser, bei niedrigeren Breiten (von 0 bis etwa 40 Grad) jedoch etwas schlechter. Jeder Wert erfüllt die angegebenen Genauigkeitsanforderungen.
Whuber

1
+1 für die Bereitstellung von Code. Beachten Sie, dass es genauer ist, als Sie vermuten (der Fehler liegt normalerweise unter 5 m über 2000 m).
Whuber

1
Ich fragte mich, ob ich meiner Antwort eine Bemerkung hinzufügen sollte, dass dies eine identische Lösung für Sie ist, mit Ausnahme des Wertes von R, aber aus Gründen der Kürze weggelassen. Wenn es um Präzision geht, haben Sie Recht, solange Sie dem System keine Rotationsfehler hinzufügen. Bei Verwendung von Offsets, die in einem lokalen projizierten Koordinatensystem gemessen werden, können die Rotationsfehler sehr groß werden.
haakon_d

1
Das ist ein ausgezeichneter Punkt: Wir haben implizit angenommen , die x-Verschiebung ist zumindest nahe an echtem Ost-West und die y-Verschiebung liegt in der Nähe von Norden nach Süden. Wenn nicht, müssen sie vor der Berechnung ihrer Lat-Lon-Äquivalente in äquivalente EW- und NS-Verschiebungen (nicht nur "Ost" und "Nord") umgewandelt werden.
Whuber

Der d-Abstandsparameter der Luftfahrtformelgleichungen wird in Bogenmaß angegeben, z. B. (Abstand / Erdradius).
user1089933

23

Ich finde das Aviation Formulary, hier ist großartig für diese Art von Formeln und Algorithmen. Überprüfen Sie für Ihr Problem die "Lat / Long Radial und Abstand gegeben": hier

Beachten Sie, dass dieser Algorithmus für Ihre Verwendung möglicherweise etwas zu komplex ist, wenn Sie die Verwendung von Trigonometriefunktionen auf ein Minimum beschränken möchten.


Danke dafür - sieht ideal aus. Obwohl ich nicht herausfinden kann, ob der Abstand in Metern oder einem anderen Maß ist.
Thomas O

2

Es kann sinnvoll sein, den Punkt zuerst zu projizieren. Sie könnten so etwas wie diesen Pseudocode machen:

falt_coordinate = latlon_to_utm(original_koordinate)
new_flat_coordinate = flat_coordinate + (x,y)
result_coordinate = utm_to_latlon(new_flat_coordinate)

Dabei ist (x, y) der gewünschte Versatz.

Sie müssen nicht utm verwenden, ein flaches Koordinatensystem, das in Ihrer Region sinnvoll ist.

Mit welcher Software arbeiten Sie?


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.