Ich möchte in der Lage sein, eine Schätzung der Entfernung zwischen zwei Punkten (Breitengrad, Längengrad) zu erhalten. Ich möchte unterschießen, da dies für die A * Graphensuche sein wird und ich möchte, dass es schnell ist. Die Punkte werden höchstens 800 km voneinander entfernt sein.Wie kann ich schnell den Abstand zwischen zwei Punkten (Breitengrad, Längengrad) schätzen?
Antwort
Die Antworten auf Haversine Formula in Python (Bearing and Distance between two GPS points) bieten Python-Implementierungen, die Ihre Frage beantworten.
Mit der Implementierung unten I durchgeführt 100.000 Iterationen in weniger als 1 Sekunde auf einem älteren Laptop. Ich denke, für Ihre Zwecke sollte dies ausreichen. Sie sollten jedoch alles profilieren, 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
Unterschätzt haversine(lat1, long1, lat2, long2) * 0.90
oder was auch immer Faktor Sie wollen. Ich sehe nicht, wie es hilfreich ist, Fehler zu Ihrer Unterschätzung einzuführen.
1000s, aber das ist Python und ich muss großzügig zu unterschätzen. – fread2281
Eine Idee für die Geschwindigkeit ist die Transformation der koordinierten long/lat in 3D-Koordinaten (x, y, z). Verwenden Sie nach der Vorverarbeitung der Punkte den euklidischen Abstand zwischen den Punkten als ein schnell berechnetes Unterschreiten der tatsächlichen Entfernung.
Für maximale Geschwindigkeit können Sie für Koordinatenabstände etwas wie rainbow table erstellen. Es hört sich so an, als ob Sie den Bereich, mit dem Sie arbeiten, bereits kennen, also scheint es, als wäre die Vorverarbeitung möglich. Dann könnten Sie die nächste Kombination laden und einfach verwenden.
Zum Beispiel ist in den kontinentalen Vereinigten Staaten der Längengrad eine 55-Grad-Spannweite und der Breitengrad 20, was 1100 ganzzahlige Punkte wäre. Der Abstand zwischen allen möglichen Kombinationen ist ein handshake problem, der mit (n-1) (n)/2 oder etwa 600k Kombinationen beantwortet wird. Das scheint zum Speichern und Abrufen ziemlich machbar. Wenn Sie mehr Informationen über Ihre Anforderungen bereitstellen, könnte ich genauer sein.
Da die Entfernung relativ klein ist, können Sie die Approximation der äquirektangulären Distanz verwenden. Diese Annäherung ist schneller als die Verwendung der Haversine-Formel. Um die Entfernung von Ihrem Bezugspunkt (lat1/lon1) zu dem Punkt zu ermitteln, den Sie testen (lat2/lon2), verwenden Sie die folgende 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)
Seit 'R' in km, der Abstand 'd' in km sein.
Referenz: http://www.movable-type.co.uk/scripts/latlong.html
Bitte den folgenden Code verwenden.
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
In meinem Fall funktioniert die anderen Codes nicht gut für mich. Also, ich translate einfach die Funktion in dieser Antwort http://stackoverflow.com/questions/6981916/how-to-calculate-distance-between-two-locations-use-their-longitude-and-latitu – uher
Sollten wir folgern, dass diese Punkte auf einer * Kugel * liegen? – phs
Siehe http://stackoverflow.com/questions/27928/how-do-i-calculate-distance-between-two-latitude-longitude-points oder http://stackoverflow.com/questions/4913349/haversine-formula- Python-Bearing-und-Abstand zwischen zwei-gps-Punkte (Python) –
Ja, auf der Erde, aber Geschwindigkeit. AFAIK komplexe Mathematik ist nicht schnell genug. – fread2281