определение расстояний между двумя точками по координатам 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 &#038;&#038; 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.

Support the Blog!

Running a blog takes a lot of effort, time, and passion. Your donations help improve the content, inspire new ideas, and keep the project going.
If you’ve enjoyed the blog’s materials, any support would mean the world to me. Thank you for being here! ❤️

PayPal Logo Donate via PayPal

Revolut Logo Donate via Revolut