В нашем клубе несколько раз спрашивали - есть ли в API поиск ближайших станций метро. Этой возможности - нет, однако ее несложно сделать самому.
Сделал несложный сервис, который возвращает ближайшие станции метро (не более 3х штук) в формате YMapsML или JSONP. Данный сервис работает со следующими городами: Москва, Санкт-Петербург, Екатеринбург, Казань, Нижний Новгород, Новосибирск, Самара, Киев, Днепропетровск, Харьков.
"Сервис" располагается по адресу:
http://geojump.ru/services/metro
Можно передать следующие параметры:
- point - координаты точки, относительно которой искать метро;
- distance - радиус (в км, от 1 до 5) в котором ищем метро;
- format - формат отдачи данных (ymapsml или json);
- jsoncallback - функция обратного вызыва в случае JSONP.
Примеры использования:
http://geojump.ru/service
http://geojump.ru/service
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 км, т.е. небольшие ;)
Планы на будущее
Пока четко сформулированных планов дальнейшего развития - нет.
Этот сервис будет там располагаться минимум год, если кто-то им будет пользоваться, то будет жить дальше и развиваться.
Нашли ошибку?
Если найдете ошибку или будут пожелания какие-нибудь - пишите!