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.

4voto

fla Punkte 133

Hier ist ein Beispiel in postgres sql (in km, für die Meilen-Version ersetzen Sie die Version 1.609344 durch 0.8684)

ERSTELLEN ODER ERSETZEN FUNKTION Öffentlich.Geodistanz(alat float, alng float, blat  

float, blng  float)
  RETURNS float ALS
$BODY$
DECLARE
    v_distance float;
BEGIN

    v_distance = asin( sqrt(
            sin(radians(blat-alat)/2)^2 
                + (
                    (sin(radians(blng-alng)/2)^2) *
                    cos(radians(alat)) *
                    cos(radians(blat))
                )
          )
        ) * cast('7926.3352' as float) * cast('0.8684' as float) ;

    RETURN v_distance;
END 
$BODY$
LANGUAGE plpgsql VOLATILE SECURITY DEFINER;
ALTER FUNCTION Geodistanz(alat float, alng float, blat float, blng float)
OWNER TO postgres;

3voto

Um die Entfernung zwischen zwei Punkten auf einer Kugel zu berechnen, müssen Sie die Großkreisberechnung durchführen.

Es gibt eine Reihe von C/C++-Bibliotheken, die bei der Kartenprojektion helfen, auf MapTools, wenn Sie Ihre Entfernungen auf eine flache Oberfläche zurückprojizieren müssen. Dazu benötigen Sie den Projektionsstring der verschiedenen Koordinatensysteme.

Sie finden möglicherweise auch MapWindow ein nützliches Tool zur Visualisierung der Punkte. Da es auch Open Source ist, ist es ein nützlicher Leitfaden zur Verwendung der proj.dll-Bibliothek, die anscheinend die Kern-Open-Source-Projektionsbibliothek ist.

3voto

Korayem Punkte 11177

Für diejenigen, die nach einer Excel-Formel basierend auf den Standards WGS-84 & GRS-80 suchen:

=ACOS(COS(RADIANS(90-Lat1))*COS(RADIANS(90-Lat2))+SIN(RADIANS(90-Lat1))*SIN(RADIANS(90-Lat2))*COS(RADIANS(Long1-Long2)))*6371

Quelle

1 Stimmen

Im Format: =LAMBDA(lat,lng,lat,lng, LET(R, 6371, Lat, RADIANS(lat - lat), Lng, RADIANS(lng - lng), a, SIN(Lat / 2)^2 + COS(RADIANS(lat)) * COS(RADIANS(lat)) * SIN(Lng / 2)^2, c, 2 * ATAN2(SQRT(1 - a), SQRT(a)), d, R * c * 0.621371, d))

3voto

Eduardo Naveda Punkte 1660

Hier ist die akzeptierte Antwortsimplementierung in Java für den Fall, dass jemand sie benötigt.

package com.project529.garage.util;

/**
 * Mittlerer Radius.
 */
private static double EARTH_RADIUS = 6371;

/**
 * Gibt den Abstand zwischen zwei Sätzen von Breiten- und Längengraden in Metern zurück.
 *

3voto

Raphael C Punkte 2003
function getDistanceFromLatLonInKm(position1, position2) {
    "use strict";
    var deg2rad = function (deg) { return deg * (Math.PI / 180); },
        R = 6371,
        dLat = deg2rad(position2.lat - position1.lat),
        dLng = deg2rad(position2.lng - position1.lng),
        a = Math.sin(dLat / 2) * Math.sin(dLat / 2)
            + Math.cos(deg2rad(position1.lat))
            * Math.cos(deg2rad(position2.lat))
            * Math.sin(dLng / 2) * Math.sin(dLng / 2),
        c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
    return R * c;
}

console.log(getDistanceFromLatLonInKm(
    {lat: 48.7931459, lng: 1.9483572},
    {lat: 48.827167, lng: 2.2459745}
));

1 Stimmen

Du hast einen Tippfehler, das zweite "cos" sollte "pos2" sein.

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