Клуб API Карт

Ближайшие станции метро

hevil
16 августа 2009, 23:46

В нашем клубе несколько раз спрашивали - есть ли в API поиск ближайших станций метро. Этой возможности - нет, однако ее несложно сделать самому.

Сделал несложный сервис, который возвращает ближайшие станции метро (не более 3х штук) в формате YMapsML или JSONP. Данный сервис работает со следующими городами: Москва, Санкт-Петербург, Екатеринбург, Казань, Нижний Новгород, Новосибирск, Самара, Киев, Днепропетровск, Харьков.

"Сервис" располагается по адресу:

 http://geojump.ru/services/metro 

Можно передать следующие параметры:

  • point - координаты точки, относительно которой искать метро;
  • distance - радиус (в км, от 1 до 5) в котором ищем метро;
  • format - формат отдачи данных (ymapsml или json);
  • jsoncallback - функция обратного вызыва в случае JSONP.

Примеры использования:

 http://geojump.ru/services/metro/ymapsml-example.html 

 http://geojump.ru/services/metro/json-example.html 


Реализация
PHP + MySQL + XSLT.

Хранение координат
Используется стандартный тип данных POINT (spatial index) в MySQL. Соответственно данные хранятся в виде R-tree.

Алгоритм
1. Вокруг точки point (которая передана в качестве параметра) строится восьмиугольник (аппроксимация окружности) с "радиусом", равным distance (по умолчанию равно 2 км).
2. Из БД выбираются все метро, которые попали в этот многоугольник. Используются стандартные методы MySQL.
3. Вычисляются расстояния от точки point до всех найденных метро. Алгоритм взят с gis-lab.info.
4. После сортировки, отбираются ближайшие 3 станции.
5. Формируется XML с данными.
6. С помощью XSLT получаем данные в нужном формате.

Можно использовать и решение в лоб: рассчитывать расстояние до каждой станции метро, но "это не наш метод".

Точность алгоритма

Погрешность построения многоугольника колеблется в пределах 50-100 метров.

Расстояние, вычисляемое с помощью алгоритма  с gis-lab.info немного отчисляется от того, которое рассчитывает API, но не намного. Погрешность 5-10 м на небольших расстояних (а у нас расстояния от 1 до 5 км, т.е. небольшие ;)

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

Нашли ошибку?
Если найдете ошибку или будут пожелания какие-нибудь - пишите!

 

9 комментариев
Подписаться на комментарии к посту
спасибо что использовали наш алгоритм (хотя он конечно не наш :))
если сочтете нужным - присылайте его реализацию на php (только сам расчет разумеется), добавлю на страницу.
Добрый день! Большое спасибо за создание этого сервиса, с его помощью уже созданы привязки адресов к станциям метро по Москве. Можно ли попросить Вас о его реализации для других городов: Санкт-Петербурга, Нижнего Новгорода, Екатеринбурга, Самары, Казани, Новосибирска?
Вас интересуют все перечисленные города? Могу добавить. В течение недели-двух сделаю и отпишусь.

Да, для всех этих городов, пожалуйста.

Лучше поздно, чем никогда :)

Данный сервис теперь работает со следующими городами: Москва, Санкт-Петербург, Екатеринбург, Казань, Нижний Новгород, Новосибирск, Самара, Киев, Днепропетровск, Харьков.

Посмотреть в действии можно по тем же ссылкам:

http://geojump.ru/services/metro/ymapsml-example.html 

http://geojump.ru/services/metro/json-example.html


Если будут вопросы, баги и пр. - пишите.
Большое спасибо :)
Сайт не работает. Что теперь делать?
shururik2,
 Если еще нужно, то здесь описано как вычислить расстояние до ближайшего метро
info@avantexpert.ru
25 ноября 2016, 20:48
Да, ссылки не работают...