Wie berechne ich den Abstand zwischen zwei durch Längen- und Breitengrad angegebenen Punkten?
Zur Verdeutlichung möchte ich die Entfernung in Kilometern; Die Punkte verwenden das WGS84-System und ich möchte die relativen Genauigkeiten der verfügbaren Ansätze verstehen.
Antworten:
Dieser Link kann für Sie hilfreich sein, da er die Verwendung der Haversine-Formel zur Berechnung der Entfernung beschreibt.
Auszug:
quelle
Math.atan2(Math.sqrt(a), Math.sqrt(1-a))
stattdessenMath.asin(Math.sqrt(h))
die Formel zu verwenden , die die direkte Implementierung der Formel ist, die der Wikipedia-Artikel verwendet? Ist es effizienter und / oder numerisch stabiler?(sin(x))²
equals(sin(-x))²
Ich musste viele Entfernungen zwischen den Punkten für mein Projekt berechnen, also habe ich versucht, den Code zu optimieren, den ich hier gefunden habe. Im Durchschnitt läuft meine neue Implementierung in verschiedenen Browsern zweimal schneller als die am besten bewertete Antwort.
Sie können mit meinem jsPerf spielen und die Ergebnisse hier sehen .
Vor kurzem musste ich dasselbe in Python tun, daher hier eine Python-Implementierung :
Und der Vollständigkeit halber: Haversine im Wiki.
quelle
// 2 * R; R = 6371 km
steht das? und die aktuelle Methode liefert Antwort in km oder Meilen? braucht eine bessere Dokumentation. Vielen DankHier ist eine C # -Implementierung:
quelle
double dlon = Radians(lon2 - lon1);
unddouble dlat = Radians(lat2 - lat1);
RADIUS
Wert wie in den anderen Antworten 6371 sein?Hier ist eine Java-Implementierung der Haversine-Formel.
Beachten Sie, dass wir hier die Antwort auf den nächsten km runden.
quelle
6371000
als der Radius der Erde? (Der durchschnittliche Erdradius beträgt 6371000 Meter) oder Kilometer in Meter von Ihrer Funktion umrechnen?0.621371
Vielen Dank für all das. Ich habe den folgenden Code in meiner Objective-C iPhone-App verwendet:
Breite und Länge sind dezimal. Ich habe min () nicht für den Aufruf von asin () verwendet, da die Entfernungen, die ich verwende, so klein sind, dass sie es nicht erfordern.
Es gab falsche Antworten, bis ich die Werte im Bogenmaß übergab - jetzt sind es fast die gleichen wie die Werte, die von Apples Karten-App erhalten wurden :-)
Zusätzliches Update:
Wenn Sie iOS4 oder höher verwenden, bietet Apple einige Methoden an, um die gleiche Funktionalität zu erzielen:
quelle
pow(sin(dlat / 2), 2) + cos(convertToRadians(place1.latitude))
ist falsch. Entfernen Sie diese, und das Ergebnis stimmt mit dem überein, was ich erhalte, wenn ich andere Implementierungen auf dieser Seite verwende oder die Haversine-Formel von Wikipedia von Grund auf neu implementiere .()
ungefähren Summe erhalte ich 3869,75. Ohne sie bekomme ich 3935.75, was ziemlich genau das ist, was eine Websuche ergibt.Dies ist eine einfache PHP-Funktion, die eine sehr vernünftige Annäherung liefert (unter +/- 1% Fehlerquote).
Wie gesagt; Die Erde ist keine Kugel. Es ist wie ein alter Baseball, mit dem Mark McGwire trainieren wollte - er ist voller Dellen und Beulen. Die einfacheren Berechnungen (wie diese) behandeln es wie eine Kugel.
Verschiedene Methoden können mehr oder weniger genau sein, je nachdem, wo Sie sich auf diesem unregelmäßigen Ovoid befinden UND wie weit Ihre Punkte voneinander entfernt sind (je näher sie sind, desto kleiner ist die absolute Fehlergrenze). Je genauer Ihre Erwartungen sind, desto komplexer ist die Mathematik.
Für weitere Informationen: Wikipedia geografische Entfernung
quelle
Ich poste hier mein Arbeitsbeispiel.
Listen Sie alle Punkte in der Tabelle mit einem Abstand zwischen einem bestimmten Punkt auf (wir verwenden einen zufälligen Punkt - lat: 45.20327, long: 23.7806), der weniger als 50 km lang ist, mit Längen- und Breitengrad in MySQL (die Tabellenfelder sind coord_lat und coord_long):
Listen Sie alle mit einem Abstand <50 in Kilometern auf (als Erdradius 6371 km betrachtet):
Das obige Beispiel wurde in MySQL 5.0.95 und 5.5.16 (Linux) getestet.
quelle
In den anderen Antworten eine Implementierung in r wird vermisst.
Die Berechnung des Abstands zwischen zwei Punkten ist mit der
distm
Funktion aus demgeosphere
Paket ganz einfach :wo:
Da die Erde nicht perfekt kugelförmig ist, ist die Vincenty-Formel für Ellipsoide wahrscheinlich der beste Weg, um Entfernungen zu berechnen. Also in dem
geosphere
Paket, das Sie dann verwenden:Natürlich müssen Sie nicht unbedingt das
geosphere
Paket verwenden, sondern können die Entfernung in der Basis auchR
mit einer Funktion berechnen :quelle
Der Haversine ist definitiv eine gute Formel für wahrscheinlich die meisten Fälle, andere Antworten enthalten ihn bereits, so dass ich den Platz nicht einnehmen werde. Es ist jedoch wichtig zu beachten, dass unabhängig von der verwendeten Formel (ja, nicht nur eine). Aufgrund des enormen Genauigkeitsbereichs sowie der erforderlichen Rechenzeit. Die Wahl der Formel erfordert etwas mehr Gedanken als eine einfache Antwort.
Dieser Beitrag von einer Person bei der NASA ist der beste, den ich bei der Erörterung der Optionen gefunden habe
http://www.cs.nyu.edu/visual/home/proj/tiger/gisfaq.html
Zum Beispiel, wenn Sie nur Zeilen nach Entfernung in einem Radius von 100 Meilen sortieren. Die Flat-Earth-Formel ist viel schneller als der Haversine.
Beachten Sie, dass es nur einen Kosinus und eine Quadratwurzel gibt. Vs 9 von ihnen auf der Haversine-Formel.
quelle
Sie können den Build in CLLocationDistance verwenden, um dies zu berechnen:
In Ihrem Fall, wenn Sie Kilometer wollen, teilen Sie einfach durch 1000.
quelle
Ich mag es nicht, noch eine Antwort hinzuzufügen, aber die Google Maps API v.3 hat sphärische Geometrie (und mehr). Nachdem Sie Ihren WGS84 in Dezimalgrade konvertiert haben, können Sie Folgendes tun:
Kein Wort darüber, wie genau die Berechnungen von Google sind oder welches Modell verwendet wird (obwohl es eher "sphärisch" als "geoid" heißt. Übrigens unterscheidet sich die "gerade Linie" offensichtlich von der Entfernung, wenn man auf dem fährt Erdoberfläche, die jeder anzunehmen scheint.
quelle
Python-Implementierung Origin ist das Zentrum der angrenzenden Vereinigten Staaten.
Um die Antwort in Kilometern zu erhalten, setzen Sie einfach Meilen = falsch.
quelle
Es könnte eine einfachere und korrektere Lösung geben: Der Erdumfang am Äquator beträgt 40.000 km, im Greenwich-Zyklus (oder einem beliebigen Längengrad) etwa 37.000 km. Somit:
Ich bin damit einverstanden, dass es fein abgestimmt werden sollte, da ich selbst sagte, dass es ein Ellipsoid ist, so dass der Radius, der mit dem Kosinus multipliziert werden soll, variiert. Aber es ist etwas genauer. Im Vergleich zu Google Maps konnte der Fehler erheblich reduziert werden.
quelle
Alle obigen Antworten setzen voraus, dass die Erde eine Kugel ist. Eine genauere Annäherung wäre jedoch die eines abgeflachten Sphäroids.
quelle
Hier ist die SQL-Implementierung zur Berechnung der Entfernung in km:
Für weitere Details in der Implementierung durch Programmieren der Sprache können Sie einfach das hier angegebene PHP-Skript durchgehen
quelle
Hier ist eine maschinengeschriebene Implementierung der Haversine-Formel
quelle
Wie bereits erwähnt, sollte eine genaue Berechnung berücksichtigen, dass die Erde keine perfekte Kugel ist. Hier einige Vergleiche der verschiedenen hier angebotenen Algorithmen:
Auf kleinen Entfernungen scheint der Algorithmus von Keerthana mit dem von Google Maps übereinzustimmen. Google Maps scheint keinem einfachen Algorithmus zu folgen, was darauf hindeutet, dass dies hier die genaueste Methode ist.
Wie auch immer, hier ist eine Javascript-Implementierung des Keerthana-Algorithmus:
quelle
Dieses Skript [in PHP] berechnet die Abstände zwischen den beiden Punkten.
quelle
quelle
Um den Abstand 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 in MapTools helfen, wenn Sie Ihre Entfernungen auf eine ebene Fläche projizieren müssen. Dazu benötigen Sie die Projektionszeichenfolge der verschiedenen Koordinatensysteme.
Sie können MapWindow auch als nützliches Werkzeug zur Visualisierung der Punkte finden. Auch als Open Source ist es eine nützliche Anleitung zur Verwendung der proj.dll-Bibliothek, die anscheinend die zentrale Open Source-Projektionsbibliothek ist.
quelle
Hier ist die akzeptierte Antwortimplementierung, die auf Java portiert wurde, falls jemand sie benötigt.
quelle
Hier ist die Implementierung VB.NET. Diese Implementierung gibt Ihnen das Ergebnis in KM oder Meilen basierend auf einem von Ihnen übergebenen Enum-Wert.
quelle
Ich habe die Berechnung durch Vereinfachung der Formel verkürzt.
Hier ist es in Ruby:
quelle
Chucks Lösung, auch kilometerweit gültig.
quelle
Hier ist meine Java-Implementierung zur Berechnung der Entfernung über Dezimalgrade nach einiger Suche. Ich habe den mittleren Radius der Welt (aus Wikipedia) in km verwendet. Wenn Sie Ergebnismeilen wünschen, verwenden Sie den Weltradius in Meilen.
quelle
Verwenden Sie in MySQL die folgende Funktion, um die Parameter wie folgt zu übergeben
POINT(LONG,LAT)
quelle
quelle
Hier ist ein Beispiel in Postgres SQL (in km, für Meilen-Version, ersetzen Sie 1.609344 durch 0.8684-Version)
quelle
Hier ist ein weiterer in Ruby konvertierter Code:
quelle
Hier finden Sie ein gutes Beispiel für die Berechnung der Entfernung mit PHP http://www.geodatasource.com/developers/php :
quelle