Последние несколько месяцев мы работали над проектом Osvita.com.ua — образование в Украине. Среди прочих разделов 2 были посвящены дошкольному и школьному образованию — «Школы» и «Детские сады», выбор которых для большинства обусловлен территориальным расположением — чем ближе к дому, тем лучше. При этом все каталоги сделаны по принципу: вот вам 500 садиков с адресами и телефонами — ищите. Делать очередной бестолковый клон совсем не хотелось.
Хотелось так: ввести адрес и найти все сады в нужном радиусе от дома, да ещё и отсортированные по удаленности, да ещё и увидеть на карте.
И все оказалось вполне реальным. Вот что получилось: (тестовый адрес: г. Киев, ул. Луначарского, 1/2).
Как получилось под хабракатом
Есть крупные города, в них по 200-500 садов с адресами, необходимо найти ближайшие к адресу проживания пользователя сады, скажем, в районе 1 или 2 км и отсортировать по удаленности.
Выбирали между различными поставщиками бесплатных веб-карт.
Результат: выбраны Яндекс-карты.
API Яндекс-карт, как и многих других систем предлагает такие возможности:
Таким образом, вывести на карте конкретный сад — без проблем (это уже очень многие делают). Показать на карте где живет пользователь — тоже легко. Посчитать расстояние между садом и пользователем — опять простая задача. Вот только садов в городе не 10, а делать для каждого поиска 200-500 запросов, чтобы потом найти ближайший – уже проблема (и за ограничение в 25000 запросов в день легко выйти, да и времени такой поиск будет занимать не мало).
Переносим все вычисления на сторону сервера. Для этого:
Основная фишка с координатами это перевести радиус в километрах в радиус в градусах.
необходимо сделать простое сложение и вычитание величины радиуса в градусах.
Похоже, что в Украине мы стали первыми, кто реализовал подобный поиск по детским садам и школам. Не знаю, как с этим обстоит в России, но при беглом просмотре тоже ничего такого не встречалось. Поэтому, захотелось поделиться. Ведь алгоритм достаточно прост и наверняка будет полезен многим проектам.
Хотелось так: ввести адрес и найти все сады в нужном радиусе от дома, да ещё и отсортированные по удаленности, да ещё и увидеть на карте.
И все оказалось вполне реальным. Вот что получилось: (тестовый адрес: г. Киев, ул. Луначарского, 1/2).
Как получилось под хабракатом
Постановка задачи
Есть крупные города, в них по 200-500 садов с адресами, необходимо найти ближайшие к адресу проживания пользователя сады, скажем, в районе 1 или 2 км и отсортировать по удаленности.
Выбор платформы
Выбирали между различными поставщиками бесплатных веб-карт.
- Google Maps: на момент принятия решения Google еще не запустил свои карты по Украине (теперь уже есть).
- Яндекс-карты: есть большинство крупных городов Украины, хорошее API, хорошая документация и поддержка, стабильная высокая скорость доступа, иногда проблемы с украинскими названиями улиц.
- Другие карты (Visicom, Mapia и т.п.): разные проблемы в зависимости от разработчика — менее удобные api, отсутствие примеров и документации, неважная реализация карт, плохая скорость.
Результат: выбраны Яндекс-карты.
Возможности и проблемы
API Яндекс-карт, как и многих других систем предлагает такие возможности:
- определение координат по адресу;
- определение расстояния между двумя координатами или адресами;
- вывод на карте объектов по заданным координатам.
Таким образом, вывести на карте конкретный сад — без проблем (это уже очень многие делают). Показать на карте где живет пользователь — тоже легко. Посчитать расстояние между садом и пользователем — опять простая задача. Вот только садов в городе не 10, а делать для каждого поиска 200-500 запросов, чтобы потом найти ближайший – уже проблема (и за ограничение в 25000 запросов в день легко выйти, да и времени такой поиск будет занимать не мало).
Решение и реализация
Переносим все вычисления на сторону сервера. Для этого:
- При наполнении базы данных адресов садиков, делаем 1 запрос к API Яндекс Карт, определяем координаты этого адреса и заносим в БД вместе с адресом.
- При поиске ближайших садов пользователем, опять же через API Яндекс-Карт определяем координаты его адреса.
- Далее на сервере, зная координаты адреса пользователя, вычисляем координаты площади, удаленной от адреса на 1 или 2 км.
- Ищем все сады, координаты которых попали в эту площадь и вместе с адресом пользователя передаем их координаты в объект API Яндекс-Карт, внедренный на страницу сайта.
- Этот объект рисует карту в заданном масштабе и выводит на ней все переданные сады. Получаем такой результат: (тестовый адрес: г. Киев, ул. Луначарского, 1/2)
Как считать
Основная фишка с координатами это перевести радиус в километрах в радиус в градусах.
- одна минута географического меридиана равна 1852 метрам.
- в градусе 60 минут, т.е. 60*1852 метра
- в одном километре — 1/(60*1.852) градусов
необходимо сделать простое сложение и вычитание величины радиуса в градусах.
Эпилог
Похоже, что в Украине мы стали первыми, кто реализовал подобный поиск по детским садам и школам. Не знаю, как с этим обстоит в России, но при беглом просмотре тоже ничего такого не встречалось. Поэтому, захотелось поделиться. Ведь алгоритм достаточно прост и наверняка будет полезен многим проектам.