- PVSM.RU - https://www.pvsm.ru -
Всем привет!
Совсем недавно я закончил делать геокодер для своих целей Ariadna [1]
Под катом рассказ о том, зачем я его делал и что он умеет.
В статье не будет ни строчки кода на Go. Зато будет полное описание работы геокодера и проблем, с которыми я встречался. А код можете посмотреть на гитхабе.
Я работаю в одной из бишкекских служб такси, что в Кыргызстане. Решили мы пооптимизировать нахождение координат по адресу для более оптимального распределения заказов.
Чего у нас нет:
Что у нас есть:
Пользователи могут вводить адреса в разных форматах:
И таких вариантов очень много, например
Киевская 28
Киевская Советская
5-42
5 микрорайон советская 42
ЦУМ
кафе у Ашота
шлагбаум
И так далее
Сделать геокодер, который бы умел принимать любые данные на вход и отдавать им координаты
Язык поиска — только русский.
Перед тем, как делать свой велосипед я решил поресерчить решения, которые уже есть.
Были:
Чем не устраивал номинатим, который у нас был:
Чем понравился Pelias:
В итоге решил отказаться от всех трех геокодеров и сделать свой инструмент по нескольким причинам:
Был заложен следующий алгоритм:
Для реализации я выбрал Go, учитывая проекты типа pbf2json [5], golang-geo [6] и многих других для обработки геоданных. Также хотелось покачать скилл именно в нем.
С получением и парсингом данных с осм вроде разобрался. Для жилых массивов используем теги place=city,place=village,place=suburb,place=town,place=neighbourhood для фильтрации. Для получения адресов, зданий addr:street+addr:housenumber,amenity,shop,addr:housenumber
Все дороги можно получить с помощью тега highway
Встали сложности с поиском англоязычных названий на русском языке. Как пробовал это решить:
С этим разобрались к этому моменту мы уже получаем данные, которые:
Следующая часть квеста — найти пересечения дорог. Сделал ее по быстрому и получил очень медленную реализацию, сложностью O(n^2). Как временный выход использую Postgres+postgis для нахождения пересечений, пока не нашел хорошего алгоритма для поиска пересечений.
В итоге получился хороший парсер данных с осм, который кладет данные в ElasticSearch. Который получил простое название importer
Учитывая то, что постоянно выкачивать и создавать индексы в эластиксерче в скоре надоело, появился компонент updater. Появилась также автоматическая конфигурация в JSON формате.
Процесс выкачивания файла и импорт его в elastic search автоматизировался. Плюс к этому появилась возможность обновлять данные в эластиксерче без даунтайма, благодаря алиасам.
Как это работает:
Получил такие бенефиты от этого:
Также для удобства прикрутил простой вебинтерфейс с картой и возможностью поиска.
Помимо ОСМ у нас еще есть много водителей и операторы, которые забивают заказы.
Соотвественно у нас есть имя и координаты
Сделана такая схема:
Данные от водителей заносятся, если у нас погрешность в определенных координатах больше, чем 200 метров.
Получился геокодер который умеет:
Состоит из трех компонентов:
Поэтому надеюсь кто-нибудь поможет его допилить и для хорошего поиска по другим странам и городам.
Если кому-то проект показался интересным, то я не против любой критики, пул реквестов, issues на гитхабе и фидбека в целом.
Автор: Gen1us2k
Источник [7]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/poisk/112028
Ссылки в тексте:
[1] Ariadna: https://github.com/gen1us2k/ariadna
[2] Pelias: https://github.com/pelias/pelias
[3] Nominatim: https://github.com/twain47/Nominatim
[4] Photon: https://photon.komoot.de/
[5] pbf2json: https://github.com/pelias/pbf2json
[6] golang-geo: http://github.com/kellydunn/golang-geo
[7] Источник: https://habrahabr.ru/post/277043/
Нажмите здесь для печати.