Pull to refresh

Делаем поиск детских садов и школ по-настоящему удобным. Прикладное использование Яндекс Карт

Reading time3 min
Views2.2K
Последние несколько месяцев мы работали над проектом Osvita.com.ua — образование в Украине. Среди прочих разделов 2 были посвящены дошкольному и школьному образованию — «Школы» и «Детские сады», выбор которых для большинства обусловлен территориальным расположением — чем ближе к дому, тем лучше. При этом все каталоги сделаны по принципу: вот вам 500 садиков с адресами и телефонами — ищите. Делать очередной бестолковый клон совсем не хотелось.

Хотелось так: ввести адрес и найти все сады в нужном радиусе от дома, да ещё и отсортированные по удаленности, да ещё и увидеть на карте.

И все оказалось вполне реальным. Вот что получилось: (тестовый адрес: г. Киев, ул. Луначарского, 1/2).

image

Как получилось под хабракатом

Постановка задачи


Есть крупные города, в них по 200-500 садов с адресами, необходимо найти ближайшие к адресу проживания пользователя сады, скажем, в районе 1 или 2 км и отсортировать по удаленности.

Выбор платформы


Выбирали между различными поставщиками бесплатных веб-карт.
  • Google Maps: на момент принятия решения Google еще не запустил свои карты по Украине (теперь уже есть).
  • Яндекс-карты: есть большинство крупных городов Украины, хорошее API, хорошая документация и поддержка, стабильная высокая скорость доступа, иногда проблемы с украинскими названиями улиц.
  • Другие карты (Visicom, Mapia и т.п.): разные проблемы в зависимости от разработчика — менее удобные api, отсутствие примеров и документации, неважная реализация карт, плохая скорость.

Результат: выбраны Яндекс-карты.

Возможности и проблемы


API Яндекс-карт, как и многих других систем предлагает такие возможности:
  • определение координат по адресу;
  • определение расстояния между двумя координатами или адресами;
  • вывод на карте объектов по заданным координатам.

Таким образом, вывести на карте конкретный сад — без проблем (это уже очень многие делают). Показать на карте где живет пользователь — тоже легко. Посчитать расстояние между садом и пользователем — опять простая задача. Вот только садов в городе не 10, а делать для каждого поиска 200-500 запросов, чтобы потом найти ближайший – уже проблема (и за ограничение в 25000 запросов в день легко выйти, да и времени такой поиск будет занимать не мало).

Решение и реализация


Переносим все вычисления на сторону сервера. Для этого:
  1. При наполнении базы данных адресов садиков, делаем 1 запрос к API Яндекс Карт, определяем координаты этого адреса и заносим в БД вместе с адресом.
  2. При поиске ближайших садов пользователем, опять же через API Яндекс-Карт определяем координаты его адреса.
  3. Далее на сервере, зная координаты адреса пользователя, вычисляем координаты площади, удаленной от адреса на 1 или 2 км.
  4. Ищем все сады, координаты которых попали в эту площадь и вместе с адресом пользователя передаем их координаты в объект API Яндекс-Карт, внедренный на страницу сайта.
  5. Этот объект рисует карту в заданном масштабе и выводит на ней все переданные сады. Получаем такой результат: (тестовый адрес: г. Киев, ул. Луначарского, 1/2)

Как считать


Основная фишка с координатами это перевести радиус в километрах в радиус в градусах.
  • одна минута географического меридиана равна 1852 метрам.
  • в градусе 60 минут, т.е. 60*1852 метра
  • в одном километре — 1/(60*1.852) градусов
А чтобы получить координаты квадрата, в котором центр будет исходным адресом,
необходимо сделать простое сложение и вычитание величины радиуса в градусах.

Эпилог


Похоже, что в Украине мы стали первыми, кто реализовал подобный поиск по детским садам и школам. Не знаю, как с этим обстоит в России, но при беглом просмотре тоже ничего такого не встречалось. Поэтому, захотелось поделиться. Ведь алгоритм достаточно прост и наверняка будет полезен многим проектам.
Tags:
Hubs:
+34
Comments46

Articles

Change theme settings