1157 Stimmen

Die Distanz zwischen zwei Breitengrad-Längengrad-Punkten berechnen? (Haversine-Formel)

Wie berechne ich die Entfernung zwischen zwei Punkten, die durch Breiten- und Längengrad angegeben sind?

Zur Klarstellung möchte ich die Entfernung in Kilometern; die Punkte verwenden das WGS84-System und ich möchte die relativen Genauigkeiten der verfügbaren Methoden verstehen.

0 Stimmen

Für eine bessere Genauigkeit - siehe stackoverflow.com/questions/1420045/…

4 Stimmen

Beachten Sie, dass Sie die Haversine-Formel nicht auf einem Rotationsellipsoid wie WGS 84 anwenden können. Sie können diese Methode nur auf einer Kugel mit einem Radius anwenden.

8 Stimmen

Die meisten Antworten hier verwenden einfache sphärische Trigonometrie, daher sind die Ergebnisse im Vergleich zu den WGS84-Ellipsoidentfernungen, die im GPS-System verwendet werden, ziemlich grob. Einige der Antworten beziehen sich zwar auf die Vincenty-Formel für Ellipsoide, aber dieser Algorithmus wurde für die Verwendung auf Schreibtischrechnern aus den 1960er Jahren entwickelt und weist Stabilitäts- und Genauigkeitsprobleme auf; wir haben jetzt bessere Hardware und Software. Bitte sehen Sie GeographicLib für eine hochwertige Bibliothek mit Implementierungen in verschiedenen Sprachen.

3voto

Hier ist meine Java-Implementierung zur Berechnung der Entfernung über Dezimalgrade nach einiger Recherche. Ich habe den mittleren Radius der Welt (von Wikipedia) in km verwendet. Wenn Sie das Ergebnis in Meilen möchten, verwenden Sie den Weltradius in Meilen.

public static double distanceLatLong2(double lat1, double lng1, double lat2, double lng2) 
{
  double earthRadius = 6371.0d; // KM: hier Meile verwenden, wenn Sie ein Ergebnis in Meilen möchten

  double dLat = toRadian(lat2 - lat1);
  double dLng = toRadian(lng2 - lng1);

  double a = Math.pow(Math.sin(dLat/2), 2)  + 
          Math.cos(toRadian(lat1)) * Math.cos(toRadian(lat2)) * 
          Math.pow(Math.sin(dLng/2), 2);

  double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));

  return earthRadius * c; // gibt das Ergebnis in Kilometern zurück
}

public static double toRadian(double degrees) 
{
  return (degrees * Math.PI) / 180.0d;
}

2voto

Arthur Ronconi Punkte 1962

Sie könnten auch ein Modul wie geolib verwenden:

Wie man installiert:

$ npm install geolib

Wie man benutzt:

import { getDistance } from 'geolib'

const distance = getDistance(
    { latitude: 51.5103, longitude: 7.49347 },
    { latitude: "51° 31' N", longitude: "7° 28' E" }
)

console.log(distance)

Dokumentation: https://www.npmjs.com/package/geolib

2voto

shanavascet Punkte 580

Verwenden Sie in Mysql die folgende Funktion und übergeben Sie die Parameter unter Verwendung von POINT(LANG, LAT)

CREATE FUNCTION `distance`(a POINT, b POINT)
 RETURNS double
    DETERMINISTIC
BEGIN

RETURN

GLength( LineString(( PointFromWKB(a)), (PointFromWKB(b)))) * 100000; -- Um die Entfernung in Metern zu berechnen

END;

2voto

aldrien.h Punkte 3037

Hier ist ein weiteres in Ruby-Code umgewandelt:

include Math
# Hinweis: von/bis = [Breitengrad, Längengrad]

def get_distance_in_km(von, bis)
  radian = lambda { |grad| grad * Math::PI / 180 }
  radius = 6371 # Radius der Erde in Kilometer
  dLat = radian[bis[0]-von[0]]
  dLon = radian[bis[1]-von[1]]

  cosinussprodukt = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(radian[von[0]]) * Math.cos(radian[bis[1]]) * Math.sin(dLon/2) * Math.sin(dLon/2)

  c = 2 * Math.atan2(Math.sqrt(cosinussprodukt), Math.sqrt(1-cosinussprodukt)) 
  return radius * c # Entfernung in Kilometer
end

2voto

MPaulo Punkte 1481
function getDistanceFromLatLonInKm(lat1,lon1,lat2,lon2,units) {
  var R = 6371; // Radius der Erde in km
  var dLat = deg2rad(lat2-lat1);  // deg2rad unten
  var dLon = deg2rad(lon2-lon1); 
  var a = 
    Math.sin(dLat/2) * Math.sin(dLat/2) +
    Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * 
    Math.sin(dLon/2) * Math.sin(dLon/2)
    ; 
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
  var d = R * c; 
  var miles = d / 1.609344; 

if ( units == 'km' ) {  
return d; 
 } else {
return miles;
}}

Chuck's Lösung, auch für Meilen gültig.

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