Distancia entre puntos lat / long

10

Estoy intentando calcular la distancia entre dos puntos de latitud / longitud. Tengo un código que funciona principalmente que saqué de esta publicación, pero realmente no entiendo cómo funciona.

Aquí está el 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;
?>

Tengo un par de preguntas:

  1. ¿Qué son xa, ya, za? Entiendo que son puntos en un plano cartesiano 3D, pero ¿a dónde están relacionados? El centro de la tierra?
  2. ¿Cómo cos($xa * $xb + $ya * $yb + $za * $zb)calcula esto la distancia entre los puntos? Sé que en 2D haría esto:

texto alternativo

Pythagorean Theorem 
distance^2 = b^2 + a^2
distance = sqr((y2-y1)^2 + (x2 - x1)^2)
  1. ¿Qué tan exacto será esto? Hubo alguna discusión sobre eso en la otra página. Pero específicamente quiero usar la distancia para saber si los usuarios están dentro de algo así como 10m, 20m o 50m entre sí. ¿Podré hacer esto con buena precisión?
  2. ¿Para qué debo usar $MeanRadius? ¿Es ese un valor razonable? Creo que ese valor supone que la tierra es una elipse.
Sixtyfootersdude
fuente

Respuestas:

17

Este es un código terrible para uso general porque puede dar resultados erróneos o incluso fallar por completo en distancias cortas. Utilice la fórmula de Haversine en su lugar.

(La fórmula en la que se basa su código convierte dos puntos en la esfera (no una elipse) en sus coordenadas cartesianas 3D (xa, ya, za) y (xb, yb, zb) en la unidadesfera y forma su producto punto, que será igual al coseno del ángulo entre ellos La función ACos devuelve ese ángulo, que cuando se escala por el radio de la Tierra estimará la distancia. El problema es que el coseno de un ángulo pequeño, digamos del tamaño 'e' en radianes, difiere de 1 en una cantidad cercana a e ^ 2/2. Esto desaparece en la nube de error de coma flotante cuando e es más pequeña que la raíz cuadrada del doble de la precisión de coma flotante. Si está calculando con precisión simple, esto significa que valores de e inferiores a 0.001, aproximadamente un kilómetro, se confundirán con cero. En doble precisión, el límite es de alrededor de e = 10 ^ -8, pero para el momento e = 10 ^ -4 más o menos (unos 10 metros) puede perder tanta precisión que necesita preocuparse,, tiene algunos cálculos internos de alta precisión integrados)).

whuber
fuente
7

Eche un vistazo a este sitio, http://www.movable-type.co.uk/scripts/latlong.html

Si lo implementa y obtiene las respuestas incorrectas, probablemente tenga las unidades incorrectas. Creo que para ese sitio la mayoría de las operaciones se realizan en radianes en lugar de grados decimales.

Patricio
fuente