Como calculo a distância entre dois pontos especificados por latitude e longitude?
Para esclarecimento, eu gostaria da distância em quilômetros; os pontos usam o sistema WGS84 e eu gostaria de entender a precisão relativa das abordagens disponíveis.
Respostas:
Esse link pode ser útil para você, pois detalha o uso da fórmula de Haversine para calcular a distância.
Excerto:
fonte
Math.atan2(Math.sqrt(a), Math.sqrt(1-a))
vez deMath.asin(Math.sqrt(h))
, qual seria a implementação direta da fórmula que o artigo da Wikipedia usa? É mais eficiente e / ou mais numericamente estável?(sin(x))²
iguais(sin(-x))²
Eu precisava calcular muitas distâncias entre os pontos do meu projeto, então fui em frente e tentei otimizar o código, que encontrei aqui. Em média, em diferentes navegadores, minha nova implementação é executada duas vezes mais rápido que a resposta mais votada.
Você pode brincar com meu jsPerf e ver os resultados aqui .
Recentemente, eu precisei fazer o mesmo em python, então aqui está uma implementação em python :
E por uma questão de completude: Haversine no wiki.
fonte
// 2 * R; R = 6371 km
significa? e o método atual fornece resposta em km ou milhas? precisa de uma documentação melhor. GraçasAqui está uma implementação de C #:
fonte
double dlon = Radians(lon2 - lon1);
e #double dlat = Radians(lat2 - lat1);
RADIUS
valor precisa ser 6371 como nas outras respostas?Aqui está uma implementação em java da fórmula Haversine.
Observe que aqui estamos arredondando a resposta para o km mais próximo.
fonte
6371000
como o raio da terra? (o raio médio da terra é 6371000 metros) ou converte quilômetros em metros de sua função?0.621371
Muito obrigado por tudo isso. Usei o seguinte código no meu aplicativo Objective-C para iPhone:
Latitude e Longitude estão em decimal. Eu não usei min () para a chamada asin (), pois as distâncias que estou usando são tão pequenas que não exigem.
Ele deu respostas incorretas até eu passar os valores em Radianos - agora é praticamente o mesmo que os valores obtidos no aplicativo Map da Apple :-)
Atualização extra:
Se você estiver usando o iOS4 ou posterior, a Apple fornecerá alguns métodos para fazer isso, para que a mesma funcionalidade seja alcançada com:
fonte
pow(sin(dlat / 2), 2) + cos(convertToRadians(place1.latitude))
estão incorretos. Remova-os e o resultado corresponderá ao que recebo quando uso outras implementações nesta página ou implemente a fórmula Haversine da Wikipedia do zero.()
essa quantia em torno dessa quantia, recebo 3869,75. Sem eles, recebo 3935.75, que é praticamente o que uma pesquisa na web aparece.Esta é uma função PHP simples que fornecerá uma aproximação bastante razoável (com margem de erro de +/- 1%).
Como dito antes; a terra não é uma esfera. É como um beisebol velho e velho que Mark McGwire decidiu praticar - está cheio de amolgadelas. Os cálculos mais simples (como este) tratam-no como uma esfera.
Métodos diferentes podem ser mais ou menos precisos, de acordo com o local onde você está neste ovóide irregular E a que distância estão seus pontos (quanto mais próximos eles estiverem, menor será a margem de erro absoluta). Quanto mais precisa for sua expectativa, mais complexa será a matemática.
Para mais informações: distância geográfica da wikipedia
fonte
Eu posto aqui meu exemplo de trabalho.
Liste todos os pontos da tabela com distância entre um ponto designado (usamos um ponto aleatório - lat: 45.20327, long: 23.7806) menor que 50 KM, com latitude e longitude, no MySQL (os campos da tabela são coord_lat e coord_long):
Liste todos com DISTÂNCIA <50, em Quilômetros (considerado raio da Terra 6371 KM):
O exemplo acima foi testado no MySQL 5.0.95 e 5.5.16 (Linux).
fonte
Nas outras respostas, uma implementação em r está desaparecido.
Calcular a distância entre dois pontos é bastante direto com a
distm
função dogeosphere
pacote:Onde:
Como a Terra não é perfeitamente esférica, a fórmula Vincenty para elipsóides é provavelmente a melhor maneira de calcular distâncias. Assim, no
geosphere
pacote você usa então:Claro que você não precisa necessariamente usar o
geosphere
pacote, você também pode calcular a distância na baseR
com uma função:fonte
O haversine é definitivamente uma boa fórmula para provavelmente a maioria dos casos, outras respostas já o incluem, então não vou ocupar o espaço. Mas é importante observar que, independentemente da fórmula usada (sim, não apenas uma). Devido à enorme variedade de precisão possível, bem como ao tempo de computação necessário. A escolha da fórmula requer um pouco mais de reflexão do que uma resposta simples e simples.
Esta postagem de uma pessoa da NASA, é a melhor que encontrei ao discutir as opções
http://www.cs.nyu.edu/visual/home/proj/tiger/gisfaq.html
Por exemplo, se você estiver apenas classificando linhas por distância em um raio de 160 quilômetros. A fórmula da terra plana será muito mais rápida que a haversine.
Observe que há apenas um cosseno e uma raiz quadrada. Vs 9 deles na fórmula Haversine.
fonte
Você pode usar a construção em CLLocationDistance para calcular isso:
No seu caso, se você deseja quilômetros, basta dividir por 1000.
fonte
Não gosto de adicionar mais uma resposta, mas a API do Google Maps v.3 possui geometria esférica (e mais). Depois de converter seu WGS84 em graus decimais, você pode fazer o seguinte:
Nenhuma palavra sobre a precisão dos cálculos do Google ou mesmo qual modelo é usado (embora diga "esférico" em vez de "geóide". A propósito, a distância da "linha reta" obviamente será diferente da distância se alguém viaja no superfície da terra que é o que todos parecem presumir.
fonte
Implementação em Python A origem é o centro dos Estados Unidos contíguos.
Para obter a resposta em quilômetros, basta definir milhas = false.
fonte
Poderia haver uma solução mais simples e mais correta: o perímetro da Terra é de 40.000 km no equador, cerca de 37.000 no ciclo de Greenwich (ou qualquer longitude). Portanto:
Concordo que deve ser afinado, pois eu mesmo disse que é um elipsóide, de modo que o raio a ser multiplicado pelo cosseno varia. Mas é um pouco mais preciso. Comparado com o Google Maps e reduziu o erro significativamente.
fonte
Todas as respostas acima assumem que a Terra é uma esfera. No entanto, uma aproximação mais precisa seria a de um esferóide oblato.
fonte
Aqui está a implementação do SQL para calcular a distância em km,
Para mais detalhes sobre a implementação, programando a linguagem, você pode simplesmente passar pelo script php fornecido aqui
fonte
Aqui está uma implementação datilografada da fórmula Haversine
fonte
Como apontado, um cálculo preciso deve levar em conta que a Terra não é uma esfera perfeita. Aqui estão algumas comparações dos vários algoritmos oferecidos aqui:
Em pequenas distâncias, o algoritmo de Keerthana parece coincidir com o do Google Maps. O Google Maps parece não seguir nenhum algoritmo simples, sugerindo que ele pode ser o método mais preciso aqui.
De qualquer forma, aqui está uma implementação Javascript do algoritmo de Keerthana:
fonte
Este script [em PHP] calcula distâncias entre os dois pontos.
fonte
fonte
Para calcular a distância entre dois pontos em uma esfera, você precisa fazer o cálculo do Grande Círculo .
Existem várias bibliotecas C / C ++ para ajudar na projeção de mapas no MapTools se você precisar suas distâncias em uma superfície plana. Para fazer isso, você precisará da seqüência de projeção dos vários sistemas de coordenadas.
Você também pode encontrar o MapWindow uma ferramenta útil para visualizar os pontos. Também como código aberto, é um guia útil para usar a biblioteca proj.dll, que parece ser a principal biblioteca de projeção de código aberto.
fonte
Aqui está a implementação de resposta aceita portada para Java, caso alguém precise.
fonte
Aqui está a implementação VB.NET, essa implementação fornecerá o resultado em KM ou Miles com base no valor de Enum que você passar.
fonte
Condensou o cálculo simplificando a fórmula.
Aqui está em Ruby:
fonte
A solução de Chuck, válida por milhas também.
fonte
Aqui está minha implementação em java para calcular a distância através de graus decimais após alguma pesquisa. Eu usei o raio médio do mundo (da wikipedia) em km. Se você deseja milhas por resultado, use o raio do mundo em milhas.
fonte
No Mysql, use a seguinte função, passe os parâmetros como usando
POINT(LONG,LAT)
fonte
fonte
aqui está um exemplo no postgres sql (em km, para versão milhas, substitua 1.609344 por 0.8684 versão)
fonte
Aqui está outro código convertido para Ruby :
fonte
há um bom exemplo aqui para calcular a distância com o PHP http://www.geodatasource.com/developers/php :
fonte