Feedback

C# - Berechnung der Entfernung zwischen GPS-Koordinaten

Veröffentlicht von am 7/15/2009
(3 Bewertungen)
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

Roland Climb schrieb am 5/4/2010:
Gibt es vielleicht ein Maske, in die man die Koordinaten zweier Punkte einträgt und dann die Distanz ablesen kann........?
z.B.
N 47° 42.326 u. 007° 40.655
nach
E 47° 42.109 u. 007° 40.733
Arpad Stoever schrieb am 12/1/2010:
Mal ein Lob loswerden.
Funktioniert problemlos und erspart mir viel Kopfzerbrechen.
 

Logge dich ein, um hier zu kommentieren!