Das Snippet ermöglicht die Berechnung zwischen zwei oder mehreren GPS-Koordinaten nach dem Great Circle Distance-Verfahren (http://en.wikipedia.org/wiki/Great-circle_distance).
Als Rückgabe erfolgt ein double-Wert mit der Maßeinheit Kilometer.
Anwendung://Luftlinie zwischen
//Mannheim -> Ludwigshafen -> Stuttgart -> Berlin
double distance =
TrackingHelper.CalculateDistance(
new Location() { Latitude = 49.4833270, Longitude = 8.4748935 },
new Location() { Latitude = 49.4822117, Longitude = 8.4378147 },
new Location() { Latitude = 48.7794059, Longitude = 9.1755294 },
new Location() { Latitude = 52.5230417, Longitude = 13.4108447 });
Anmerkung:
Zuerst hatte ich es selbst probiert, aber vergessen in Radianten umzurechnen. Dann hatte ich gesucht und zwei bereits existierende Funktionen etwas angepasst und noch zusätzlich erweitert. Hier die beiden ursprünglichen Snippets:
http://www.personalmicrocosms.com/Pages/dotnettips.aspx?c=26&t=41#tip
http://www.personalmicrocosms.com/Pages/dotnettips.aspx?c=26&t=42#tip
public class Location
{
public double Latitude { get; set; }
public double Longitude { get; set; }
}
public static class TrackingHelper
{
private static double DegreesToRadians(double degrees)
{
return degrees * Math.PI / 180.0;
}
public static double CalculateDistance(Location location1, Location location2)
{
double circumference = 40000.0; // Erdumfang in km am Äquator
double distance = 0.0;
//Radianten berechnen
double latitude1Rad = DegreesToRadians(location1.Latitude);
double longitude1Rad = DegreesToRadians(location1.Longitude);
double latititude2Rad = DegreesToRadians(location2.Latitude);
double longitude2Rad = DegreesToRadians(location2.Longitude);
double logitudeDiff = Math.Abs(longitude1Rad - longitude2Rad);
if (logitudeDiff > Math.PI)
{
logitudeDiff = 2.0 * Math.PI - logitudeDiff;
}
double angleCalculation =
Math.Acos(
Math.Sin(latititude2Rad) * Math.Sin(latitude1Rad) +
Math.Cos(latititude2Rad) * Math.Cos(latitude1Rad) * Math.Cos(logitudeDiff));
distance = circumference * angleCalculation / (2.0 * Math.PI);
return distance;
}
public static double CalculateDistance(params Location[] locations)
{
double totalDistance = 0.0;
for (int i = 0; i < locations.Length - 1; i++)
{
Location current = locations[i];
Location next = locations[i + 1];
totalDistance += CalculateDistance(current, next);
}
return totalDistance;
}
}
2 Kommentare zum Snippet