Distanza tra lat / long points


10

Sto tentando di calcolare la distanza tra due punti di latitudine / longitudine. Ho un pezzo di codice che funziona principalmente che ho strappato da questo post ma non capisco davvero come funzioni.

Ecco il codice:

<?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;
?>

Ho un paio di domande:

  1. cosa sono xa, ya, za? Capisco che sono punti su un piano cartesiano 3D ma dove sono relativi? Il centro della terra?
  2. In che modo cos($xa * $xb + $ya * $yb + $za * $zb)calcola la distanza tra i punti? So che in 2D lo farei:

testo alternativo

Pythagorean Theorem 
distance^2 = b^2 + a^2
distance = sqr((y2-y1)^2 + (x2 - x1)^2)
  1. Quanto sarà accurato? C'è stata qualche discussione al riguardo nell'altra pagina. Ma in particolare voglio usare la distanza per dire se gli utenti si trovano all'interno di qualcosa come 10m, 20m o 50m l'uno dall'altro. Sarò in grado di farlo con una buona precisione?
  2. Per cosa dovrei usare $MeanRadius? È un valore ragionevole? Penso che quel valore presupponga che la terra sia un'ellisse.

Risposte:


17

Questo è un codice terribile per uso generico perché può dare risultati errati o addirittura fallire del tutto per brevi distanze. Usa invece la formula Haversine .

(La formula su cui si basa il codice converte due punti sulla sfera (non un'ellisse) nelle loro coordinate cartesiane 3D (xa, ya, za) e (xb, yb, zb) sull'unitàsfera e forma il loro punto prodotto, che eguaglierà il coseno dell'angolo tra di loro. La funzione ACos restituisce quell'angolo, che una volta ridimensionato dal raggio terrestre stimerà la distanza. Il problema è che il coseno di un piccolo angolo, diciamo della dimensione 'e' in radianti, differisce da 1 per una quantità vicina a e ^ 2/2. Questo scompare nella nuvola di errori in virgola mobile quando e è più piccolo della radice quadrata di precisione doppia del virgola mobile. Se stai calcolando con precisione singola, questo significa che i valori di e inferiore a 0,001 - circa un chilometro - saranno confusi con zero! In doppia precisione, l'interruzione è intorno a e = 10 ^ -8, ma quando e = 10 ^ -4 o giù di lì (circa 10 metri) potresti potenzialmente perdere così tanta precisione che devi preoccuparti,, ha alcuni calcoli interni di alta precisione integrati)).


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.