Holen Sie sich lat / long gegeben aktuellen Punkt, Abstand und Lager

Angesichts eines bestehenden Punktes in Lat / Long, Abstand in (in KM) und Lager (in Grad in Bogenmaß umgewandelt), würde ich gerne die neue lat / long berechnen. Diese Seite taucht immer wieder auf, aber ich kann einfach nicht die Formel für mich arbeiten.

Die Formeln, wie oben erwähnt, sind:

lat2 = asin(sin(lat1)*cos(d/R) + cos(lat1)*sin(d/R)*cos(θ)) lon2 = lon1 + atan2(sin(θ)*sin(d/R)*cos(lat1), cos(d/R)−sin(lat1)*sin(lat2)) 

Die obige Formel ist für MSExcel, wo-

 asin = arc sin() d = distance (in any unit) R = Radius of the earth (in the same unit as above) and hence d/r = is the angular distance (in radians) atan2(a,b) = arc tan(b/a) θ is the bearing (in radians, clockwise from north); 

Hier ist der Code, den ich in Python habe.

 import math R = 6378.1 #Radius of the Earth brng = 1.57 #Bearing is 90 degrees converted to radians. d = 15 #Distance in km #lat2 52.20444 - the lat result I'm hoping for #lon2 0.36056 - the long result I'm hoping for. lat1 = 52.20472 * (math.pi * 180) #Current lat point converted to radians lon1 = 0.14056 * (math.pi * 180) #Current long point converted to radians lat2 = math.asin( math.sin(lat1)*math.cos(d/R) + math.cos(lat1)*math.sin(d/R)*math.cos(brng)) lon2 = lon1 + math.atan2(math.sin(brng)*math.sin(d/R)*math.cos(lat1), math.cos(d/R)-math.sin(lat1)*math.sin(lat2)) print(lat2) print(lon2) 

Ich bekomme

 lat2 = 0.472492248844 lon2 = 79.4821662373 

6 Solutions collect form web for “Holen Sie sich lat / long gegeben aktuellen Punkt, Abstand und Lager”

Benötigt, um Antworten von Radiant zurück zu Grad zu konvertieren. Arbeitscode unten:

 import math R = 6378.1 #Radius of the Earth brng = 1.57 #Bearing is 90 degrees converted to radians. d = 15 #Distance in km #lat2 52.20444 - the lat result I'm hoping for #lon2 0.36056 - the long result I'm hoping for. lat1 = math.radians(52.20472) #Current lat point converted to radians lon1 = math.radians(0.14056) #Current long point converted to radians lat2 = math.asin( math.sin(lat1)*math.cos(d/R) + math.cos(lat1)*math.sin(d/R)*math.cos(brng)) lon2 = lon1 + math.atan2(math.sin(brng)*math.sin(d/R)*math.cos(lat1), math.cos(d/R)-math.sin(lat1)*math.sin(lat2)) lat2 = math.degrees(lat2) lon2 = math.degrees(lon2) print(lat2) print(lon2) 

Die geopy- Bibliothek unterstützt dies:

 import geopy from geopy.distance import VincentyDistance # given: lat1, lon1, b = bearing in degrees, d = distance in kilometers origin = geopy.Point(lat1, lon1) destination = VincentyDistance(kilometers=d).destination(origin, b) lat2, lon2 = destination.latitude, destination.longitude 

Gefunden über https://stackoverflow.com/a/4531227/37610

Kann ein bisschen spät für die Beantwortung, aber nach dem Testen der anderen Antworten, es scheint, sie funktionieren nicht richtig. Hier ist ein PHP-Code, den wir für unser System verwenden. In alle Richtungen arbeiten

PHP-Code:

Lat1 = Breitengrad des Startpunktes in Grad

Long1 = Längengrad des Startpunktes in Grad

D = Abstand in KM

Winkel = Lager in Grad

 function get_gps_distance($lat1,$long1,$d,$angle) { # Earth Radious in KM $R = 6378.14; # Degree to Radian $latitude1 = $lat1 * (M_PI/180); $longitude1 = $long1 * (M_PI/180); $brng = $angle * (M_PI/180); $latitude2 = asin(sin($latitude1)*cos($d/$R) + cos($latitude1)*sin($d/$R)*cos($brng)); $longitude2 = $longitude1 + atan2(sin($brng)*sin($d/$R)*cos($latitude1),cos($d/$R)-sin($latitude1)*sin($latitude2)); # back to degrees $latitude2 = $latitude2 * (180/M_PI); $longitude2 = $longitude2 * (180/M_PI); # 6 decimal for Leaflet and other system compatibility $lat2 = round ($latitude2,6); $long2 = round ($longitude2,6); // Push in array and get back $tab[0] = $lat2; $tab[1] = $long2; return $tab; } 

Lon1 und lat1 in Grad

Brng = tragen im Bogenmaß

D = Entfernung in km

R = Radius der Erde in km

 lat2 = math.degrees((d/R) * math.cos(brng)) + lat1 long2 = math.degrees((d/(R*math.sin(math.radians(lat2)))) * math.sin(brng)) + long1 

Ich habe deinen Algorithmus und meine in PHP implementiert und benchmarked es. Diese Version lief in etwa 50% der Zeit. Die erzielten Ergebnisse waren identisch, also scheint es mathematisch gleichwertig zu sein.

Ich habe nicht getestet, die Python-Code oben, so könnte es Syntax-Fehler.

Auch spät, aber für diejenigen, die dies finden können, erhalten Sie genauere Ergebnisse mit der geographischen Bibliothek. Schauen Sie sich die geodätischen Problembeschreibungen und die JavaScript-Beispiele für eine einfache Einführung in die Verwendung zur Beantwortung der Themenfrage sowie viele andere. Implementierungen in einer Vielzahl von Sprachen einschließlich Python. Weit besser als Kodierung deines eigenen, wenn du dich um Genauigkeit kümmertest; Besser als VincentyDistance in der früheren "verwenden Sie eine Bibliothek" Empfehlung. Wie die Dokumentation sagt: "Der Schwerpunkt liegt auf der Rückgabe genauer Ergebnisse mit Fehlern in der Nähe von Rundungen (ca. 5-15 Nanometer)."

Ersetzen Sie einfach die Werte in der Funktion atan2 (y, x). Nicht atan2 (x, y)!

  • Rechtecke von Punkten mit Python
  • Geodätische Pufferung in Python
  • Wie zeigt man Formfile-Label in Python-Grundkarten-Legende?
  • Fast Haversine Approximation (Python / Pandas)
  • Python ArcGIS ArcPy RuntimeError: NichtInitialisiert
  • Wie konvertiere ich Kilometer in Grade in Geodjango / GEOS?
  • 3D-Distanzberechnungen mit GeoDjango
  • Fügen Sie Variablenwerte in einen String in Python ein
  • Finden Sie alle Koordinaten innerhalb eines Kreises in geographischen Daten in Python
  • Datenstruktur, um schnelle GPS-Lookups durchzuführen?
  • Python 3.4 stürzt bei der Herstellung von einigen - aber nicht allen - Cartopy-Karten mit Segmentierungsfehler 11 ab
  • Python ist die beste Programmiersprache der Welt.