Vielen Dank für all dies. Ich habe den folgenden Code in meiner Objective-C iPhone-App verwendet:
const double PIx = 3,141592653589793;
const double RADIO = 6371; // Durchschnittlicher Radius der Erde in km
double convertToRadians(double val) {
return val * PIx / 180;
}
-(double)KilometerZwischenOrt1:(CLLocationCoordinate2D) ort1 undOrt2:(CLLocationCoordinate2D) ort2 {
double dlon = convertToRadians(ort2.longitude - ort1.longitude);
double dlat = convertToRadians(ort2.latitude - ort1.latitude);
double a = ( pow(sin(dlat / 2), 2) + cos(convertToRadians(ort1.latitude))) * cos(convertToRadians(ort2.latitude)) * pow(sin(dlon / 2), 2);
double winkel = 2 * asin(sqrt(a));
return winkel * RADIO;
}
Latitude und Longitude sind in Dezimalzahlen angegeben. Ich habe min() für den asin() Aufruf nicht verwendet, da die Entfernungen, die ich benutze, so klein sind, dass es nicht erforderlich ist.
Es gab falsche Antworten, bis ich die Werte in Radian umgewandelt habe - jetzt sind sie fast gleich wie die Werte, die aus der Apple Map-App erhalten werden :-)
Zusätzliches Update:
Wenn Sie iOS4 oder neuer verwenden, bietet Apple einige Methoden, um dies zu tun, sodass die gleiche Funktionalität mit folgendem Code erreicht werden würde:
-(double)KilometerZwischenOrt1:(CLLocationCoordinate2D) ort1 undOrt2:(CLLocationCoordinate2D) ort2 {
MKMapPoint start, finish;
start = MKMapPointForCoordinate(ort1);
finish = MKMapPointForCoordinate(ort2);
return MKMetersBetweenMapPoints(start, finish) / 1000;
}
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.
0 Stimmen
@MikeT - das stimmt, obwohl viele der Antworten hier nützlich zu sein scheinen über kleine Entfernungen: Wenn Sie Breiten- / Längengrad von WGS 84 nehmen und Haversine wie wenn es Punkte auf einer Kugel anwenden, erhalten Sie Antworten, deren Fehler nur auf den Erdabplattungsfaktor zurückzuführen sind, vielleicht also innerhalb von 1% einer genaueren Formel? Mit der Einschränkung, dass es sich um kleine Entfernungen handelt, sagen wir innerhalb einer einzigen Stadt.
1 Stimmen
Für diese Plattformen: Mono/.NET 4.5/.NET Core/Windows Phone 8.x/Universal Windows Platform/Xamarin iOS/Xamarin Android siehe stackoverflow.com/a/54296314/2736742
0 Stimmen
Siehe auch diese großartige Python-Antwort: Schnelle Haversine-Approximation (Python/Pandas)