Problema
Me gustaría saber cómo obtener la distancia y el rumbo entre 2 puntos GPS . He investigado sobre la fórmula de Haversine. Alguien me dijo que también podía encontrar el rumbo usando los mismos datos.
Editar
Todo funciona bien, pero el rodamiento todavía no funciona bien. La salida del rodamiento es negativa, pero debe estar entre 0 y 360 grados. Los datos establecidos deben formar el rumbo horizontal 96.02166666666666
y son:
Start point: 53.32055555555556 , -1.7297222222222221
Bearing: 96.02166666666666
Distance: 2 km
Destination point: 53.31861111111111, -1.6997222222222223
Final bearing: 96.04555555555555
Aquí está mi nuevo código:
from math import *
Aaltitude = 2000
Oppsite = 20000
lat1 = 53.32055555555556
lat2 = 53.31861111111111
lon1 = -1.7297222222222221
lon2 = -1.6997222222222223
lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
c = 2 * atan2(sqrt(a), sqrt(1-a))
Base = 6371 * c
Bearing =atan2(cos(lat1)*sin(lat2)-sin(lat1)*cos(lat2)*cos(lon2-lon1), sin(lon2-lon1)*cos(lat2))
Bearing = degrees(Bearing)
print ""
print ""
print "--------------------"
print "Horizontal Distance:"
print Base
print "--------------------"
print "Bearing:"
print Bearing
print "--------------------"
Base2 = Base * 1000
distance = Base * 2 + Oppsite * 2 / 2
Caltitude = Oppsite - Aaltitude
a = Oppsite/Base
b = atan(a)
c = degrees(b)
distance = distance / 1000
print "The degree of vertical angle is:"
print c
print "--------------------"
print "The distance between the Balloon GPS and the Antenna GPS is:"
print distance
print "--------------------"
atan2(sqrt(a), sqrt(1-a))
es lo mismo queasin(sqrt(a))
Respuestas:
Aquí hay una versión de Python:
fuente
import math
, tienes que especificarmath.pi
,math.sin
etc. Confrom math import *
obtienes acceso directo a todos los contenidos del módulo. Consulte los "espacios de nombres" en un tutorial de Python (como docs.python.org/tutorial/modules.html )La mayoría de estas respuestas "redondean" el radio de la Tierra. Si los compara con otras calculadoras de distancia (como geopy), estas funciones estarán desactivadas.
Esto funciona bien:
fuente
También hay una implementación vectorizada , que permite usar 4 matrices numpy en lugar de valores escalares para coordenadas:
fuente
El cálculo del rumbo es incorrecto, debe cambiar las entradas a atan2.
Esto le dará el rumbo correcto.
fuente
haversine formula
la primera vez que escucho esto, gracias.Puedes probar lo siguiente:
fuente
Aquí hay una implementación vectorizada numerosa de la Fórmula Haversine dada por @Michael Dunn, brinda una mejora de 10 a 50 veces sobre los vectores grandes.
fuente
Puede resolver el problema del rodamiento negativo agregando 360 °. Desafortunadamente, esto puede resultar en rodamientos mayores de 360 ° para rodamientos positivos. Este es un buen candidato para el operador de módulo, por lo que, en general, debe agregar la línea
al final de su método.
fuente
La Y en atan2 es, por defecto, el primer parámetro. Aquí está la documentación . Deberá cambiar sus entradas para obtener el ángulo de orientación correcto.
fuente
Consulte este enlace: /gis/84885/whats-the-difference-between-vincenty-and-great-circle-distance-calculations
esto en realidad ofrece dos formas de obtener distancia. Son Haversine y Vincentys. De mi investigación llegué a saber que Vincentys es relativamente preciso. También use la declaración de importación para realizar la implementación.
fuente
Aquí hay dos funciones para calcular la distancia y el rumbo, que se basan en el código de los mensajes anteriores y https://gist.github.com/jeromer/2005586 (se agregó el tipo de tupla para puntos geográficos en formato lat, lon para ambas funciones para mayor claridad ). Probé ambas funciones y parecen funcionar bien.
fuente