Full Stack Developer
0,0
рейтинг
6 марта 2014 в 23:25

Разработка → Сравнение сервисов для автодополнения адресов в форме

Автодополнение адреса


На Хабре не раз поднимался вопрос автодополнения адресов в форме (раз, два, три).

Но вот и перед мной появилась задача реализовать такое автодополнение для небольшого интернет магазина. Критерии были такие:
  • Автодополнение адресов только Москвы
  • Автодополнение адреса одной строкой
  • Решение должно быть бесплатно (лимит запросов не менее 1000 в сутки)
  • Возможность подключить без дополнительных JS библиотек. (Я использую AngularJS Bootstrap-UI, в котором есть директива Typeahead, реализующая автодополнение формы)
  • Стопроцентный uptime не обязателен


Но какой источник данных выбрать? Я выбрал целых четыре, и решил их сравнить: в одном углу ринга заморские Google Geocode и Google Autococomplete, а в другом отечественные КЛАДР в облаке и DaData подсказки.

DISCLAIMER: Автор никак не причастен к разработчикам ни одного из представленных сервисов.


Google Geocode (Google Maps API)


Google Maps API

В примерах к плагину Typeahead в документации к AngularJS Boostrap UI использован именно Google Geocode для автодополнения адреса. Так почему бы не попробовать, если готовый код уже есть?
Делаем get запрос к адресу http://maps.googleapis.com/maps/api/geocode/json с параметрами
params: {
    address: val,
    sensor: false,
    language: 'ru'
}

В ответ получаем json, парсим его, и вроде всё неплохо. Вот только нам надо ограничить область поиска только Москвой. Добавляем:
components: 'country:ru|administrative_area:Moscow'

к параметрам и получаем интересное поведение:
Автодополнение через Google Geocode

Какую ахинею не ввёл бы пользователь, Google предложит «Москва, Россия». К тому же, название улицы он предлагает только после ввода третьей-четвертой буквы, а до этого все те же «Москва, Россия».
Можно ограничить результаты с помощью параметра 'bounds' (координаты юго-западного и северо-восточного угла рамки, внутри которой производить геокодирование), но это нестрогое ограничение, поэтому результаты будут появляться и из других областей.

Конечно, не стоит ожидать чудес от сервиса, который вообще не предназначен для автодополнения адреса, но все же резюмирую:
Надежный источник данных
Удобный способ запроса/доставки данных (запрос обычным GETом, обратно — JSON)
Возможно автодополнение одной строкой и даже разбивка полученных данных по компонентам (Страна, регион, город, улица, дом)

Тяжело ограничить область поиска
Сервис не предназначен для автодополнения

Попробовать (jsFiddle)

Google Autocomplete (Google Places API)


Google Places API


С Google Autocomplete у меня с самого начала не срослось: если запрашивать информацию обычным GETом, то гугловский сервер отвечает ошибкой CORS (Origin… is not allowed by Access-Control-Allow-Origin), а JSONP они не поддерживают после выхода третьей версией API. Некоторые говорят, что это сделано специально, чтобы в веб-разработке использовали их JS библиотеку. Конечно, можно еще сделать прокси, через который будут проходить данные, но я решил не заморачиваться ради такой мелочи.

Но для объективности сравнения, я все же попробовал Google Autocomplete через JS библиотеку. В итоге:
Надежный источник данных
Возможно автодополнение одной строкой
Легко подключить (если использовать их JS библиотеку)

Невозможно достучаться до API с фронтенда из-за CORS
Нельзя строго ограничить область поиска до одного города (Можно строго ограничить только страну, или нестрого ограничить с помощью параметра 'bounds')

Попробовать (jsFiddle)

КЛАДР в облаке


Кладр в облаке


КЛАДР в облаке — отечественный сервис, который не раз упоминали на хабре.
Лично для меня он оказался неподходящим, т.к. не позволяет производить автодополнение одной строкой. Вы можете искать или регионы, или города, или улицы, или номера домов, но никак не всё это вместе в одной строке. То есть или придется разбивать одну форму на несколько, или искать только по названиям улиц только в Москве.
Мне это не подходит, но сильные и слабые стороны я всё же приведу:
Авторитетный источник данных (КЛАДР)
Постоянные обновления базы данных
Российский разработчик
Хороший API
Открытый исходный код

Невозможно автодополнение одной строкой

Попробовать можно здесь

DaData подсказки


DaData.ru


Я уже отчаялся найти сервис своей мечты и собирался вернуться к Google Geocode, как вспомнил про подсказки сервиса DaData.

Сразу перейду к сравнению:
Возможно автодополнение одной строкой
При начале ввода первых букв улицы, он сразу предлагает и номера домов на этой улице
КЛАДР в облаке

Российский разработчик
Разбивка полученных данных по компонентам (даже индекс и код КЛАДР и ОКАТО)

Неизвестная база данных
Бесплатным пользователям не гарантируется стопроцентный uptime
Неочевидный формат запроса данных (POST, а не GET)
Скудный API

+ БОНУС: автодополнение еще и имён.

Но как организовать ограничение только по Москве? Я не придумал ничего лучше, как передавать 'Москва ' в начале параметра query. И это работает просто прекрасно:
  • При вводе улицы явно не в Москве ничего не находится
    КЛАДР в облаке
  • Даже, если пользователь введёт 'Москва' сам в начале запроса, всё равно всё находится
    КЛАДР в облаке


Попробовать (jsFiddle)

В итоге лично я решил остановиться на последнем варианте, заодно и воспользоваться их автодополнением имён. Правда я считаю, что у каждого свои задачи, и для каждой конкретной задачи нужен свой инструмент.
Если Вы используете сервис автодополнения адресов, то какой?

Проголосовало 363 человека. Воздержалось 649 человек.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Гусман @goooseman
карма
11,0
рейтинг 0,0
Full Stack Developer
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (55)

  • +1
    У dadata обычная база ФИАС. Из плюсов — пока бесплатные, быстро работает. Из минусов — не проверяются номера домов по той-же базе фиас-а, не совсем корректно работает с длинными улицами и пр. мелкие неудобства.
    • 0
      У нас база КЛАДР, но разница невелика, на самом деле :-) А что не так с номерами домов и улиц — можете привести пример?
      • 0
        Ну значит понятно, почему вы не проверяете номера домов на реальное существование). Например, не существует адреса «2-й рощинский проезд, 301. Длинные улицы тоже определяете не очень хорошо (5-ая улица Ямского поля дом дом 5, строение 1).

        Но вообще, уже начинаем интегрировать вас, лучше пока ничего не нашли…
        • 0
          «2-й рощинский проезд, 301» — так в подсказках и нет такого адреса. Вы, может быть, имеете в виду API стандартизации? Там мы действительно разрешаем отсутствующие в КЛАДР номера домов, так как что в КЛАДР, что в ФИАС есть далеко не все дома страны.

          «5-ая улица Ямского поля дом дом 5, строение 1» — да, с такими улицами есть некоторые проблемы как раз в стандартизации, работаем над этим.
          • 0
            Кодовые базы в подсказках и api различаются?
            • 0
              Да, это два разных продукта.
  • +24
    От всей команды «Кладра в облаке» скажу, что нам очень стыдно, что мы так безбожно затянули релиз поиска одной строкой. Ведь начали его делать уже более чем 4 месяца назад, а подготовленная база данных со всеми штуками и индексами давно уже на продакшене.
    Плюс у нас в тесте пачка других фич, но финально дотестить, вылезать все моменты и тп, ну, кому я это рассказываю, вы сами все понимаете. Наши любимые пользователи, прошу простить и понять :) скоро все будет! :)
    • 0
      Спасибо за ответ, будем ждать новостей)
  • +4
    В опросе не звучало «бесплатный», поэтому отвечу: используем 2Гис. Гемороя тоже достаточно, бывает возвращает не релевантные результаты, или дубликаты одного и того же адреса. Ну и платный он, к тому же не так уж и дешево.

    В связи с этим, сделали следующую схему: изначально поиск проходит по нашей базе данных (импортировано около 60 000+ адресов Питера, поиск только по этому городу необходим), все индексируется в ElasticSearch, поэтому скорость хорошая. Далее, если адрес не найден, производится попытка получения у 2Гис. В принципе, работает неплохо.
    • 0
      Но почему именно 2Gis? В чем его приемущество?
      • 0
        Это было требование заказчика, так что про приемущсество ничего не могу сказать.
  • +1
    А ещё есть OpenStreetMap и Nominatim — адресный поиск для него. Правда, я не пробовал использовать его именно как источник вариантов для автодополнения, но это вполне возможно — Номинатим возвращает массив, содержащий до десяти подходящих результатов. Среди возвращаемого есть и адрес одной строкой.

    Допустимая интенсивность использования, согласно Usage policy — не более одного запроса в секунду.
    • 0
      OSM кривоват немного.
      Когда я сводил воедино КЛАДР и OSM только — Левенштейн и спасал.
      Ну и не содержит он многие полезные данные (окато/октмо). Хотя дает для ОМК УМ, который даже не знаю где еще можно взять.
      Каждый раз когда слышу про эти автокомплиты и кладры в облаке — совесть мучает.
      Сам обладаю почти что самой полной базой данных, а АПИ не приделал (в том числе даже для себя)
      • 0
        При наличии терпения и свободного времени OSM вполне допиливается. Другой вопрос, найдутся ли терпение и время. И желание заодно.
        • 0
          Ок. Найдите мне все дороги в Москве.
          Но нет. Никто не ставит эти зависимости. 99% обьектов не имеют указание вложености.
  • +3
    В своих проектах испольую базу ФИАС и самописное приложение django-fias
    Это конечно не сервис, но вдруг кому пригодится.
    ЗЫ
    полнотекстовый поиск так же имеется
    • 0
      Спасибо за ссылку — посмотрю ваше приложение.
      Некоторое время назад тоже конвертировал (для проекта на django) БД ФИАС из dbf в PostgreSQL, но не всю а только для нужного региона — взамен устаревшему КЛАДРу, который использовался для автодополнения улиц.
      Хотел спросить — как вы обновляете БД — заново импортируете все с нуля, икрементно апдейты заливаете или еще как-то?
      База-то очень большая.
      Заранее спасибо!
      • +1
        Обновляется инкрементно, благо, налоговая соответствующее API предоставила.

        База действительно большая (сейчас где-то 1 200 000 записей — это только адреса. домов вообще не считал сколько) и процесс обновления не особо оптимизирован — одно из обновлений весит около 500 мб (76 или 77 версия) в архиве — оно у меня пол дня обновлялось.
  • +1
    Очень приятно начинать день с таких хороших постов про свой сервис, спасибо большое за настроение:)
    По поводу АПИ — мы активно работаем и развиваем его, скоро появится много нового как с точки зрения функционала, так и с точки зрения взаимодействия. Вдобавок, мы внимательно слушаем все отзывы, если хотите видеть что-то определённое — пишите!
    В БД используется КЛАДР.
    • 0
      Всегда пожалуйста, тем более это я Вам должен говорить спасибо за хороший продукт.
      Хочу видеть ограничение области поиска по области/городу. В идеале, чтобы можно было ограничить несколькими областями (например Москва/МО + Санкт-Петербург/Ленобласть)
      • 0
        Сделали! Можно накладывать одиночные условия (регион, город, населенный пункт) или их комбинации. По кодам КЛАДР тоже можно ограничивать.

        Вот демо-страница и исходные коды примера.
  • –2
    Заинтриговал критерий
    100%й uptime не обязателен

    Что за сервис у вас такой?
    • 0
      99% уже не 100%, но считается нормой, так что я думаю имелось ввиду это.
      • –2
        У кого считается?
    • +1
      Интернет магазин. Я думаю, Вы согласитесь, что автодополнение адреса в интернет магазине — вещь приятная, но вовсе необязательная. И если вдруг uptime будет процентов даже 95%, ничего страшного не произойдет, пользователь и сам введёт адрес.
      • –1
        Нет, не соглашусь.
        Если по вине сервиса сорвется оформление, то уж лучше пусть не будет такого сервиса, чем 95% uptime.
        99.5 — это еще можно пережить.
      • 0
        95%?
        Т.е. вы считаете нормальным, что ваш интернет магазин не будет работать ежедневно 1 час и 12 минут?
        • +1
          Я же не про магазин, а про то, что автодоплнение может и не работать. Магазин будет работать.
          • –2
            Не очень понятно, почему искалось именно такое дополнение, которое может работать, а может и не работать. Не лучше сразу стремиться к тому, чтобы все работало без сбоев?
            Потом, в случае отключения автозаполнения, нужно продумывать дублирующий интерфейс — опасный путь. На этапе оформления крайне желательно максимально упростить и обеспечить безотказность, иначе, велик риск потери клиента. А клиент, начавший оформление — это совсем не просто посетитель, он дорогого стоит.
  • 0
    primepix, у вас последняя версия базы ФИАС, как часто обновляете ее? Мы столкнулись что по КЛАДРу который на сайте ФНС и у вас в сервисе получается разный код КЛАДР.
    • 0
      не хватает параметра отсеивания устаревших адресов (с 01 на конце), можно конечно и самим отфильтровать, но приятно получить из коробки да и меньше таскать данных =)
      • 0
        Это было реализовано в последнем обновлении, так что сейчас это должно работать как вы описали.
        При этом, точный запрос по коду даже устаревшему (с 01 и тп на конце) вернет данные об объекте, но поиск по названию их проигнорирует
        • 0
          хорошо, почитаю доку еще раз.
    • 0
      В районе 20 февраля.
      Напишите нам по почте или в личку — разберемся.
      • 0
        попозже обязательно вышлю пример.
  • НЛО прилетело и опубликовало эту надпись здесь
    • 0
      Я использую плагин Lazarus Form Recovery в своём браузере. Он запоминает все формы на сайте, и, если что, их можно восстановить, нажав на этот анкх.
  • +1
    goooseman, спасибо за обзор! А можете пояснить свою мысль? Чем у DaData неочевиден POST и в чем скудность API? Мы будем рады сделать его более удобным :-)

    Кстати, помимо подсказок у нас есть стандартизация и проверка телефонов и email. Ее тоже можно вызывать на клиенте, вот пример. Удобно для валидации форм.
    • 0
      Нет общественных мест (аэропорты, кафе, театры и т.д.). У Google Geocode они есть
      • 0
        Это сложно причислить к скудности API, скорее проблемы базы, которую мы используем. Но спасибо :-)
    • 0
      Большинство сейчас используют GET, и я сначала пытался достучаться GETом, пока не почитал документацию) Хотя это не так уж и важно.

      Скудность API:
      • Нет возможность ограничить область поиска через параметры. (хотелось бы, например, ограничить только Москвой и МО). Добавлять 'Москва' в query — костыль.
      • Нет возможности указать типы мест, которые надо искать
      • Нет возможности ограничить кол-во объектов (хотя это уже можно сделать и на клиенте)
      • Нет возможности возврата объекта без родительских (Вводишь 'Мантулинская' и получаешь 'ул. Мантулинская', а не 'Россия, г. Москва, ул. Мантулинская'

      Хотя лично мне, как и многим это всё не надо, ну кроме области поиска.
      • 0
        Ага, теперь понятно, спасибо.

        Ограничение области поиска сделаем обязательно в ближайшие пару месяцев.

        Объект без родительских удобно настраивать на клиенте, как мне кажется (пример есть на той же демо-странице).

        Количество возвращаемых объектов — да, хорошая мысль, возможно, вынесем в API.

        А типы мест — что это? Искать только города или только улицы?
        • 0
          Типы: Области, города, улицы, номера домов.
          Да, я помню этот пост, и понимаю, что вы против разделения формы адреса на несколько по компонентам. Но некоторым это необходимо.

          К тому же иногда требуется, например, только город.
  • 0
    А почему в списке нет Один из сервисов Геокодирования Yandex.Карт
    Я бы наверное его использовал бы с связке с chosen )
    • +2
      Спасибо за наводку, попробовал. Вот только как-то странно работает:

      Попробовать
      • 0
        Да, согласен, не ожидал, вот я чуток поправил, но все равно не то что надо((

        • 0
          Зато есть данные о водоёмах, трассах и даже заповедниках (только весьма странные)


          Может кому и пригодится.
  • 0
    Спасибо за статью! Видно, что проделана большая работа!

    Хотелось бы отметить, что подсказки дадата — это большее, чем просто ввод адреса. Уже сейчас для введенного адреса можно получить площадь квартиры и индекс, а в будущем будут еще геокоординаты, станции метро и прочая полезная информация об адресе.
    • 0
      Индекс я увидел, но где посмотреть данные о площади квартиры? Вроде есть поля settlement и settlement_type, но они пустые, какой бы я дом не ввел.
      • 0
        Это, к сожалению, пока через одно место сделано — нужно дернуть API dadata dadata.ru/api и передать ему адрес, тогда вернется площадь квартиры
        В апреле сделаем все в рамках текущего API
      • 0
        Площадь квартиры добавили в апреле, а теперь еще и код ИФНС.
  • 0
    Только что заметил странное поведение Google Place Autocomplete — поиск по России и вне ее происходит по-разному:
    1) Ищем по России. Например, «Нижний Новгород».
    Результат — «Россия, Нижегородская область, Нижний Новгород», порядок такой: Страна, Регион, Город
    2) Ищем вне России, «Атырау»
    Результат — «Атырау, Атырауская, Казахстан», то есть порядок другой: «Город, Регион, Страна»
    3) Пробуем еще вне России, «Киев»
    «Киев, город Киев, Украина»

    Баг это или нет, не понятно, пока нагуглить на эту тему не получилось.
    Возможно, связано с текущей локацией — откуда идет запрос. Но имхо порядок должен быть всегда одним и тем же.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.