Расстояние между широтой / длинной точкой

10

Я пытаюсь рассчитать расстояние между двумя точками широты и долготы. У меня есть фрагмент кода, который в основном работает, который я вытащил из этого поста, но я не очень понимаю, как он работает.

Вот код:

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

У меня есть пара вопросов:

  1. Что такое XA, YA, ZA? Я понимаю, что это точки на трехмерной декартовой плоскости, но где они относительно? Центр земли?
  2. Как это cos($xa * $xb + $ya * $yb + $za * $zb)рассчитать расстояние между точками? Я знаю, что в 2D я бы сделал это:

альтернативный текст

Pythagorean Theorem 
distance^2 = b^2 + a^2
distance = sqr((y2-y1)^2 + (x2 - x1)^2)
  1. Насколько точным это будет? На другой странице было обсуждение этого вопроса. Но я специально хочу использовать расстояние, чтобы определить, находятся ли пользователи на расстоянии около 10 м, 20 м или 50 м друг от друга. Смогу ли я сделать это с хорошей точностью?
  2. Что я должен использовать для $MeanRadius? Это разумная ценность? Я думаю, что это значение предполагает, что земля является эллипсом.
sixtyfootersdude
источник

Ответы:

17

Это ужасный код для общего назначения, поскольку он может давать ошибочные результаты или даже вообще не работать на коротких расстояниях. Вместо этого используйте формулу Haversine .

(Формула, на которой основан ваш код, преобразует две точки на сфере (не эллипс) в их трехмерные декартовы координаты (xa, ya, za) и (xb, yb, zb) на единицесфера и образует их точечное произведение, которое будет равно косинусу угла между ними. Функция ACos возвращает этот угол, который при масштабировании по радиусу Земли будет определять расстояние. Проблема заключается в том, что косинус небольшого угла, скажем, размера «е» в радианах, отличается от 1 на величину, близкую к е ^ 2/2. Это исчезает в облаке ошибок с плавающей запятой, когда e меньше квадратного корня в два раза больше точности с плавающей запятой. Если вы вычисляете с одинарной точностью, это означает, что значения e менее 0,001 - около одного километра - будут перепутаны с нулем! В двойной точности отсечка составляет около e = 10 ^ -8, но к моменту e = 10 ^ -4 или около того (около 10 метров) вы потенциально можете потерять столько точности, что вам нужно беспокоиться,, имеет несколько встроенных высокоточных внутренних вычислений)).

Whuber
источник
7

Взгляните на этот сайт, http://www.movable-type.co.uk/scripts/latlong.html

Если вы реализуете его и получаете неправильные ответы, у вас, вероятно, неправильные единицы измерения. Я думаю, что для этого сайта большинство операций выполняются в радианах, а не в десятичных градусах.

Патрик
источник