Ariadna. Open Source геокодер для данных

Andrew Minkin
Jan 17, 2017 · 4 min read
Image for post
Image for post

Процесс создания геокодера на основе ElasticSearch, который ищет координаты по синонимам и по названиям заведений, ищет перекрестки и адреса в определенном радиусе, а также умеет делать реверс геокодинга и автоматически пополняется новыми данными от водителей. Репозиторий доступен по ссылке:

Предыстория

Когда мы проектировали геокодер для нужд Namba-Taxi мы столкнулись с недостатком важных данных.

Чего у нас не было:

  • Полной карты от Яндекса, Google или 2GIS
  • Доверия к GPS данным

Что у нас было:

  • Очень разношерстные данные на входе
  • Мы кое-где использовали Openstreetmap
  • Своя накопленная база адресов с координатами

Что операторы могли вводить?

Операторы могли вводить адреса в разных форматах:

  • Улица дом;
  • Перекресток;
  • Название заведения;
  • Название точки;
  • Микрорайон дом;
  • Микрорайон улица дом.

И таких вариантов очень много, например:

  • Киевская 28
  • Киевская Советская
  • 5–42
  • 5 микрорайон советская 42
  • ЦУМ
  • кафе у Ашота
  • шлагбаум

Проектирование

Был заложен следующий алгоритм:

  1. Сначала получаем геометрию по крупным населенным пунктам(города, столицы, деревни, жилые массивы);
  2. Выгружаем все возможные адреса и соотносим их к нужному жилому массиву, городу и другому населенному пункту, выставляя нужное значение;
  3. Выгружаем все дороги;
  4. Ищем пересечение дорог;
  5. Кладем все в индекс;
  6. Ищем.

Реализация

Учитывая то, что основной источник данных у нас это OSM, то фильтры для того, чтобы получить данные у нас такие:

  1. place=city,place=village,place=suburb,place=town,place=neighbourhood — для получения всех микрорайоны
  2. addr:street+addr:housenumber,amenity,shop,addr:housenumber — для получения адресов и названий заведений
  3. highway — для получения всех дорог

Встали сложности с поиском англоязычных названий на русском языке. Как пробовали это решить:

  1. Простая автоматическая транслитерация в русский. В итоге получалось абсурдной и не корректной. Пример конвертации данных был таким: City House -> Цити Хоусе
  2. Получение транскрипции слова и уже ее транслитерация. Получилось что-то вроде Adrenaline rush -> Эрденалин Рэш. Сносно, но нужен русский акцент, типа адреналин раш. Не подходит.
  3. Автоматическая транслитерация всех данных, с применением словаря замен. Подошел именно такой механизм. Все-таки простая транслитерация работает сносно. В итоге, словарь наполнился в принципе быстро через несколько прогонов на данных.

С этим разобрались к этому моменту мы уже получаем данные, которые:

  1. Нормализированы и приведены к русскому языку;
  2. Адреса приведены к формату — страна, город, село или поселок, микрорайон или жилой массив, улица, дом

Следующая часть квеста — найти пересечения дорог. Сделали ее по быстрому и получили очень медленную реализацию, сложностью O(n²). Как временный выход использовал Postgres+postgis для нахождения пересечений, пока не нашел хорошего алгоритма для поиска пересечений.

В итоге получился хороший парсер данных с OSM, который кладет данные в ElasticSearch. Который получил простое название importer.

Автоматизация

Учитывая то, что постоянно выкачивать и создавать индексы в ElasticSearch в скоре надоело, появился компонент updater. Появилась также автоматическая конфигурация в JSON формате.

Процесс выкачивания файла и импорт его в ElasticSearch автоматизировался. Плюс к этому появилась возможность обновлять данные в ElasticSearch без даунтайма, благодаря алиасам.

Как это работает:

  1. Updater качает файл;
  2. Узнает текущую версию индекса с конфига;
  3. Инкрементит версию и создает новый индекс;
  4. Заполняет его данными;
  5. Меняет алиасы;
  6. Удаляет старый индекс.

Получил такие бенефиты от этого:

  1. Пишем конфиг;
  2. Запускаем ./ariadna update;
  3. Идем пить кофе;
  4. Получаем готовый настроенный индекс.

Также для удобства прикрутил простой вебинтерфейс с картой и возможностью поиска.

Автоматическое пополнение данными

Помимо ОСМ у нас еще есть много водителей и операторы, которые забивают заказы. Соотвественно у нас есть имя и координаты Сделана такая схема:

  1. Треки водителей хранятся в индексе drivers_data;
  2. Данные с ОСМ хранятся в индексе osm_data;
  3. Объединены они через алиас addresses по которому и происходит поиск адресов.

Данные от водителей заносятся, если у нас погрешность в определенных координатах больше, чем 200 метров.

Итого

Что умеет геокодер Ariadna?

  1. Искать координаты по синонимам. например ШВК — ШампанВинКомбинат;
  2. Умеет искать адреса в определенном радиусе (например для себя с сделал поиск адресов в 30 км от центра города);
  3. Искать по названию заведений (кафе у Ашота например);
  4. Искать перекрестки;
  5. Искать адреса в микрорайонах и жил массивах;
  6. Делать реверс геокодинг;
  7. Автоматически пополнятся новыми данными от водителей;
  8. Реверс геокодинга.
Поиск по адресам на Ariadna
Поиск по адресам на Ariadna
Поиск по адресам
Реверс геокодинга на Ariadna
Реверс геокодинга на Ariadna
Реверс геокодинга

Из каких компонентов состоит геокодер:

  1. Импортер данных;
  2. Апдейтер данных;
  3. Веб интерфейс.

Минусы

  1. Протестирован только для Кыргызстана;
  2. Нет демки (Хотя работу его можете увидеть в приложении Namba-Taxi, когда мы определяем ваш адрес по местоположению);
  3. Нет поддержки всех схем адресации.

Поэтому будем рады, если кто-нибудь поможет его допилить и для хорошего поиска по другим странам и городам.

Если кому-то проект показался интересным, то мы не против любой критики, пул реквестов, issues на гитхабе и фидбека в целом.

Mad Devs Blog — Custom Software Development Company

Engineering your growth. Mad Devs is the team behind large scalable projects, globally.

Andrew Minkin

Written by

Mad Devs Blog — Custom Software Development Company

Mad Devs is a Cambridge-headquartered IT company developing enterprise-level software solutions for finance, transportation & logistics, security, edtech, and advertising industries. For more information about us, please browse our website: https://maddevs.io/

Andrew Minkin

Written by

Mad Devs Blog — Custom Software Development Company

Mad Devs is a Cambridge-headquartered IT company developing enterprise-level software solutions for finance, transportation & logistics, security, edtech, and advertising industries. For more information about us, please browse our website: https://maddevs.io/

Medium is an open platform where 170 million readers come to find insightful and dynamic thinking. Here, expert and undiscovered voices alike dive into the heart of any topic and bring new ideas to the surface. Learn more

Follow the writers, publications, and topics that matter to you, and you’ll see them on your homepage and in your inbox. Explore

If you have a story to tell, knowledge to share, or a perspective to offer — welcome home. It’s easy and free to post your thinking on any topic. Write on Medium

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store