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# Aufbaukurs

Sie haben grundlegende .NET- und C#-Kenntnisse und und wollen diese nun erweitern. Der Aufbaukurs C# führt Sie ein die Arbeit mit Interfaces und Delegates, Generics und Parallel Computing.

C# Komplett

Sie kennen sich in objektorientierter Programmierung aus. Sie schreiben C++ oder Java? Und nun stehen Sie vor der Aufgabe, in C# Anwendungen zu erstellen. Das C# Komplett-Seminar verschafft Ihnen umfassende Programmierkenntnisse in dieser Sprache. Nach der Schulung entwickeln Sie selbständig Anwendungen mit C#. Sie kennen die Datentypen und Klassenbibliotheken der objektorientierten Programmiersprache C#. Der Komplettkurs setzt bei den Grundlagen von C# ein. Sie arbeiten mit Variablen und konvertieren Typen. Multithreading, Delegates, Generics sind nach dem Seminar für Sie kein Geheimnis mehr.

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!