437 Stimmen

Berechnen Sie die Entfernung zwischen 2 GPS-Koordinaten

Wie berechne ich die Entfernung zwischen zwei GPS-Koordinaten (unter Verwendung von Breitengrad und Längengrad)?

3 Stimmen

Dieser Algorithmus ist als die Großkreisdistanz bekannt.

0 Stimmen

@GregHewgill, der erste Satz dieses Artikels besagt "Dieser Artikel handelt von der kürzesten Entfernung auf einer Kugel." Also offensichtlich nicht anwendbar auf GPS-Koordinaten.

503voto

cletus Punkte 596503

Berechnen Sie die Entfernung zwischen zwei Koordinaten anhand von Breiten- und Längengraden, einschließlich einer Javascript-Implementierung.

West und Süd Standorte sind negativ. Denken Sie daran, dass Minuten und Sekunden jeweils 60 ergeben, sodass S31 30' -31,50 Grad entspricht.

Vergessen Sie nicht, die Grad in Radiant umzurechnen. Viele Sprachen haben diese Funktion. Oder es handelt sich um eine einfache Berechnung: radians = degrees * PI / 180.

function degreesToRadians(degrees) {
  return degrees * Math.PI / 180;
}

function distanceInKmBetweenEarthCoordinates(lat1, lon1, lat2, lon2) {
  var earthRadiusKm = 6371;

  var dLat = degreesToRadians(lat2-lat1);
  var dLon = degreesToRadians(lon2-lon1);

  lat1 = degreesToRadians(lat1);
  lat2 = degreesToRadians(lat2);

  var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
          Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2); 
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
  return earthRadiusKm * c;
}

Hier sind einige Beispiele zur Verwendung:

distanceInKmBetweenEarthCoordinates(0,0,0,0)  // Die Entfernung zwischen den gleichen 
                                              // Punkten sollte 0 betragen
0

distanceInKmBetweenEarthCoordinates(51.5, 0, 38.8, -77.1) // Von London
                                                          // nach Arlington
5918.185064088764

63voto

Peter Greis Punkte 629

Suchen Sie mit Google nach Haversine; hier ist meine Lösung:

#include 
#include "haversine.h"

#define d2r (M_PI / 180.0)

//berechnen Sie die Haversine-Distanz für lineare Distanz
double haversine_km(double lat1, double long1, double lat2, double long2)
{
    double dlong = (long2 - long1) * d2r;
    double dlat = (lat2 - lat1) * d2r;
    double a = pow(sin(dlat/2.0), 2) + cos(lat1*d2r) * cos(lat2*d2r) * pow(sin(dlong/2.0), 2);
    double c = 2 * atan2(sqrt(a), sqrt(1-a));
    double d = 6367 * c;

    return d;
}

double haversine_mi(double lat1, double long1, double lat2, double long2)
{
    double dlong = (long2 - long1) * d2r;
    double dlat = (lat2 - lat1) * d2r;
    double a = pow(sin(dlat/2.0), 2) + cos(lat1*d2r) * cos(lat2*d2r) * pow(sin(dlong/2.0), 2);
    double c = 2 * atan2(sqrt(a), sqrt(1-a));
    double d = 3956 * c; 

    return d;
}

48voto

Roman Makarov Punkte 469

C# Version von Haversine

double _equatorialerErdradius = 6378.1370D;
double _d2r = (Math.PI / 180D);

private int HaversineInM(double lat1, double long1, double lat2, double long2)
{
    return (int)(1000D * HaversineInKM(lat1, long1, lat2, long2));
}

private double HaversineInKM(double lat1, double long1, double lat2, double long2)
{
    double dlong = (long2 - long1) * _d2r;
    double dlat = (lat2 - lat1) * _d2r;
    double a = Math.Pow(Math.Sin(dlat / 2D), 2D) + Math.Cos(lat1 * _d2r) * Math.Cos(lat2 * _d2r) * Math.Pow(Math.Sin(dlong / 2D), 2D);
    double c = 2D * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1D - a));
    double d = _equatorialerErdradius * c;

    return d;
}

Hier ist ein .NET Fiddle davon, damit Sie es mit Ihren eigenen Lat/Longs testen können.

29voto

Java-Version des Haversine-Algorithmus basierend auf Roman Makarovs Antwort auf diesen Thread

public class HaversineAlgorithm {

    static final double _eQuatorialEarthRadius = 6378.1370D;
    static final double _d2r = (Math.PI / 180D);

    public static int HaversineInM(double lat1, double long1, double lat2, double long2) {
        return (int) (1000D * HaversineInKM(lat1, long1, lat2, long2));
    }

    public static double HaversineInKM(double lat1, double long1, double lat2, double long2) {
        double dlong = (long2 - long1) * _d2r;
        double dlat = (lat2 - lat1) * _d2r;
        double a = Math.pow(Math.sin(dlat / 2D), 2D) + Math.cos(lat1 * _d2r) * Math.cos(lat2 * _d2r)
                * Math.pow(Math.sin(dlong / 2D), 2D);
        double c = 2D * Math.atan2(Math.sqrt(a), Math.sqrt(1D - a));
        double d = _eQuatorialEarthRadius * c;

        return d;
    }

}

26voto

Marko Tintor Punkte 389

Dies ist sehr einfach mit dem Geographie-Typ in SQL Server 2008 zu erledigen.

SELECT geography::Point(lat1, lon1, 4326).STDistance(geography::Point(lat2, lon2, 4326))
-- berechnet die Entfernung in Metern mit dem elliptischen Modell, genau bis auf den Millimeter

4326 ist die SRID für das WGS84 elliptische Erdmodell

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X