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

    Последние несколько месяцев мы работали над проектом 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) градусов
    А чтобы получить координаты квадрата, в котором центр будет исходным адресом,
    необходимо сделать простое сложение и вычитание величины радиуса в градусах.

    Эпилог


    Похоже, что в Украине мы стали первыми, кто реализовал подобный поиск по детским садам и школам. Не знаю, как с этим обстоит в России, но при беглом просмотре тоже ничего такого не встречалось. Поэтому, захотелось поделиться. Ведь алгоритм достаточно прост и наверняка будет полезен многим проектам.
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 46

      +3
      мы школу по отзывам выбирали, а не по удаленности)
      а вообще интересный проект.
        0
        аналогичный случай
        +1
        Хороший сервис. Надеюсь, скоро наберете побольше отзывов о садах. Вот тогда будет совсем отлично.
          0
          Отзывы мы тоже сделали, но все же отзывы лучше искать вначале в школах, которые ближе к дому — верно?
            0
            вобщем да, но я знаю людей которые на другой конец города возят детей, потому что школа клевая, но это к теме не имеет отношения в принципе)
              +1
              С комментариями там есть еще проблема накруток, с которыми довольно трудно бороться. Прямо таки вообще непонятно как.
                0
                представил директора детского сада накручивающего себе рейтинг)))
                  +3
                  представил директора, который рассылает вниз по иерархии указания воспитателям о том, чтобы родители детей накрутили рейтинг из дома))
                  +1
                  В любом случае, лучше с отзывами, чем без них. А накрутки довольно часто явно бросаются в глаза.
                    0
                    Сами отзывы есть. Вопрос в том, что было бы здорово построить рейтинг по этим оценкам. А вот там где рейтинг, там уж точно начнется.
              0
              Банкоматы на карте отметили, школы, садики тоже отметили. Это не может не радовать, все наглядно, легко разобраться. Но не останавливайтесь на достигнутом отметьте спортивные секции, театры, киношки курсы иностранных языков… и магазины «24 часа» не забудьте =)
                0
                Ага и с мониторингом цен онлайн и камерой на тот случай, если надо проверить открыт или на перерыве ))
                  0
                  О том, чтобы сделать геопоиск по курсам мы кстати всерьез подумали, но отложили это до момента, когда база курсов будет насчитывать как минимум несколько тысяч предложений, тогда действительно можно будет поискать и ближайшие курсы английского языка. Почему бы и нет.
                    0
                    Почему только английского? Почему только курсы? Всех отмечайте, чья база Вас удовлетворит.
                  –2
                  простое и лаконичное решение с просчетом на стороне сервера.
                  а вот с выбором яндекса вместо гугля не все так однозначно
                    0
                    Если брать во внимание страну для которой разрабатывался проект, то по-моему как раз всо очень даже однозначно, детализация Днепра, Харькова, Донецка — на гугле пока оставляет желать лучшего.
                      0
                      Уже нет. В момент когда мы тестировали проект, были адреса, которые Яндекс не мог найти, а Гугл находил. Так что, похоже, они значительно подтянулись.
                        0
                        недавно только ввели, еще месяц назад поиска адресу небыло
                      +1
                      Было бы неплохо, чтобы адрес, по которому ищешь запоминался при переходе между разделами.
                        0
                        принято в 2do
                          0
                          На тот случай, если у тебя 2 ребенка, один в школу идет, а другой в сад?
                            0
                            например да. Кстати, так бывает. Или например ты переехал в другой район или город. Ещё приятно, когда ты вчера что-то искал, а потом решил доискать сегодня… а тут раз и твой адрес сайт помнит.
                          –2
                          Мне кажется это бесполезным. Как можно где-то жить и не знать ближайших садиков? В совсем уж крайнем случае об этом можно спросить кого угодно. Честно говоря, сейчас на картах отмечают такое гигантское количество вещей, что скоро кто-нибудь откроет сервис на котором можно будет найти ближайший выход из собственного подъезда.
                            0
                            Отличный сервис, родителей много, кому это нужно.
                            Так сделайте в России, то же, что и на Украине, добавите популярности.
                              0
                              Спасибоза отзыв. Что касается сервиса по России- в будущем мы планируем в определенной степени монетизировать ресурс (продажа рекламы, вип размещений и т.д.). Вести такой бизнес из Украины в России достаточно затруднительно, поэтому пока ограничиваемся своим регионом.
                              +1
                              1. maps.google.ru/
                              2. кликаем на «показать моё местоположение»
                              3. в поиске вводим «детский сад»
                              4. profit

                              У нас конечно информации по садикам мало, но вот если глянуть Сан-франциско и забить «school» — то там уже солидные такие профили. Вообще все эти гео-стартапы, что здесь постят за последнее время google maps сильно не превосходят.
                                –1
                                А вы не из дефолт-сити?

                                Никто не приуменьшает заслуг Google. Дело в другом. maps.google.com.ua не открывается вообще, у гугла карты по Украине сыроваты, а о садиках вообще речь не идет, и кнопки «показать моё местоположение» нет и в помине.
                                  +1
                                  maps.google.ru прекрасно находит «Киев Луначарского 1/2», а так же содержит детальные карты других 5 городов с этого сайта. да, домена нет, индексация наверное тоже пока не полная — находит не все школы. но ЧМ через год — я думаю они поработают над сервисом.

                                  для кнопки «местоположение» вроде бы должен быть установлен google gears, впрочем обычный поиск никто не отменял.
                                    0
                                    Да, в Харькове я нашел чуть меньше 10 школ из 100+. В совершенно не юзабельном виде.
                                    И три садика, из которых один заброшенный.

                                    Мы не в Сан-Франциско к сожалению, и детальных карт всего города я ждал больше 3х лет, а после обновления треть города скрыта облаками.
                                    Поэтому ждать пять лет пока на карте будут отмечены все места — вы это предлагаете?

                                    И самое главное: В поске школ половина мест взята была из внешних kml файлов, которые составлялись именно такими проектами. И уже с их помощью гугл получил данные о местах. Поэтому говорить что подобные проекты безсмысленны — полный бред, потому что именно с их помощью и будет заполняться база данных.
                                +1
                                Очень похоже на maplos.com
                                  0
                                  На Google Map API реализовал в одном проекте поиск ближайших отделений банка (расстояние можно выбрать) от указанной точки на карте. Ищется одним запросом к БД. Если кому интересно могу дать ссылку на потестить и SQL запрос на поюзать.
                                    0
                                    Интересно.
                                      0
                                      Интересно! И поиск по радиусу, а не как в статье по прямоугольнику?
                                        0
                                        Данные для запроса:

                                        BANK_BRANCHES — таблица отделений, у каждого отделения есть координаты Lng и Lat
                                        lat, lng — координаты точки на Google Map
                                        maxDist — максимальная дистанция от заданной точки, в километрах

                                        начальные преобразования:

                                        double DE2RA = 0.01745329252;
                                        lat *= DE2RA;
                                        lng *= DE2RA;

                                        Запрос:

                                        SELECT BANK_BRANCHES.*, 6371.0 * ATAN(Sqrt( 1 — (Sin(" + lat + ") * Sin(0.01745329252 * Lat) + Cos(" + lat + ") * Cos(0.01745329252 * Lat) * Cos(" + lng + " — 0.01745329252 * Lng)) * (Sin(" + lat + ") * Sin(0.01745329252 * Lat) + Cos(" + lat + ") * Cos(0.01745329252 * Lat) * Cos(" + lng + " — 0.01745329252 * Lng)) ) / (Sin(" + lat + ") * Sin(0.01745329252 * Lat) + Cos(" + lat + ") * Cos(0.01745329252 * Lat) * Cos(" + lng + " — 0.01745329252 * Lng))) AS distance FROM BANK_BRANCHES WHERE Lat IS NOT Null AND Lng IS NOT Null AND 6371.0 * ATAN(Sqrt( 1 — (Sin(" + lat + ") * Sin(0.01745329252 * Lat) + Cos(" + lat + ") * Cos(0.01745329252 * Lat) * Cos(" + lng + " — 0.01745329252 * Lng)) * (Sin(" + lat + ") * Sin(0.01745329252 * Lat) + Cos(" + lat + ") * Cos(0.01745329252 * Lat) * Cos(" + lng + " — 0.01745329252 * Lng)) ) / (Sin(" + lat + ") * Sin(0.01745329252 * Lat) + Cos(" + lat + ") * Cos(0.01745329252 * Lat) * Cos(" + lng + " — 0.01745329252 * Lng))) <= @maxDist

                                        Реализация здесь:

                                        informatron.ru/Banks/Map.aspx

                                        Двойной клик на карте покажет отделения в указанном радиусе
                                      –4
                                      Ребята, во первых яндекс-адреса делают всю эту работу на ура. Указываешь район в котором живешь, масштабируешь карту и задаешь поиск детских садов. В ответ умница-яндекс выдает карту список телефонов детсадов, по которым не отходя от кассы звонишь.
                                      Но главная проблема во-вторых: коллега на той неделе поздно спохватилась и обзванивала детсады и везде получила ответ: «местов нет, хата не резиновая».
                                      1. Сервис уже существует на яндексе;
                                      2. Сервис нужен был в марте-мае этого года.
                                        0
                                        Может, перед тем как писать коммент, лучше проверить, есть ли на Яндексе такой сервис или нет?

                                        Где здесь хотя бы Киев?
                                          0
                                          Если не сложно, для примера сформируйте ссылку детских садов, например в Днепропетровске относительно адреса ул. Ленина, 1. Спасибо.
                                            0
                                            Дефолт-Сити? Вы первое предложение читали, или так, по заголовку пробежались?

                                            Ближайший детский садик относительно адреса «Морозова 1, Харьков» Находится в ~82 км на север.

                                            Где здесь работа на ура?
                                            0
                                            Отличный сервис.

                                            Я бs предложил еще раз посмотреть в сторону Google Maps
                                              0
                                              ещё посмотрим :)
                                              +3
                                              * одна минута географического меридиана равна 1852 метрам.
                                              * в градусе 60 минут, т.е. 60*1852 метра
                                              * в одном километре — 1/(60*1.852) градусов

                                              На самом деле одна минута широты примерно равна 1852 метра. С долготой немного тяжелее. Если в первом приближении считать землю шариком — можно выйти на такую формулу (lat — широта, L long(lat) — длина минуты долготы на широте lat):

                                              L long(lat) = cos(lat)*1852м.

                                              Получается на широте Киева (50.4) длина одной минуты долготы примерно равна 1180 метров
                                                0
                                                Порадовал радиус квадрата.
                                                  0
                                                  Не отрицаем, есть что улучшить :)
                                                    0
                                                    +1
                                                    0
                                                    Реакторы молодцы [x]
                                                    Сейчас доделываю проект очень тесно завязанный на картографических сервисах и тоже разработал парочку своих ноу-хау. Так что стучитесь если что, будем опытом меняться)
                                                      0
                                                      Было бы клево узнать, как искать объекты в заданном радиусе? :)

                                                    Only users with full accounts can post comments. Log in, please.