437 Stimmen

Berechnen Sie die Entfernung zwischen 2 GPS-Koordinaten

Wie berechne ich die Entfernung zwischen zwei GPS-Koordinaten (unter Verwendung von Breitengrad und Längengrad)?

3 Stimmen

Dieser Algorithmus ist als die Großkreisdistanz bekannt.

0 Stimmen

@GregHewgill, der erste Satz dieses Artikels besagt "Dieser Artikel handelt von der kürzesten Entfernung auf einer Kugel." Also offensichtlich nicht anwendbar auf GPS-Koordinaten.

22voto

Hier ist eine Haversine-Funktion in Python, die ich verwende:

from math import pi,sqrt,sin,cos,atan2

def haversine(pos1, pos2):
    lat1 = float(pos1['lat'])
    long1 = float(pos1['long'])
    lat2 = float(pos2['lat'])
    long2 = float(pos2['long'])

    degree_to_rad = float(pi / 180.0)

    d_lat = (lat2 - lat1) * degree_to_rad
    d_long = (long2 - long1) * degree_to_rad

    a = pow(sin(d_lat / 2), 2) + cos(lat1 * degree_to_rad) * cos(lat2 * degree_to_rad) * pow(sin(d_long / 2), 2)
    c = 2 * atan2(sqrt(a), sqrt(1 - a))
    km = 6367 * c
    mi = 3956 * c

    return {"km":km, "miles":mi}

20voto

Salvador Dali Punkte 197375

Ich musste viele Entfernungen zwischen den Punkten für mein Projekt berechnen, also habe ich versucht, den Code zu optimieren, den ich hier gefunden habe. Im Durchschnitt läuft meine neue Implementierung in verschiedenen Browsern 2 mal schneller als die am meisten hochgevotete Antwort.

function distance(lat1, lon1, lat2, lon2) {
  var p = 0.017453292519943295;    // Math.PI / 180
  var c = Math.cos;
  var a = 0.5 - c((lat2 - lat1) * p)/2 + 
          c(lat1 * p) * c(lat2 * p) * 
          (1 - c((lon2 - lon1) * p))/2;

  return 12742 * Math.asin(Math.sqrt(a)); // 2 * R; R = 6371 km
}

Du kannst mit meinem jsPerf spielen und die Ergebnisse hier sehen.

Kürzlich musste ich dasselbe in Python machen, also hier eine Python-Implementierung:

from math import cos, asin, sqrt
def distance(lat1, lon1, lat2, lon2):
    p = 0.017453292519943295
    a = 0.5 - cos((lat2 - lat1) * p)/2 + cos(lat1 * p) * cos(lat2 * p) * (1 - cos((lon2 - lon1) * p)) / 2
    return 12742 * asin(sqrt(a))

Und der Vollständigkeit halber: Haversine auf Wiki.

16voto

seanb Punkte 6859

Es hängt davon ab, wie genau du es brauchst. Wenn du eine punktgenaue Genauigkeit benötigst, ist es am besten, nach einem Algorithmus zu suchen, der ein Ellipsoid verwendet, anstatt einer Kugel, wie zum Beispiel Vincenty's Algorithmus, der genau bis auf den Millimeter genau ist.

12voto

quape Punkte 688

PHP-Version:

(Entfernen Sie alle deg2rad(), wenn Ihre Koordinaten bereits in Radianten vorliegen.)

$R = 6371; // km
$dLat = deg2rad($lat2-$lat1);
$dLon = deg2rad($lon2-$lon1);
$lat1 = deg2rad($lat1);
$lat2 = deg2rad($lat2);

$a = sin($dLat/2) * sin($dLat/2) +
     sin($dLon/2) * sin($dLon/2) * cos($lat1) * cos($lat2); 

$c = 2 * atan2(sqrt($a), sqrt(1-$a)); 
$d = $R * $c;

12voto

Mike Chamberlain Punkte 34722

Hier ist es in C# (Breiten- und Längengrad in Bogenmaß):

double CalculateGreatCircleDistance(double lat1, double long1, double lat2, double long2, double radius)
{
    return radius * Math.Acos(
        Math.Sin(lat1) * Math.Sin(lat2)
        + Math.Cos(lat1) * Math.Cos(lat2) * Math.Cos(long2 - long1));
}

Wenn Ihre Breiten- und Längengrade in Grad angegeben sind, teilen Sie diese durch 180/PI, um in Bogenmaß umzurechnen.

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