Calcular distância entre dois pontos GPS

PHP Add comments

Olá, após um tempinho sem publicar trago uma função que serve para calcular a distância entre dois pontos GPS (com Latitude e Longitude cada). A função é bem simples de utilizar e retorna o resultado em metros.

  1. function distanciaPontosGPS($p1LA, $p1LO, $p2LA, $p2LO) {
  2.     $r = 6371.0;
  3.        
  4.     $p1LA = $p1LA * pi() / 180.0;
  5.     $p1LO = $p1LO * pi() / 180.0;
  6.     $p2LA = $p2LA * pi() / 180.0;
  7.     $p2LO = $p2LO * pi() / 180.0;
  8.        
  9.     $dLat = $p2LA$p1LA;
  10.     $dLong = $p2LO$p1LO;
  11.        
  12.     $a = sin($dLat / 2) * sin($dLat / 2) + cos($p1LA) * cos($p2LA) * sin($dLong / 2) * sin($dLong / 2);
  13.     $c = 2 * atan2(sqrt($a), sqrt(1$a));
  14.        
  15.     return round($r * $c * 1000); // resultado em metros.
  16. }

Como usar:

  1. echo distanciaPontosGPS(-26.91545, -49.063632, -26.917985, -49.061143);

Resultado será: 375

16 Responses to “Calcular distância entre dois pontos GPS”

  1. Ícaro Souza Says:

    Olá desculpe incomodar axei bastate interessante e util pra mim, gostaria de saber pro resultado sair em milhas nauticas como seria?

  2. Cesar Bagatoli Says:

    Olá Ícaro, 1 milha náutica equivale a 1828 metros, o resultado da função retorna em metros, então seria somente fazer a conversão. Qualquer problema me avise, obrigado.

  3. Ícaro Souza Says:

    Opa melhor não tinha pensado nisso, se me permitir irei usar pra calcular distancia entre aeroportos.

    Muito agradecido pela sua resposta e pelo seu script..

    Por acaso, já alguma class que calcular TEMPO a percorrer em tal distancia usando tal velocidade?
    Consegui fazer, mas não consegui passar pro PHP

    $d=500 //DISTANCIA EM NM
    $v=460 //VELOCIDADE EM KNOS
    $tempo = $d / $v;
    $tempo = $tempo * 60;
    //resutaldo 65 minutos

    Thanks

  4. Cesar Bagatoli Says:

    Olá, pode usar o script sim, se possível só faça uma referência de autoria.
    Quanto a calcular o tempo é simples, basta dividir a distância pela velocidade, ex:
    $distancia = 5; // quilômetros
    $velocidade = 15; // km/h
    $tempoHoras = $distancia / $velocidade; // Resulta em 0.33 horas
    $tempoMinutos = $tempoHoras * 60; // Resulta em 20 minutos

    Se quiser em outras medidas é só fazer as conversões.
    Espero ter ajudado. Abraço.

  5. Ícaro Souza Says:

    Eu fiz o esquema acima pondo milhas nauticas e velocidade em knots deu certo tambem.

    Vlw

  6. ALAN Says:

    Boa tarde Cesar.
    Estava olhando sua funcao acima, e queria perguntar se eu consigo implantar isso como se fosse um mapa do alto vale. Eu estudo em rio do sul, e o trab semestral e fazer o mapa do alto vale com dacastro das cidades, e depois o sistema devera mostrar a menor distancia entre duas cidades.

  7. Cesar Bagatoli Says:

    Você pode utilizar para calcular as distâncias sim, basta você passar as coordenadas para a função. Para isso você também pode utilizar a API do Google Maps, ela faz muita coisa automaticamente.

  8. Luiz Carlos do Lago Says:

    recebe do meu gps a seguinte informação
    $GPGGA,041217.00,2331.69924,S,04646.50307,W,1,09,1.12,730.2,M,-5.3,M,,*46

    Latitude: 2331.69924,S
    Longitude: 04646.50307,W

    Não me parece ser um valor que a sua função espera, você faz alguma conversão antes ?

  9. Cesar Bagatoli Says:

    Olá, para esta função deve-se utilizar o sistema em graus decimais (Wikipedia), ex: -22.906014 e -47.060571 para latitude e longitude.
    Obrigado.

  10. Cesar Says:

    César, antes de mais nada, muito obrigado por compartilhar essas informações, tenho certeza que será muito útil para toda a comunidade “programadora” rs. Amigo, deixe-me fazer uma pergunta.. Porque quando passo p1LA, p2LA, p2LO,p1LO.. Sendo as Latitudes e Longitude iguais, não me retorna o valor “0 metros”, informando que estou em cima do ponto? Ele me retorna 4 metros…

    Atenciosamente!

  11. Cesar Bagatoli Says:

    Desculpe a demora, tenho que verificar porque esta dando isto. Obrigado por reportar o erro.

  12. Fernando Villela Says:

    Consertei a Função:

    Aqui está o novo código

    function distanciaPontosGPS($p1LA, $p1LO, $p2LA, $p2LO) {
    $r = 6371.0;

    $p1LA = $p1LA * pi() / 180.0;
    $p1LO = $p1LO * pi() / 180.0;
    $p2LA = $p2LA * pi() / 180.0;
    $p2LO = $p2LO * pi() / 180.0;
    $dLat = $p2LA + ($p1LA * -1);
    $dLong = $p2LO + ($p1LO * -1);

    $a = sin($dLat / 2) * sin($dLat / 2) + cos($p1LA) * cos($p2LA) * sin($dLong / 2) * sin($dLong / 2);
    $c = 2 * atan2(sqrt($a), sqrt(1 + ($a*-1)));

    return round($r * $c * 1000); // resultado em metros.

    }
    echo distanciaPontosGPS(-26.91545, -49.063632, -26.917985, -49.061143);

    O que eu preciso mesmo saber para completar meu projeto é como conseguir a latitude e longitude, se alguém souber por favor informe em detalhes, qual API do Google Maps? Tem algum exemplo p´ratico? Obrigado

  13. Cesar Bagatoli Says:

    Obrigado, assim que der eu atualizo o post.

  14. mariohollanda@hotmail.com Says:

    Estou passando os parametros como variavel e não esta calculando corretamente. Qual seria o problema? ex: da chamada:

    while ($row = ibase_fetch_row($query))
    {
    $distancia = distanciaPontosGPS($lat, $long, $row[0], $row[1]);

    }

  15. Cesar Bagatoli Says:

    Olá, teria que ver se os valores que estão sendo passados ao método estão no formato aceito pela classe.

  16. Paulo Barbosa Says:

    é possivel conseguir latitude e longitude de CEPS no Webservice do site http://www.mapacep.com.br

Leave a Reply

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS Login