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.

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))).


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.