it-swarm.com.de

Wie kann ich die Entfernung zwischen zwei Punkten (Breitengrad, Längengrad) schnell schätzen?

Ich möchte eine Schätzung der Entfernung zwischen zwei Punkten (Breitengrad, Längengrad) erhalten. Ich möchte unterschätzen, da dies für die A * Graph-Suche gilt und ich möchte, dass es schnell ist. Die Punkte werden höchstens 800 km voneinander entfernt sein.

49
fread2281

Die Antworten auf Haversine Formula in Python (Peilung und Abstand zwischen zwei GPS-Punkten) stellen Python-Implementierungen bereit, die Ihre Frage beantworten.

Verwenden Sie die unten stehende Implementierung I 100.000 Iterationen in weniger als 1 Sekunde durchgeführt auf einem älteren Laptop. Ich denke, für Ihre Zwecke sollte dies ausreichend sein. Sie sollten jedoch ein Profil erstellen, bevor Sie die Leistung optimieren

from math import radians, cos, sin, asin, sqrt
def haversine(lon1, lat1, lon2, lat2):
    """
    Calculate the great circle distance between two points 
    on the earth (specified in decimal degrees)
    """
    # convert decimal degrees to radians 
    lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
    # haversine formula 
    dlon = lon2 - lon1 
    dlat = lat2 - lat1 
    a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
    c = 2 * asin(sqrt(a)) 
    # Radius of earth in kilometers is 6371
    km = 6371* c
    return km

haversine(lat1, long1, lat2, long2) * 0.90 oder was auch immer Sie wollen zu unterschätzen. Ich sehe nicht, wie nützlich es ist, Fehler in Ihre Unterschätzung einzuführen.

101
Aaron D

Da der Abstand relativ klein ist, können Sie die Approximation des gleichseitigen Winkels verwenden. Diese Annäherung ist schneller als die Haversine-Formel. Um die Entfernung von Ihrem Referenzpunkt (lat1/lon1) zu dem zu testenden Punkt (lat2/lon2) zu ermitteln, verwenden Sie die nachstehende Formel. Wichtiger Hinweis: Sie müssen alle Lat/Lon-Punkte in Radiant konvertieren:

R = 6371  // radius of the earth in km
x = (lon2 - lon1) * cos( 0.5*(lat2+lat1) )
y = lat2 - lat1
d = R * sqrt( x*x + y*y )

Da "R" in km ist, wird die Entfernung "d" in km angegeben. 

Referenz: http://www.movable-type.co.uk/scripts/latlong.html

35
TreyA

Eine Idee für die Geschwindigkeit besteht darin, die lang/lat-Koordinate in 3D-Koordinaten (x, y, z) umzuwandeln. Verwenden Sie nach der Vorverarbeitung der Punkte die euklidische Entfernung zwischen den Punkten als schnell berechnete Unterschreitung der tatsächlichen Entfernung.

7

Für maximale Geschwindigkeit können Sie beispielsweise eine Rainbow-Tabelle für Koordinatenabstände erstellen. Es klingt, als ob Sie den Bereich, mit dem Sie arbeiten, bereits kennen, so dass es scheint, als könnten Sie sie vorberechnen. Dann können Sie die nächste Kombination laden und diese einfach verwenden. 

In den kontinentalen Vereinigten Staaten ist der Längengrad zum Beispiel eine Spanne von 55 Grad und eine Breite von 20, was 1100 ganzzahligen Punkten entspricht. Der Abstand zwischen allen möglichen Kombinationen ist ein Handshake-Problem , das mit (n-1) (n)/2 oder etwa 600k-Kombinationen beantwortet wird. Das scheint gut umsetzbar und abrufbar zu sein. Wenn Sie weitere Informationen zu Ihren Anforderungen angeben, könnte ich genauer sein.

3
Aaron D

Wenn der Abstand zwischen Punkten relativ klein ist (Meter bis wenige Kilometer), dann könnte einer der schnellen Ansätze sein

def qick_distance(Lat1, Long1, Lat2, Long2):
    x = Lat2 - Lat1
    y = (Long2 - Long1)*cos((Lat2 + Lat1)*0.00872664626)  
    return 111.138*sqrt(x*x+y*y)

Lat, Long sind im Bogenmaß, Abstand in Metern ..__ Die Abweichung vom Haversine-Abstand liegt in der Größenordnung von 1%, die Geschwindigkeitszunahme ist mehr als ~ 10x . 0,00872664626 = 0,5 * pi/180 .__ Die Entfernung, die 1 Grad bei 45 N (etwa in der Mitte Europas) entspricht, können Sie durch Ihren Medianwert wie hier https://www.cartographyunchained.com/cgsta1/ oder. ersetzen Ersetzen Sie es durch eine einfache Nachschlagetabelle.

0

Um einen Haversine-Abstand zwischen zwei Punkten zu berechnen, können Sie einfach mpu.haversine_distance () library verwenden: 

>>> import mpu
>>> munich = (48.1372, 11.5756)
>>> berlin = (52.5186, 13.4083)
>>> round(mpu.haversine_distance(munich, berlin), 1)
>>> 504.2
0
Chiefir

Bitte verwenden Sie den folgenden Code.

def distance(lat1, lng1, lat2, lng2):
    #return distance as meter if you want km distance, remove "* 1000"
    radius = 6371 * 1000 

    dLat = (lat2-lat1) * math.pi / 180
    dLng = (lng2-lng1) * math.pi / 180

    lat1 = lat1 * math.pi / 180
    lat2 = lat2 * math.pi / 180

    val = sin(dLat/2) * sin(dLat/2) + sin(dLng/2) * sin(dLng/2) * cos(lat1) * cos(lat2)    
    ang = 2 * atan2(sqrt(val), sqrt(1-val))
    return radius * ang
0
uher