Distance entre les points lat / long

10

J'essaie de calculer la distance entre deux points de latitude / longitude. J'ai un morceau de code qui fonctionne principalement que j'ai extrait de ce post mais je ne comprends pas vraiment comment cela fonctionne.

Voici le code:

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

J'ai quelques questions:

  1. que sont xa, ya, za? Je comprends que ce sont des points sur un plan cartésien 3D mais où sont-ils par rapport? Le centre de la terre?
  2. Comment cela cos($xa * $xb + $ya * $yb + $za * $zb)calcule- t-il la distance entre les points? Je sais qu'en 2D je ferais ceci:

texte alternatif

Pythagorean Theorem 
distance^2 = b^2 + a^2
distance = sqr((y2-y1)^2 + (x2 - x1)^2)
  1. Quelle sera la précision? Il y a eu une discussion à ce sujet sur l'autre page. Mais je veux spécifiquement utiliser la distance pour dire si les utilisateurs sont à quelque chose comme 10 m, 20 m ou 50 m l'un de l'autre. Pourrai-je le faire avec une bonne précision?
  2. Que dois-je utiliser $MeanRadius? Est-ce une valeur raisonnable? Je pense que cette valeur suppose que la terre est une élipse.
sixtyfootersdude
la source

Réponses:

17

C'est un code terrible pour un usage général car il peut donner des résultats erronés ou même échouer complètement sur de courtes distances. Utilisez plutôt la formule Haversine .

(La formule sur laquelle votre code est basé convertit deux points de la sphère (pas une ellipse) en leurs coordonnées cartésiennes 3D (xa, ya, za) et (xb, yb, zb) sur l' unitésphère et forme leur produit scalaire, qui sera égal au cosinus de l'angle entre eux. La fonction ACos renvoie cet angle qui, lorsqu'il est mis à l'échelle par le rayon de la terre, estimera la distance. Le problème est que le cosinus d'un petit angle, disons de taille «e» en radians, diffère de 1 d'une quantité proche de e ^ 2/2. Cela disparaît dans le nuage d'erreur en virgule flottante lorsque e est plus petit que la racine carrée de deux fois la précision en virgule flottante. Si vous calculez en simple précision, cela signifie que les valeurs de e inférieures à 0,001 - environ un kilomètre - seront confondues avec zéro! En double précision, la coupure est d'environ e = 10 ^ -8, mais au moment où e = 10 ^ -4 ou plus (environ 10 mètres), vous pouvez potentiellement perdre tellement de précision que vous devez vous inquiéter,, intègre des calculs internes de haute précision)).

whuber
la source
7

Jetez un œil à ce site, http://www.movable-type.co.uk/scripts/latlong.html

Si vous l'implémentez et que vous obtenez les mauvaises réponses, vous avez probablement les mauvaises unités. Je pense que pour ce site, la plupart des opérations sont effectuées en radians au lieu de degrés décimaux.

patrick
la source