Distância entre pontos lat / longo

10

Estou tentando calcular a distância entre dois pontos de latitude / longitude. Eu tenho um pedaço de código que funciona principalmente que tirei deste post, mas realmente não entendo como ele funciona.

Aqui está o código:

<?php
// POINT 1
$thisLat = deg2rad(44.638);
$thisLong = deg2rad(-63.587);

// POINT 2
$otherLat = deg2rad(44.644);
$otherLong = deg2rad(-63.911);

$MeanRadius = 6378 - 21 * sin($lat1);

$xa = (Cos($thisLat)) * (Cos($thisLong));
$ya = (Cos($thisLat)) * (Sin($thisLong));
$za = (Sin($thisLat));

$xb = (Cos($otherLat)) * (Cos($otherLong));
$yb = (Cos($otherLat)) * (Sin($otherLong));
$zb = (Sin($otherLat));

$distance = $MeanRadius * Acos($xa * $xb + $ya * $yb + $za * $zb);

echo $distance;
?>

Eu tenho algumas perguntas:

  1. o que são xa, ya, za? Eu entendo que eles são pontos em um plano cartesiano 3D, mas onde eles são relativos? O centro da terra?
  2. Como isso cos($xa * $xb + $ya * $yb + $za * $zb)calcula a distância entre os pontos? Eu sei que em 2D eu faria isso:

texto alternativo

Pythagorean Theorem 
distance^2 = b^2 + a^2
distance = sqr((y2-y1)^2 + (x2 - x1)^2)
  1. Quão preciso isso será? Houve alguma discussão sobre isso na outra página. Mas, especificamente, quero usar a distância para saber se os usuários estão dentro de algo como 10m, 20m ou 50m um do outro. Serei capaz de fazer isso com boa precisão?
  2. Para que devo usar $MeanRadius? Isso é um valor razoável? Eu acho que esse valor assume que a Terra é uma elipse.
sixtyfootersdude
fonte

Respostas:

17

Esse é um código terrível para uso geral, pois pode dar resultados errados ou até falhar por curtas distâncias. Use a fórmula Haversine .

(A fórmula na qual seu código se baseia converte dois pontos na esfera (não uma elipse) em suas coordenadas cartesianas 3D (xa, ya, za) e (xb, yb, zb) na unidadeesfera e forma seu produto escalar, que será igual ao cosseno do ângulo entre eles. A função ACos retorna esse ângulo que, quando escalado pelo raio da Terra, estimará a distância. O problema é que o cosseno de um ângulo pequeno, digamos do tamanho 'e' em radianos, difere de 1 em uma quantidade próxima a e ^ 2/2. Isso desaparece na nuvem de erro de ponto flutuante quando e é menor que a raiz quadrada de duas vezes a precisão do ponto flutuante. Se você estiver computando com precisão única, isso significa que valores menores que 0,001 - cerca de um quilômetro - serão confundidos com zero! Na precisão dupla, o ponto de corte é em torno de e = 10 ^ -8, mas quando e = 10 ^ -4 mais ou menos (cerca de 10 metros), você potencialmente pode perder tanta precisão que precisa se preocupar,, possui alguns cálculos internos de alta precisão incorporados))).

whuber
fonte
7

Dê uma olhada neste site, http://www.movable-type.co.uk/scripts/latlong.html

Se você implementá-lo e obtiver as respostas erradas, provavelmente terá as unidades erradas. Acho que nesse site a maioria das operações é feita em radianos, em vez de graus decimais.

patrick
fonte