Ich berechne den Abstand zwischen zwei GeoCoordinates. Ich teste meine App gegen 3-4 andere Apps. Wenn ich die Entfernung berechne, erhalte ich für meine Berechnung in der Regel durchschnittlich 3,3 Meilen, während andere Apps 3,5 Meilen erhalten. Es ist ein großer Unterschied für die Berechnung, die ich durchführen möchte. Gibt es gute Klassenbibliotheken zur Berechnung der Entfernung? Ich berechne es so in C #:
public static double Calculate(double sLatitude,double sLongitude, double eLatitude,
double eLongitude)
{
var radiansOverDegrees = (Math.PI / 180.0);
var sLatitudeRadians = sLatitude * radiansOverDegrees;
var sLongitudeRadians = sLongitude * radiansOverDegrees;
var eLatitudeRadians = eLatitude * radiansOverDegrees;
var eLongitudeRadians = eLongitude * radiansOverDegrees;
var dLongitude = eLongitudeRadians - sLongitudeRadians;
var dLatitude = eLatitudeRadians - sLatitudeRadians;
var result1 = Math.Pow(Math.Sin(dLatitude / 2.0), 2.0) +
Math.Cos(sLatitudeRadians) * Math.Cos(eLatitudeRadians) *
Math.Pow(Math.Sin(dLongitude / 2.0), 2.0);
// Using 3956 as the number of miles around the earth
var result2 = 3956.0 * 2.0 *
Math.Atan2(Math.Sqrt(result1), Math.Sqrt(1.0 - result1));
return result2;
}
Was könnte ich falsch machen? Soll ich es zuerst in km berechnen und dann in Meilen umrechnen?
c#
windows-phone-7
geocoding
latitude-longitude
Jason N. Gaylord
quelle
quelle
Antworten:
Die GeoCoordinate- Klasse (.NET Framework 4 und höher) verfügt bereits über eine
GetDistanceTo
Methode.Die Entfernung ist in Metern.
Sie müssen auf System.Device verweisen.
quelle
GetDistance ist die beste Lösung , aber in vielen Fällen können wir diese Methode nicht verwenden (z. B. Universal App).
Pseudocode des Algorithmus zur Berechnung des Abstands zwischen den Koorindaten:
Real World C # -Implementierung , bei der Erweiterungsmethoden verwendet werden
Verwendung:
Implementierung:
quelle
Und hier, für diejenigen, die noch nicht zufrieden sind, der ursprüngliche Code aus der .NET-Frameworks-
GeoCoordinate
Klasse, der in eine eigenständige Methode umgewandelt wurde:quelle
double oneDegree = Math.PI / 180.0;
?Hier ist die JavaScript-Version Jungs und Mädels
quelle
Für diejenigen, die Xamarin verwenden und keinen Zugriff auf die GeoCoordinate-Klasse haben, können Sie stattdessen die Android Location-Klasse verwenden:
quelle
Sie können diese Funktion verwenden:
Quelle: https://www.geodatasource.com/developers/c-sharp
quelle
Es gibt diese Bibliothek GeoCoordinate für diese Plattformen:
Die Installation erfolgt über NuGet:
Verwendung
Der Abstand zwischen den beiden Koordinaten in Metern .
quelle
Basierend auf Elliot Woods Funktion und wenn jemand an einer C-Funktion interessiert ist, funktioniert diese ...
Sie können es in double ändern . Es gibt den Wert in km zurück.
quelle
Berechnung der Entfernung zwischen Breiten- und Längengradpunkten ...
quelle
Dies ist eine alte Frage, dennoch haben mich die Antworten hinsichtlich Leistung und Optimierung nicht befriedigt.
Hier meine optimierte C # -Variante (Entfernung in km, ohne Variablen und redundante Berechnungen, sehr nahe am mathematischen Ausdruck des Haversine Formulars https://en.wikipedia.org/wiki/Haversine_formula ).
Inspiriert von: https://rosettacode.org/wiki/Haversine_formula#C.23
quelle
Versuche dies:
quelle
Sie können verwenden
System.device.Location
:Viel Glück
quelle
Wenn die CPU / Mathe-Rechenleistung begrenzt ist:
Es gibt Zeiten (wie in meiner Arbeit), in denen die Rechenleistung knapp ist (z. B. kein Gleitkommaprozessor, der mit kleinen Mikrocontrollern arbeitet), in denen einige Triggerfunktionen eine exorbitante Menge an CPU-Zeit in Anspruch nehmen können (z. B. mehr als 3000 Taktzyklen) Ich brauche nur eine Annäherung, besonders wenn die CPU nicht lange gebunden sein muss. Ich verwende dies, um den CPU-Overhead zu minimieren:
Das Guthaben geht an https://github.com/kristianmandrup/geo_vectors/blob/master/Distance%20calc%20notes.txt .
quelle