определение расстояний между двумя точками по координатам GPS

Как определить расстояние между двумя точками на карте по координатам GPS?

Возникла суровая необходимость с помощью PHP сделать что-то, с помощью чего можно будет быстренько определять расстояние между двумя точками на карте по координатам GPS. Для тех, кто немного не в курсе — уточню, что основная сложность подобной задачи состоит в том, что нам нужно определить расстояния между двумя точками на сфере, а не на плоскости. Потому нужно (есть аналоги, но я предпочитаю использовать) метод Хаверсина.

Метод Хаверсина основан на тригонометрических функциях и законах сферической геометрии и позволяет вычислить расстояние между двумя точками на поверхности сферы, используя их географические координаты (широту и долготу). Этот метод учитывает кривизну Земли и дает более точные результаты, особенно для дальних расстояний, чем простое расстояние по прямой линии на плоскости.

Я уже описывал схему решения подобного вопроса с помощью Python (решение представлено здесь) — но, повторюсь — нужно было сделать аналогичное, но теперь уже на PHP. Заняло все минут 30, с перерывом на чай и музыку (в качестве музыки использовал вот это):

… в визуальном оформлении все просто — форма с двумя полями, куда вводятся координаты первой и второй точки, и — соответственно, кнопка, по нажатию на которую происходит вся магия 🙂 Было лениво выводить всю магию во второй файл, потому все делается в одном файлике, код которого — ниже. Пользуйтесь, если нужно:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>GPS to kilometers</title>
<meta name="author" content="Oleksiy Lavrynenko | https://lavrynenko.com" />
<meta name="description" content="GPS to kilometers" />
<meta name="robots" content="index,follow" />
<!-- Подключение стилей -->
<link rel="stylesheet" href="d-style.css">
<!-- Иконка вкладки -->
<link rel="icon" href="html-to-telegram.png">
</head>
<body>
<!-- Форма для ввода координат -->
<form class="telegram_id_form" action="#" method="post">
<?php
// Тексты подсказок для полей ввода
$coords1 = "Введите координаты точки 1";
$coords2 = "Введите координаты точки 2";
// Текст на кнопке
$button = "Посчитать расстояние";
?>
<!-- Поля для ввода координат -->
<input class="coords" name="coords1" id="coords1" type="text" placeholder="<?php echo "$coords1";?>">
<input class="coords" name="coords2" id="coords2" type="text" placeholder="<?php echo "$coords2";?>">
<!-- Кнопка отправки формы -->
<input class="button" name="submit" type="submit" value="<?php echo "$button"; ?>" />
<!-- Текстовое поле для вывода результата -->
<textarea class="textarea" name="textarea" id="textarea" rows="5"><?php if(isset($distance)) echo "Расстояние между точками: " . number_format($distance, 5) . " км"; ?></textarea>
</form>
<?php
// Проверка на отправку формы
if(isset($_POST['submit'])) {
// Радиус Земли в километрах
$r = 6371;
 
// Получение введенных координат
$coords1 = $_POST['coords1'];
$coords2 = $_POST['coords2'];
 
// Разбиение координат на широту и долготу
$coords1_parts = explode(',', $coords1);
$coords2_parts = explode(',', $coords2);
 
// Проверка, что массивы содержат оба элемента
if(count($coords1_parts) == 2 && count($coords2_parts) == 2) {
// Извлечение координат
$lat1 = (float)trim($coords1_parts[0]);
$lon1 = (float)trim($coords1_parts[1]);
$lat2 = (float)trim($coords2_parts[0]);
$lon2 = (float)trim($coords2_parts[1]);
 
// Перевод координат из градусов в радианы
$lat1 = deg2rad($lat1);
$lon1 = deg2rad($lon1);
$lat2 = deg2rad($lat2);
$lon2 = deg2rad($lon2);
 
// Вычисление разницы в координатах
$dLon = abs($lon2 - $lon1);
$dLat = abs($lat2 - $lat1);
 
// Вычисление синусов и косинусов половинных различий широт и долгот
$a = sin($dLat / 2) * sin($dLat / 2) + cos($lat1) * cos($lat2) * sin($dLon / 2) * sin($dLon / 2);
// Вычисление углового расстояния
$c = 2 * atan2(sqrt($a), sqrt(1 - $a));
 
// Вычисление фактического расстояния
$distance = $r * $c;
 
// Передача результата в форму
echo "<script>document.getElementById('textarea').value = 'Расстояние между точками: " . number_format($distance, 5) . " км';</script>";
} else {
// Вывод сообщения об ошибке формата координат
echo "Некорректный формат координат. Введите координаты в формате 'широта, долгота' для обеих точек.";
}
}
?>
</body>
</html>

В коде куча комментариев — вроде как все будет понятно.

В рабочем виде механизм для определения расстояния между двумя точками на карте по координатам GPS можно либо по ссылке, либо — вот, окошечко во фрейме 🙂 :

Как всегда — в случае возникновения вопросов пишите на почту, или в Telegram.