Blog. Just Blog

Расстояние между двумя точками на карте

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Web-мастеру и не только | Автор: ManHunter
Расстояние между двумя точками на карте
Расстояние между двумя точками на карте

Одна из задач, с которой могут столкнуться разработчики - вычисление расстояния между двумя точками на карте. Это может быть определение объектов, которые находятся вблизи какой-то конкретной точки, оценка времени перемещения из одной точки в другую, вариантов применения может быть много.

В рабочих проектах для определения расстояния между двумя точками на карте с известными географическими координатами я использую вот такую функцию:
  1. //---------------------------------------------------------------------
  2. // Получение расстояния между двумя точками на карте
  3. //---------------------------------------------------------------------
  4. function distance($lat1$lng1$lat2$lng2){
  5.     return ceil(12745594 asin(sqrt(
  6.         pow(sin(deg2rad($lat2-$lat1)/2),2)
  7.         +
  8.         cos(deg2rad($lat1)) *
  9.         cos(deg2rad($lat2)) *
  10.         pow(sin(deg2rad($lng2-$lng1)/2),2)
  11.     )));
  12. }
Параметры вызова: $lat1 и $lng1 - широта и долгота первой точки, $lat2 и $lng2 - широта и долгота второй точки, на выходе - расстояние между точками в метрах. Формулу легко портировать на любой другой язык программирования, например, получать расстояние сразу при выборке данных из базы MySQL.

Если объектов в базе много, то для ускорения запроса и сужения интервала выборки можно использовать вспомогательную функцию, которая определяет координаты граничных точек, находящихся на заданном расстоянии относительно центральной точки.
  1. //---------------------------------------------------------------------
  2. // Получение границ участка местности относительно центральной точки
  3. //---------------------------------------------------------------------
  4. function get_bounds($lat$lng$dist) {
  5.     // Длина дуги параллели в 1 градус на экваторе
  6.     $eq=111321;
  7.  
  8.     return array(
  9.         // Длину дуги меридиана считаем постоянной
  10.         'top'=>$lat+$dist/$eq,
  11.         'bottom'=>$lat-$dist/$eq,
  12.         // Длина дуги параллели = Длина дуги на экваторе * cos(Широта)
  13.         'right'=>$lng+$dist/($eq*cos(deg2rad($lat))),
  14.         'left'=>$lng-$dist/($eq*cos(deg2rad($lat))),
  15.     );
  16. }
Параметры вызова: $lat и $lng - широта и долгота центральной точки области, $dist - расстояние в метрах от центра до границ условного квадрата. На выходе массив со значениями широты и долготы граничных точек области. Эти данные можно использовать, например, для выборки из базы только тех объектов, координаты которых находятся в этом диапазоне.

Поделиться ссылкой ВКонтакте
Просмотров: 4004 | Комментариев: 2

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
hatmaster (28.08.2017 в 08:46):
ЦитатаА вот программа-"курвиметр" для электронных карт, замер пройденного на экране курсором мыши расстояния - это уже б.м.полезная вещь:


Мсье знает толк в извращениях :)
OZI Explorer? Не, не слышали...
user (26.08.2017 в 01:46):
Кстати, встречалась оригинальная программка - этакий курвиметр.
Используется обычная мышь с колёсиком, которую переворачивают вверх ногами и катят колёсиком по обычной бумажной карте. В результате на экране отображается длина пройденного колёсиком пути.
Идея оригинальная, но малофункциональная.
А вот программа-"курвиметр" для электронных карт, замер пройденного на экране курсором мыши расстояния - это уже б.м.полезная вещь:
old-dos.ru/dl.php?id=7068

Упомянутая программа для использования перевёрнутого мыша в качестве курвиметра хорошо ищется по тегу "Курвиметр из мыши".

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0034 сек.) / Память: 4.5 Mb
Наверх