Oi eu tenho a necessidade de calcular a distância entre dois pontos tendo o lat e long.
Eu gostaria de evitar qualquer chamada para API externa.
Eu tentei implementar a fórmula de Haversine no PHP:
Aqui está o código:
class CoordDistance
{
public $lat_a = 0;
public $lon_a = 0;
public $lat_b = 0;
public $lon_b = 0;
public $measure_unit = 'kilometers';
public $measure_state = false;
public $measure = 0;
public $error = '';
public function DistAB()
{
$delta_lat = $this->lat_b - $this->lat_a ;
$delta_lon = $this->lon_b - $this->lon_a ;
$earth_radius = 6372.795477598;
$alpha = $delta_lat/2;
$beta = $delta_lon/2;
$a = sin(deg2rad($alpha)) * sin(deg2rad($alpha)) + cos(deg2rad($this->lat_a)) * cos(deg2rad($this->lat_b)) * sin(deg2rad($beta)) * sin(deg2rad($beta)) ;
$c = asin(min(1, sqrt($a)));
$distance = 2*$earth_radius * $c;
$distance = round($distance, 4);
$this->measure = $distance;
}
}
Testando-o com alguns pontos que têm distâncias públicas, não obtenho um resultado confiável.
Não entendo se há um erro na fórmula original ou na minha implementação
php
coordinates
geocoding
haversine
maxdangelo
fonte
fonte
Respostas:
Há pouco tempo, escrevi um exemplo da fórmula haversine e publiquei no meu site:
➽ Observe que você recupera a distância na mesma unidade em que passa com o parâmetro
$earthRadius
. O valor padrão é 6371000 metros, portanto o resultado também estará em [m]. Para obter o resultado em milhas, você poderia, por exemplo, passar 3959 milhas$earthRadius
e o resultado seria em [mi]. Na minha opinião, é um bom hábito manter as unidades SI, se não houver uma razão específica para fazer o contrário.Editar:
Como TreyA corretamente apontou, a fórmula Haversine apresenta pontos fracos com pontos antipodais devido a erros de arredondamento (embora seja estável para pequenas distâncias). Para contorná-los, você pode usar a fórmula Vincenty .
fonte
Encontrei este código que está me dando resultados confiáveis.
resultados :
fonte
É apenas uma adição às respostas @martinstoeckli e @Janith Chinthana . Para aqueles que curiosos sobre qual algoritmo é mais rápido, escrevi o teste de desempenho . O melhor resultado de desempenho mostra a função otimizada do codexworld.com :
Aqui estão os resultados do teste:
fonte
1.1515 * 1.609344 = 1.853
. Obrigado, corrigido para 1.853.Aqui, o código simples e perfeito para calcular a distância entre duas latitudes e longitudes. O código a seguir foi encontrado aqui - http://www.codexworld.com/distance-between-two-addresses-google-maps-api-php/
fonte
Para quem gosta de mais curto e mais rápido (sem chamar deg2rad ()).
fonte
Experimente isso fornece resultados impressionantes
fonte
Pergunta bastante antiga, mas para os interessados em um código PHP que retorna os mesmos resultados que o Google Maps, o seguinte é o seguinte:
Eu testei com várias coordenadas e funciona perfeitamente.
Eu acho que deveria ser mais rápido do que algumas alternativas também. Mas não testou isso.
Dica: o Google Maps usa 6378137 como raio da Terra. Portanto, usá-lo com outros algoritmos também pode funcionar.
fonte
Para valores exatos, faça assim:
Hmm, acho que deveria fazê-lo ...
Editar:
Para formulários e pelo menos implementações em JS, tente: http://www.movable-type.co.uk/scripts/latlong.html
Ouse-me ... esqueci de deg2rad todos os valores nas funções circulares ...
fonte
Olá, código para obter distância e tempo usando dois diferentes lat e longo
Você pode verificar o exemplo abaixo do link para obter tempo entre dois locais diferentes usando latitude e longitude em php
fonte
Experimente esta função para calcular a distância entre os pontos de latitude e longitude
Em seguida, use a função como
Espero que ajude
fonte
O multiplicador é alterado em todas as coordenadas por causa da teoria da grande distância do círculo, como está escrito aqui:
http://en.wikipedia.org/wiki/Great-circle_distance
e você pode calcular o valor mais próximo usando esta fórmula descrita aqui:
http://en.wikipedia.org/wiki/Great-circle_distance#Worked_example
a chave está convertendo cada valor de grau - minuto - segundo para todo o valor de grau:
fonte
Uma das maneiras mais fáceis é:
Arredondará até 2 pontos decimais.
fonte