PHP Manual
/
Алгоритми

Відстань між двома точками GPS

18. 12. 2022

Приблизна відстань між двома точками GPS під час польоту ворони легко обчислюється за алгоритмом:

Реалізація на PHP

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 км, що є достатнім для реальної експлуатації.

Реалізація на мові TypeScript

Можливо, вам потрібно буде зробити розрахунок на клієнті, ось тут і стане в нагоді 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:

Související články

1.
6.
Status:
All systems normal.
2024