Возникла суровая необходимость с помощью 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.