Wie berechne ich die Entfernung zwischen zwei GPS-Koordinaten (unter Verwendung von Breitengrad und Längengrad)?
Antworten
Zu viele Anzeigen?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
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;
}
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.
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;
}
}
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
- See previous answers
- Weitere Antworten anzeigen
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.