Відстань між лат / довгими точками


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? Я розумію, що вони є точками на 3D-декартовій площині, але де вони відносні? Центр землі?
  2. Як це cos($xa * $xb + $ya * $yb + $za * $zb)обчислює відстань між точками? Я знаю, що в 2D я би зробив це:

alt текст

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

Відповіді:


17

Це жахливий код для загального використання, оскільки він може дати помилкові результати або взагалі вийти з ладу на невеликі відстані. Використовуйте замість формули Haversine .

(Формула, на якій базується ваш код, перетворює дві точки на сфері (а не еліпс) у їх декартові координати 3D (xa, ya, za) та (xb, yb, zb) на одиницісфери і утворює їх точковий добуток, який буде дорівнює косинусу кута між ними. Функція ACos повертає той кут, який при масштабуванні радіусом Землі оцінить відстань. Проблема полягає в тому, що косинус невеликого кута, скажімо, розміру 'e' в радіанах, відрізняється від 1 на величину, близьку до e ^ 2/2. Це зникає у хмарі помилки з плаваючою комою, коли e менше квадратного кореня вдвічі точніше плаваючої точки. Якщо ви обчислюєтесь в одній точності, це означає, що значення e менше 0,001 - приблизно один кілометр - будуть плутати з нулем! У подвійній точності обрізання становить приблизно e = 10 ^ -8, але до моменту e = 10 ^ -4 або близько того (приблизно 10 метрів) ви потенційно можете втратити стільки точності, що вам потрібно хвилюватися,, вбудовано кілька високоточних внутрішніх обчислень)).


7

Погляньте на цей сайт, http://www.movable-type.co.uk/scripts/latlong.html

Якщо ви реалізуєте це і отримаєте неправильні відповіді, напевно, у вас неправильні одиниці. Я думаю, що для цього сайту більшість операцій робиться в радіанах замість десяткових градусів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.