¿Cómo calculo la distancia entre dos puntos especificados por latitud y longitud?
Para aclarar, me gustaría la distancia en kilómetros; los puntos usan el sistema WGS84 y me gustaría entender las precisiones relativas de los enfoques disponibles.
¿Cómo calculo la distancia entre dos puntos especificados por latitud y longitud?
Para aclarar, me gustaría la distancia en kilómetros; los puntos usan el sistema WGS84 y me gustaría entender las precisiones relativas de los enfoques disponibles.
Respuestas:
Este enlace puede serle útil, ya que detalla el uso de la fórmula de Haversine para calcular la distancia.
Extracto:
fuente
Math.atan2(Math.sqrt(a), Math.sqrt(1-a))
lugar deMath.asin(Math.sqrt(h))
, cuál sería la implementación directa de la fórmula que usa el artículo de Wikipedia? ¿Es más eficiente y / o más estable numéricamente?(sin(x))²
es igual(sin(-x))²
Necesitaba calcular muchas distancias entre los puntos para mi proyecto, así que seguí adelante e intenté optimizar el código que encontré aquí. En promedio, en diferentes navegadores, mi nueva implementación se ejecuta 2 veces más rápido que la respuesta más votada.
Puedes jugar con mi jsPerf y ver los resultados aquí .
Recientemente necesitaba hacer lo mismo en Python, así que aquí hay una implementación de Python :
Y en aras de la integridad: Haversine en wiki.
fuente
// 2 * R; R = 6371 km
significa? y el método actual proporciona respuesta en km o millas? Necesita mejor documentación. GraciasAquí hay una implementación de C #:
fuente
double dlon = Radians(lon2 - lon1);
ydouble dlat = Radians(lat2 - lat1);
RADIUS
valor debe ser 6371 como en las otras respuestas?Aquí hay una implementación de Java de la fórmula Haversine.
Tenga en cuenta que aquí estamos redondeando la respuesta al km más cercano.
fuente
6371000
como el radio de la tierra? (radio promedio de la tierra es 6371000 metros) o convertir kilómetros a metros de su función?0.621371
Muchas gracias por todo esto. Usé el siguiente código en mi aplicación de iPhone Objective-C:
La latitud y la longitud están en decimal. No usé min () para la llamada asin () ya que las distancias que estoy usando son tan pequeñas que no lo requieren.
Dio respuestas incorrectas hasta que pasé los valores en radianes; ahora es más o menos lo mismo que los valores obtenidos de la aplicación de mapas de Apple :-)
Actualización extra:
Si está utilizando iOS4 o posterior, Apple proporciona algunos métodos para hacerlo para que se logre la misma funcionalidad con:
fuente
pow(sin(dlat / 2), 2) + cos(convertToRadians(place1.latitude))
es incorrecto. Elimínelos y el resultado coincide con lo que obtengo cuando uso otras implementaciones en esta página, o implemento la fórmula Haversine de Wikipedia desde cero.()
esa suma, obtengo 3869.75. Sin ellos, obtengo 3935.75, que es más o menos lo que aparece en una búsqueda web.Esta es una función PHP simple que dará una aproximación muy razonable (bajo un margen de error de +/- 1%).
Como se dijo antes; La tierra NO es una esfera. Es como un viejo, viejo béisbol con el que Mark McGwire decidió practicar: está lleno de abolladuras y golpes. Los cálculos más simples (como este) lo tratan como una esfera.
Los diferentes métodos pueden ser más o menos precisos según dónde se encuentre en este ovoide irregular Y cuán separados estén sus puntos (cuanto más cerca estén, menor será el margen de error absoluto). Cuanto más precisas sean sus expectativas, más complejas serán las matemáticas.
Para más información: distancia geográfica de wikipedia
fuente
Publico aquí mi ejemplo de trabajo.
Enumere todos los puntos en la tabla que tienen distancia entre un punto designado (usamos un punto aleatorio - lat: 45.20327, largo: 23.7806) menos de 50 KM, con latitud y longitud, en MySQL (los campos de la tabla son coord_lat y coord_long):
Enumere todos los que tengan DISTANCIA <50, en kilómetros (considerado radio de la Tierra 6371 KM):
El ejemplo anterior se probó en MySQL 5.0.95 y 5.5.16 (Linux).
fuente
En las otras respuestas, una implementación en r Está perdido.
Calcular la distancia entre dos puntos es bastante sencillo con la
distm
función delgeosphere
paquete:dónde:
Como la tierra no es perfectamente esférica, la fórmula de Vincenty para elipsoides es probablemente la mejor manera de calcular distancias. Por lo tanto, en el
geosphere
paquete que usa, entonces:Por supuesto, no necesariamente tiene que usar el
geosphere
paquete, también puede calcular la distancia en baseR
con una función:fuente
La haversina es definitivamente una buena fórmula para la mayoría de los casos, otras respuestas ya la incluyen, así que no voy a tomar el espacio. Pero es importante tener en cuenta que no importa qué fórmula se use (sí, no solo una). Debido al amplio rango de precisión posible, así como al tiempo de cálculo requerido. La elección de la fórmula requiere un poco más de reflexión que una simple respuesta sin complicaciones.
Esta publicación de una persona de la NASA es la mejor que encontré al analizar las opciones.
http://www.cs.nyu.edu/visual/home/proj/tiger/gisfaq.html
Por ejemplo, si solo está ordenando filas por distancia en un radio de 100 millas. La fórmula de tierra plana será mucho más rápida que la haversina.
Observe que solo hay un coseno y una raíz cuadrada. Vs 9 de ellos en la fórmula Haversine.
fuente
Puede usar la compilación en CLLocationDistance para calcular esto:
En tu caso, si quieres kilómetros, simplemente divide entre 1000.
fuente
No me gusta agregar otra respuesta, pero la API de Google Maps v.3 tiene geometría esférica (y más). Después de convertir su WGS84 a grados decimales, puede hacer esto:
No se sabe cuán precisos son los cálculos de Google o incluso qué modelo se usa (aunque sí dice "esférico" en lugar de "geoide". Por cierto, la distancia de "línea recta" obviamente será diferente de la distancia si uno viaja en el superficie de la tierra que es lo que todos parecen estar presumiendo.
fuente
La implicación de Python Origin es el centro de los Estados Unidos contiguos.
Para obtener la respuesta en kilómetros, simplemente establezca millas = falso.
fuente
Podría haber una solución más simple y más correcta: el perímetro de la tierra es de 40,000 km en el ecuador, alrededor de 37,000 en el ciclo de Greenwich (o cualquier longitud). Así:
Estoy de acuerdo en que debe ajustarse, ya que yo mismo dije que es un elipsoide, por lo que el radio que se multiplicará por el coseno varía. Pero es un poco más preciso. En comparación con Google Maps, redujo significativamente el error.
fuente
Todas las respuestas anteriores asumen que la tierra es una esfera. Sin embargo, una aproximación más precisa sería la de un esferoide achatado.
fuente
Aquí está la implementación de SQL para calcular la distancia en km,
Para obtener más detalles sobre la implementación mediante la programación de langugage, puede pasar por el script php que se proporciona aquí.
fuente
Aquí hay una implementación mecanografiada de la fórmula de Haversine
fuente
Como se señaló, un cálculo preciso debe tener en cuenta que la tierra no es una esfera perfecta. Aquí hay algunas comparaciones de los diversos algoritmos que se ofrecen aquí:
En distancias pequeñas, el algoritmo de Keerthana parece coincidir con el de Google Maps. Google Maps no parece seguir ningún algoritmo simple, lo que sugiere que puede ser el método más preciso aquí.
De todos modos, aquí hay una implementación de Javascript del algoritmo de Keerthana:
fuente
Este script [en PHP] calcula las distancias entre los dos puntos.
fuente
fuente
Para calcular la distancia entre dos puntos en una esfera, debes hacer el cálculo del Gran Círculo .
Hay una serie de bibliotecas C / C ++ para ayudar con la proyección de mapas en MapTools si necesita reproyectar sus distancias a una superficie plana. Para hacer esto, necesitará la cadena de proyección de los diversos sistemas de coordenadas.
También puede encontrar MapWindow una herramienta útil para visualizar los puntos. Además, como su código abierto es una guía útil sobre cómo usar la biblioteca proj.dll, que parece ser la biblioteca principal de proyección de código abierto.
fuente
Aquí está la implementación de respuesta aceptada portada a Java en caso de que alguien la necesite.
fuente
Aquí está la implementación VB.NET, esta implementación le dará el resultado en KM o Miles en función de un valor Enum que pase.
fuente
Condensé el cálculo simplificando la fórmula.
Aquí está en Ruby:
fuente
La solución de Chuck, válida para millas también.
fuente
Aquí está mi implementación de Java para calcular la distancia a través de grados decimales después de alguna búsqueda. Utilicé el radio medio del mundo (de wikipedia) en km. Si desea millas de resultado, utilice el radio mundial en millas.
fuente
En Mysql, use la siguiente función para pasar los parámetros como
POINT(LONG,LAT)
fuente
fuente
Aquí hay un ejemplo en Postgres sql (en km, para la versión en millas, reemplace 1.609344 por la versión 0.8684)
fuente
Aquí hay otro convertido al código Ruby :
fuente
Hay un buen ejemplo aquí para calcular la distancia con PHP http://www.geodatasource.com/developers/php :
fuente