Feedback

C# - Berechnung der Entfernung zwischen GPS-Koordinaten

Veröffentlicht von am 15.07.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
GFU-Schulungen  [Anzeige]

C# Grundlagen

Die Schulung vermittelt Ihnen die Grundlagen von C# in der Arbeit mit Datentypen sowie bei Klassenbibliotheken. Sie lernen, mit Variablen umzugehen und deren verschiedene Formen zu konvertieren. 

XML und .NET Überblick

Um auf dem neuesten Wissensstand zu sein, sollten Sie unser aktuelles ASP .NET Komplett Seminar belegen.
Nach dem Seminar kennen Sie die wichtigsten Strömungen in der Software-Technologie

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 04.05.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 01.12.2010:
Mal ein Lob loswerden.
Funktioniert problemlos und erspart mir viel Kopfzerbrechen.
 

Logge dich ein, um hier zu kommentieren!