puntos geograficos funcion euclidiana entre ejemplos distancia coordenadas calcular python math maps mapping latitude-longitude

python - geograficos - ¿Cómo puedo estimar rápidamente la distancia entre dos puntos(latitud, longitud)?



formula de haversine ejemplos (5)

Como la distancia es relativamente pequeña, puede usar la aproximación de distancia equirectangular. Esta aproximación es más rápida que usar la fórmula de Haversine. Entonces, para obtener la distancia desde su punto de referencia (lat1 / lon1) hasta el punto que está probando (lat2 / lon2), use la fórmula a continuación. Nota importante: necesitas convertir todos los puntos lat / lon a radianes:

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 )

Como ''R'' está en km, la distancia ''d'' estará en km.

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

Quiero poder estimar la distancia entre dos puntos (latitud, longitud). Quiero subestimar, ya que esto será para la búsqueda de gráficos A * y quiero que sea rápido . Los puntos estarán a 800 km de distancia como máximo.


Las respuestas a Haversine Formula en Python (Teniendo y distancia entre dos puntos de GPS) proporcionan implementaciones de Python que responden a su pregunta.

Usando la implementación a continuación, realicé 100.000 iteraciones en menos de 1 segundo en una computadora portátil más vieja. Creo que para tus propósitos esto debería ser suficiente. Sin embargo, debe hacer un perfil de todo antes de optimizar el rendimiento.

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 o el factor que desee. No veo cómo es útil introducir el error en tu subestimación.


Para una velocidad máxima, puede crear algo así como una tabla de arco iris para distancias de coordenadas. Parece que ya conoce el área con la que está trabajando, por lo que parece que sería factible precompilarlos. Entonces, puedes cargar la combinación más cercana y solo usar eso.

Por ejemplo, en los Estados Unidos continentales, la longitud es un intervalo de 55 grados y la latitud es 20, lo que equivaldría a 1100 puntos de números enteros. La distancia entre todas las combinaciones posibles es un problema de apretón de manos que es respondido por (n-1) (n) / 2 o aproximadamente 600k combinaciones. Eso parece bastante factible de almacenar y recuperar. Si proporciona más información sobre sus requisitos, podría ser más específico.


Por favor usa el siguiente código

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


Una idea para la velocidad es transformar las coordenadas largas / lat coordinadas en 3D (x, y, z). Después de preprocesar los puntos, use la distancia euclidiana entre los puntos como un submuestreo calculado rápidamente de la distancia real.