Приблизна відстань між двома точками GPS під час польоту ворони легко обчислюється за алгоритмом:
function getCoordsDistance(float $lat1,float $lng1,float $lat2,float $lng2): float {$r = 6371;$lat1 = ($lat1 / 180) * M_PI;$lat2 = ($lat2 / 180) * M_PI;$lng1 = ($lng1 / 180) * M_PI;$lng2 = ($lng2 / 180) * M_PI;$x = ($lng2 - $lng1) * cos(($lat1 + $lat2) / 2);$y = $lat2 - $lat1;$d = sqrt($x * $x + $y * $y) * $r;return round($d * 1000);}
Ця функція припускає, що Земля є ідеальною сферою, тому використовуйте результат лише як оцінку. Для реалістичного розрахунку відстані все одно потрібно враховувати висоту над рівнем моря, форму рельєфу та місцеве вирівнювання.
Я використовую цю функцію, щоб оцінити відстань до торгових точок електронних магазинів. У Чехії середнє відхилення становить приблизно 5 метрів на кожні 1 км, що є достатнім для реальної експлуатації.
Можливо, вам потрібно буде зробити розрахунок на клієнті, ось тут і стане в нагоді javascript:
export const getCoordsDistance = (lat1: number,lng1: number,lat2: number,lng2: number): number => {const r = 6371;const subLat1 = (lat1 / 180) * Math.PI;const subLat2 = (lat2 / 180) * Math.PI;const subLng1 = (lng1 / 180) * Math.PI;const subLng2 = (lng2 / 180) * Math.PI;const x = (subLng2 - subLng1) * Math.cos((subLat1 + subLat2) / 2);const y = subLat2 - subLat1;const d = Math.sqrt(x * x + y * y) * r;return Math.round(d * 1000 * 100000000) / 100000000;};
Щоб знайти навколишні місця в базі даних навколо конкретної точки, можна або використовувати дорогі обчислення функції, перераховані вище, безпосередньо в SQL, або зробити це розумно.
Особисто я використовую комбінацію з пари алгоритмів для пошуку найближчих локацій (наприклад, відділень, де можна оформити замовлення від електронного магазину до клієнта).
На першому кроці ви просто завантажуєте квадратну область навколо обраної точки (ви отримуєте це, просто віднімаючи постійне значення від потрібної точки, а потім шукаючи інтервал). Це дає нам список результатів кандидатів, але ми ще не знаємо, наскільки вони відрізняються один від одного, і нічого не знаємо про їх порядок.
На другому кроці нам потрібно з'ясувати, чи шукаємо ми точки в межах певного кола, чи хочемо знайти більш віддалені точки на квадраті. Особисто я рекомендую прокрутити цей список кандидатів на велосипеді, щоб вирахувати відстань від точки старту для кожного результату, і впорядкувати результати за вирахуваною відстанню.
На третьому кроці можна скористатися простим фільтром, щоб видалити місця, які знаходяться на більшій, ніж бажана відстань від визначеного кола.
Jan Barášek Více o autorovi
Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.
Rád vám pomůžu:
Články píše Jan Barášek © 2009-2024 | Kontakt | Mapa webu
Status | Aktualizováno: ... | uk