Рассчитываем расстояние между двумя точками на поверхности Земли на PHP/JavaScript
Представим, что в вашем распоряжении две пары географических координат (долгота и широта), и ваша задача – рассчитать кратчайшее расстояние между ними. Что для этого нужно сделать и, соответственно, учесть?
Поскольку Земля имеет форму, приближенную к сфере, расстояние между двумя географическими объектами на ней мы будем искать по формуле Гаверсинуса, которая в преобразованном виде выглядит следующим образом:
В ней:
r – радиус Земли в километрах;
φ1, φ2 – широта в радианах;
λ1, λ2 – долгота в радианах;
На основе ее составим две (по одной из указанных языков программирования) несложные функции, которые помогут нам получить нужный результат.
Как рассчитать расстояние между двумя координатами на PHP?
Итак, формула у нас есть, просто переведем ее в код и для удобства упакуем в некую функцию.
Вид всего этого будет следующий:
function distance($lat_1, $lon_1, $lat_2, $lon_2) {
$radius_earth = 6371; // Радиус Земли
$lat_1 = deg2rad($lat_1);
$lon_1 = deg2rad($lon_1);
$lat_2 = deg2rad($lat_2);
$lon_2 = deg2rad($lon_2);
$d = 2 * $radius_earth * asin(sqrt(sin(($lat_2 - $lat_1) / 2) ** 2 + cos($lat_1) * cos($lat_2) * sin(($lon_2 - $lon_1) / 2) ** 2));
return number_format($d, 2, '.', '').' км.';
}
Вызов:
echo 'Расстояние между Костромой и Ярославлем: '.distance(57.37, 39.51, 57.46, 40.55); // 63.08 км.
В нем мы (в виде широта_1, долгота_1, широта_2, долгота_2) передаем известные координаты объектов и получаем кратчайшее расстояние между ними.
Поскольку Земля – не идеальная сфера, значение радиуса мы берем усредненное – 6371 километр, а потому в итоговом результате будет присутствовать погрешность в 0.5% (если верить Википедии).
Все координаты перед началом расчета мы переводим из градусов в радианы через функцию deg2rad.
Последовательность передаваемых пар координат не имеет значения.
Как рассчитать расстояние между двумя координатами на JavaScript?
Предыдущий вариант из PHP по определению расстояния между двумя точками в JavaScript будет выглядеть следующим образом:
function deg2rad(num) {
// Функция для перевода градусов в радианы
return num * Math.PI / 180;
}
function distance(lat_1, lon_1, lat_2, lon_2) {
let radius_earth = 6371; // Радиус Земли
let lat_1 = deg2rad(lat_1),
lon_1 = deg2rad(lon_1),
lat_2 = deg2rad(lat_2),
lon_2 = deg2rad(lon_2);
let d = 2 * radius_earth * Math.asin(Math.sqrt(Math.sin((lat_2 - lat_1) / 2) ** 2 + Math.cos(lat_1) * Math.cos(lat_2) * Math.sin((lon_2 - lon_1) / 2) ** 2));
return d.toFixed(2)+' км.';
}
Использование аналогичное:
alert('Расстояние между Костромой и Ярославлем: '+distance(57.37, 39.51, 57.46, 40.55)); // 63.08 км
Согласитесь, не такая уж и сложная, но определенно полезная функция.