Problema
Gostaria de saber como medir a distância e rumo entre 2 pontos GPS . Eu pesquisei sobre a fórmula de Haversine. Alguém me disse que eu também poderia encontrar o rolamento usando os mesmos dados.
Editar
Tudo está funcionando bem, mas o rolamento ainda não funciona bem. A saída do rolamento é negativa, mas deve estar entre 0 - 360 graus. O conjunto de dados deve fazer o rumo horizontal 96.02166666666666
e é:
Start point: 53.32055555555556 , -1.7297222222222221
Bearing: 96.02166666666666
Distance: 2 km
Destination point: 53.31861111111111, -1.6997222222222223
Final bearing: 96.04555555555555
Aqui está meu novo 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))
é o mesmo queasin(sqrt(a))
Respostas:
Esta é uma versão Python:
fonte
import math
, terá de especificarmath.pi
,math.sin
etc. Com,from math import *
obtém acesso direto a todo o conteúdo do módulo. Confira "namespaces" em um tutorial de python (como docs.python.org/tutorial/modules.html )A maioria dessas respostas está "arredondando" o raio da Terra. Se você comparar essas funções com outras calculadoras de distância (como geopy), essas funções serão desativadas.
Isso funciona bem:
fonte
Há também uma implementação vetorizada , que permite usar 4 matrizes numpy em vez de valores escalares para as coordenadas:
fonte
O cálculo do rolamento está incorreto, você precisa trocar as entradas para atan2.
Isso lhe dará o rumo correto.
fonte
haversine formula
minha primeira vez em ouvir isso, obrigado.Você pode tentar o seguinte:
fonte
Aqui está uma implementação vetorizada numpy da fórmula Haversine dada por @Michael Dunn, dá uma melhoria de 10-50 vezes sobre vetores grandes.
fonte
Você pode resolver o problema do rolamento negativo adicionando 360 °. Infelizmente, isso pode resultar em rolamentos maiores que 360 ° para rolamentos positivos. Este é um bom candidato para o operador de módulo, portanto, em suma, você deve adicionar a linha
no final do seu método.
fonte
O Y em atan2 é, por padrão, o primeiro parâmetro. Aqui está a documentação . Você precisará alternar suas entradas para obter o ângulo de rolamento correto.
fonte
Consulte este link: /gis/84885/whats-the-difference-between-vincenty-and-great-circle-distance-calculations
na verdade, isso dá duas maneiras de obter distância. Eles são Haversine e Vincentys. Com minha pesquisa, descobri que Vincentys é relativamente preciso. Use também a instrução import para fazer a implementação.
fonte
Aqui estão duas funções para calcular distância e rumo, que são baseadas no código das mensagens anteriores e https://gist.github.com/jeromer/2005586 (tipo de tupla adicionado para pontos geográficos no formato lat, lon para ambas as funções para maior clareza ) Eu testei as duas funções e elas parecem funcionar bem.
fonte