Wie berechne ich die Entfernung zwischen zwei GPS-Koordinaten (unter Verwendung von Breitengrad und Längengrad)?
Antworten
Zu viele Anzeigen?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}
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.
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.
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;
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.
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.