1157 Stimmen

Die Distanz zwischen zwei Breitengrad-Längengrad-Punkten berechnen? (Haversine-Formel)

Wie berechne ich die Entfernung zwischen zwei Punkten, die durch Breiten- und Längengrad angegeben sind?

Zur Klarstellung möchte ich die Entfernung in Kilometern; die Punkte verwenden das WGS84-System und ich möchte die relativen Genauigkeiten der verfügbaren Methoden verstehen.

0 Stimmen

Für eine bessere Genauigkeit - siehe stackoverflow.com/questions/1420045/…

4 Stimmen

Beachten Sie, dass Sie die Haversine-Formel nicht auf einem Rotationsellipsoid wie WGS 84 anwenden können. Sie können diese Methode nur auf einer Kugel mit einem Radius anwenden.

8 Stimmen

Die meisten Antworten hier verwenden einfache sphärische Trigonometrie, daher sind die Ergebnisse im Vergleich zu den WGS84-Ellipsoidentfernungen, die im GPS-System verwendet werden, ziemlich grob. Einige der Antworten beziehen sich zwar auf die Vincenty-Formel für Ellipsoide, aber dieser Algorithmus wurde für die Verwendung auf Schreibtischrechnern aus den 1960er Jahren entwickelt und weist Stabilitäts- und Genauigkeitsprobleme auf; wir haben jetzt bessere Hardware und Software. Bitte sehen Sie GeographicLib für eine hochwertige Bibliothek mit Implementierungen in verschiedenen Sprachen.

2voto

WapShivam Punkte 858

Sie können es mit der Haversine-Formel berechnen, die lautet:

a = sin²(/2) + cos 1  cos 2  sin²(/2)
c = 2  atan2( a, (1a) )
d = R  c

Ein Beispiel zur Berechnung der Entfernung zwischen zwei Punkten finden Sie unten

Angenommen, ich muss die Entfernung zwischen Neu-Delhi und London berechnen, wie kann ich diese Formel nutzen:

Neu Delhi Koordinaten= 28.7041° N, 77.1025° E
London Koordinaten= 51.5074° N, 0.1278° W

var R = 6371e3; // Meter
var 1 = 28.7041.toRadians();
var 2 = 51.5074.toRadians();
var  = (51.5074-28.7041).toRadians();
var  = (0.1278-77.1025).toRadians();

var a = Math.sin(/2) * Math.sin(/2) +
        Math.cos(1) * Math.cos(2) *
        Math.sin(/2) * Math.sin(/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));

var d = R * c; // Meter
d = d/1000; // km

2voto

ayalcinkaya Punkte 3093

Es gibt ein gutes Beispiel hier, um die Entfernung mit PHP zu berechnen http://www.geodatasource.com/developers/php:

 function distance($lat1, $lon1, $lat2, $lon2, $unit) {

     $theta = $lon1 - $lon2;
     $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
     $dist = acos($dist);
     $dist = rad2deg($dist);
     $miles = $dist * 60 * 1.1515;
     $unit = strtoupper($unit);

     if ($unit == "K") {
         return ($miles * 1.609344);
     } else if ($unit == "N") {
          return ($miles * 0.8684);
     } else {
          return $miles;
     }
 }

1voto

Eric Walsh Punkte 2875

Hatte ein Problem mit math.deg in LUA... falls jemand eine Lösung kennt, bitte bereinigen Sie diesen Code!

In der Zwischenzeit hier eine Implementierung des Haversine in LUA (verwenden Sie dies mit Redis!)

function calcDist(lat1, lon1, lat2, lon2)
    lat1= lat1*0.0174532925
    lat2= lat2*0.0174532925
    lon1= lon1*0.0174532925
    lon2= lon2*0.0174532925

    dlon = lon2-lon1
    dlat = lat2-lat1

    a = math.pow(math.sin(dlat/2),2) + math.cos(lat1) * math.cos(lat2) * math.pow(math.sin(dlon/2),2)
    c = 2 * math.asin(math.sqrt(a))
    dist = 6371 * c      -- multipliziere mit 0.621371, um in Meilen umzurechnen
    return dist
end

Prost!

0 Stimmen

Vergessen Sie nicht, Variablen (dlon, dlat, a, c, dist) als local zu deklarieren, um den globalen Platz nicht zu verschmutzen.

1voto

Aaron Lelevier Punkte 18400

Hier ist die Erlang-Implementierung

lat_lng({Lat1, Lon1}=_Point1, {Lat2, Lon2}=_Point2) ->
  P = math:pi() / 180,
  R = 6371, % Radius der Erde in KM
  A = 0.5 - math:cos((Lat2 - Lat1) * P) / 2 +
    math:cos(Lat1 * P) * math:cos(Lat2 * P) * (1 - math:cos((Lon2 - Lon1) * P))/2,
  R * 2 * math:asin(math:sqrt(A)).

1voto

Irfan wani Punkte 3073

Wenn Sie Python verwenden; pip install geopy

from geopy.distance import geodesic

origin = (30.172705, 31.526725)  # (Breitengrad, Längengrad) nicht verwechseln
destination = (30.288281, 31.732326)

print(geodesic(origin, destination).meter)  # 23576.805481751613
print(geodesic(origin, destination).kilometers)  # 23.576805481751613
print(geodesic(origin, destination).miles)  # 14.64994773134371

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X