Top-office11.ru

IT и мир ПК
1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Геокодирование списка адресов

Как «Дадата» находит адреса по координатам (и где мы взяли справочник)

Весной мы добавили в API DaData.ru фичу «Адрес по координатам», она же «Обратное геокодирование». Название прозрачно намекает: метод принимает геокоординаты и находит вагон данных об адресе.

Солидный продукт с той же функциональностью сделал «Яндекс» — он называется «Геокодер». Но сервис «Яндекса» бесплатен только для открытых некоммерческих проектов. Стандартный же тариф — от 120 000 ₽ в год — подходит не всем.

Мы подумали — если сделать бесплатную или недорогую альтернативу, разработчики наверняка скажут спасибо. И сделали, благо подготовили к тому времени сильные стартовые позиции:

  1. Справочник адресов с координатами, собранный и проверенный собственноручно.
  2. Готовое и отлаженное API.

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

Откуда берем данные и чем ищем по географическим объектам

Подступаясь к задаче, мы изучили готовые решения: где взять справочник координат с адресами и как потом искать по этому справочнику географические объекты. Оказалось, за нужными инструментами даже не придется далеко ходить.

Адресные объекты получаем из ФИАС — Федеральной информационной адресной системе. Это самый полный из открытых и официальных адресных справочников. Подробно о нем мы писали на «Хабре», а для этого материала важны четыре факта:

  • в ФИАС хранятся все адресные объекты страны, от регионов и ниже — до зданий и дополнительных территорий;
  • справочник свободно доступен в форматах DBF и XML;
  • ФИАС не идеален — в нем отсутствуют десятки тысяч домов и множество улиц, особенно новых;
  • каждому адресному объекту в справочнике соответствует уникальный ID — ФИАС-код. Код объекта иногда меняют, но для нашей статьи это не так важно.

Адресные объекты, загруженные из ФИАС вместе с ID, — основа нашего справочника для обратного геокодирования.

Координаты загружаем из OpenStreetMap (OSM). OSM — проект со свободной лицензией: энтузиасты собирают координаты всевозможных объектов и выкладывают для всех желающих.

Если по-простому, OSM — это набор точек, линий и полигонов на карте. У каждого объекта свое описание, тип и набор геокоординат.


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


Список источников публикуют на специальной странице в «Вики» проекта

Выгрузки состоят из PBF-файлов — этот формат используют вместо XML как более компактный. Превратить PBF в OSM XML ничего не стоит, с конвертацией справится куча одобренных сообществом утилит.

Для собственного справочника мы берем адресные объекты из ФИАС, а затем ищем их координаты в OSM. Если нашли, сохраняем объединенные данные. В итоге получаем такое пересечение ФИАС и OSM.

И все это замечательно, но есть одна проблема: с качеством данных в OSM дела обстоят непросто. Координаты объектов часто не соответствуют реальности.

Полигоны для регионов и районов адекватны. А для городов и ниже — уже не очень.

Поэтому основная работа, и с большой форой — это собрать из OSM адекватные данные и отсеять брак. Задача настолько объемная, что я отвел под нее в статье отдельный раздел.

Дома, которых нет в ФИАС, загружаем тоже из OSM. Выше я уже говорил, что в ФИАС отсутствуют десятки тысяч домов. Это даже не проблема, а просто реальность, фон. Поэтому мы пополняем свой справочник домами из OSM. Но только теми, для которых в ФИАС существует улица.

Разумеется, у пришедших из OSM зданий нет ФИАС ID. Поэтому мы идентифицируем их как ФИАС-код родителя + номер дома.

По справочнику ищем с помощью прекрасного Lucene — нашего многолетнего помощника. За наводку спасибо сведущему индийцу, написавшему пост Indexing Geographical Data With Lucene (хорошее дополнение — материал A dive into spatial search algorithms — о k-d-деревьях, на которых построен алгоритм поиска).

Как только мы узнали об у́дали Lucine, проблема с поиском решилась почти сама. Делов осталось — пройтись наждачкой.

  1. Загрузили в Lucene свой справочник координат и адресов, получили индекс. Для легкости убрали из него почти все, оставив лишь ID адресов и координаты.
  2. Наладили поиск по индексу: на вход — координаты, на выход — ID найденных адресных объектов. Другой информации поиск не возвращает, поскольку индекс мы донельзя скукожили.
  3. Насытили выдачу, загружая из «большого» ФИАС данные по найденным ID. Добавляем много всего, от нужного всем адреса одной строкой до признака столицы региона у городов.
  4. Придумали, как сортировать и отдавать полученные объекты.

Пока все выглядит просто, но это лишь малая часть работы. Никакого поиска адреса по координатам не получилось бы, не собери мы приличный справочник.

Как собрали базу координат и адресов

Для начала выложу багаж: прочитав статью, быстро сделать подобный справочник не получится. Мы собираем его с 2014 года, постоянно дополняя. Об этом чертовски длинном пути я и расскажу.

Самое сложное — это перебрать кординаты, которые пришли из OSM. На старте мы выверяли их как могли, в том числе руками. Главная цель тогда — получить опорные точки в крупных городах и сделать из них эталонный справочник. Теперь, когда точек опоры много, проверять новые данные вручную почти не приходится. За раз мы добавляем в эталонный справочник по 200 000–300 000 адресов с координатами. И вот как это делаем.

Формируем из OSM-тегов полные адреса́. В OSM-выгрузках составные части адресов хранятся как разные теги.

  • addr:city — *д. Булатниково*;
  • addr:street — *Центральная улица*;
  • addr:housenumber — *103*.

На следующем шаге нам понадобятся строки, поэтому пробегаем по тегам и собираем из них полный адрес.

Читать еще:  Типы адресов ячеек

Из тегов собираем строку д. Булатниково, Центральная улица, 103.

Прогоняем каждый адрес из OSM через сервис стандартизации «Дадаты». Он приводит адреса к единому формату «Как в ФИАС»:

  • исправляет опечатки;
  • расшифровывает сокращения вроде «НиНо» и «Мск»;
  • меняет старые названия на новые;
  • находит по индексу пропущенные в адресе города;
  • определяет ФИАС ID.

Адреса́ приходят от сервиса стандартизованными, хоть сейчас шли письмо или бандероль.

д. Булатниково, Центральная улица, 103

API стандартизации DaData.ru

142718, Московская обл, Ленинский р-н, с Булатниково, ул Центральная, д 103. a8b6a52f-e96d-4ec3-a0ff-641013ab0445

a8b6a52f-e96d-4ec3-a0ff-641013ab0445 — это ФИАС ID адреса.

Адреса́, которые не получилось сопоставить с ФИАС, «Дадата» помечает флажком. Их разбираем вручную, вариантов несколько.

  1. Адрес пришел не в положенных тегах выгрузки OSM, а черт знает где. Встречали и вовсе не заполненные адресные теги, и город в теге улицы, и еще много всего.
  2. В OSM лежит экзотический объект вроде детской площадки, вузовского футбольного поля или вовсе кладбища. В ФИАС ничего такого нет, да и для наших целей эти результаты не годятся. Такие объекты просто отсеиваем.
  3. Ошибка — и не ошибка вовсе. Например, из OSM пришел район города, которого в ФИАС нет. Или в ОSМ объект находится в населенном пункте, а в ФИАС этот населенный пункт присоединили к городу и удалили. Тогда мы допиливаем алгоритм под загруженные данные.


Распарсил выгрузку, а там — путаница в тегах

Стандартизованные дома, улицы и населенные пункты мы храним как одну точку. Для улицы и населенного пункта эта точка — центр. В итоге все адресные объекты лежат в одной таблице, внутри — адрес, ФИАС ID, широта и долгота.

Excel Store

Получение адреса и координат из Yandex и Google

Краткое описание

Новая версия макроса для Excel (VBA) для быстрого и удобного получения гео-координат/адресов из Yandex и Google. В качестве исходных данных на листе указывается список адресов (для получения координат) или список координат (для обратного геокодирования). Результаты запроса будут выведены в соседние ячейки.

Подробное описание

Некоторое время назад на сайте был опубликован макрос для получения координат из Yandex.
Несмотря на небольшой размер своего кода, макрос в удобном режиме позволяет по заданному списку адресов получать их geo-координаты (широту и долготу).

В текущей статье публикуем новый (доработанный) макрос для работы с координатами и адресами.

Изменения в новом макросе:

  1. Макрос может работать с API Яндекса и Гугла.
    Для работы с сервисом Яндекса используйте лист «yandex», для работы с Гуглом — лист «google». Предыдущая версия работала только с Яндекс.
  2. Из кода макроса исключен параметр KEY.
    Это значит, что теперь не нужно получать ключ разработчика для корректной работы макроса. Теперь всё работает без KEY. Разумеется, общие ограничения сервисов по прежнему имеют место — это около 25 000 запросов в сутки с одного IP. При необходимости узнать более подробно о действующих ограничениях, следуйте по ссылкам: лимиты для яндекса, лимиты для гугл.
  3. Добавлена возможность обратного геокодирования (определение адреса по долготе и широте).
    Для работы с обратным геокодированием необходимо соблюдать несколько важных нюансов, касающихся формата записи строки с координатами:
    — для Yandex координаты необходимо указывать в формате (через запятую, без пробелов): долгота,широта
    — для Google координаты необходимо указывать в формате (через запятую, без пробелов): широта,долгота
    В приложенном файле с макросом на соответствующих листах есть примеры как для Yandex, так и для Google.
  4. Добавлена статистика по количеству обработанных строк.
    Статистика начинает отображаться после запуска макроса. Наблюдать статистику можно в строке статус бара Excel.
  5. Типы переменных для работы с XML переименованы в Object.
    В предыдущей версии макроса типы были строго заданы как MSXML2.DOMDocument и MSXML2.IXMLDOMNodeList. Как следствие, возникали ошибки в процессе работы, если на ПК пользователя не было соответствующих библиотек «Microsoft XML».

Помимо указанных изменений, новый макрос содержит ряд других улучшений кода, в той или иной степени влияющих на корректность результата. По опыту, при тестировании макроса сервис Yandex показал более точный результат определения координат. Google, в свою очередь, показал более высокую скорость работы.

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

Альтернативная версия файла

Все, у кого есть API-ключи для Yandex/Google, могут скачать альтернативную версию данного макроса: ссылка.
Соответствующие настройки API-ключей указываются на листе «Настройки».
Специфику получения API-ключа для Yandex/Google чуть позже опишу в отдельном посте. Сейчас отмечу лишь, что для Yandex принципиально ничего не изменилось, а вот у Google с августа 2018 г. действуют новые условия получения API (необходимо регистрировать аккаунт Google Cloud Platform и привязывать к нему свою б/карту; после данных настроек суточный бесплатный лимит по-прежнему работает).

Как «Дадата» находит адреса по координатам (и где мы взяли справочник)

Весной мы добавили в API DaData.ru фичу «Адрес по координатам», она же «Обратное геокодирование». Название прозрачно намекает: метод принимает геокоординаты и находит вагон данных об адресе.

Солидный продукт с той же функциональностью сделал «Яндекс» — он называется «Геокодер». Но сервис «Яндекса» бесплатен только для открытых некоммерческих проектов. Стандартный же тариф — от 120 000 ₽ в год — подходит не всем.

Мы подумали — если сделать бесплатную или недорогую альтернативу, разработчики наверняка скажут спасибо. И сделали, благо подготовили к тому времени сильные стартовые позиции:

  1. Справочник адресов с координатами, собранный и проверенный собственноручно.
  2. Готовое и отлаженное API.
Читать еще:  Настройка адресной книги outlook 2020

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

Откуда берем данные и чем ищем по географическим объектам

Подступаясь к задаче, мы изучили готовые решения: где взять справочник координат с адресами и как потом искать по этому справочнику географические объекты. Оказалось, за нужными инструментами даже не придется далеко ходить.

Адресные объекты получаем из ФИАС — Федеральной информационной адресной системе. Это самый полный из открытых и официальных адресных справочников. Подробно о нем мы писали на «Хабре», а для этого материала важны четыре факта:

  • в ФИАС хранятся все адресные объекты страны, от регионов и ниже — до зданий и дополнительных территорий;
  • справочник свободно доступен в форматах DBF и XML;
  • ФИАС не идеален — в нем отсутствуют десятки тысяч домов и множество улиц, особенно новых;
  • каждому адресному объекту в справочнике соответствует уникальный ID — ФИАС-код. Код объекта иногда меняют, но для нашей статьи это не так важно.

Адресные объекты, загруженные из ФИАС вместе с ID, — основа нашего справочника для обратного геокодирования.

Координаты загружаем из OpenStreetMap (OSM). OSM — проект со свободной лицензией: энтузиасты собирают координаты всевозможных объектов и выкладывают для всех желающих.

Если по-простому, OSM — это набор точек, линий и полигонов на карте. У каждого объекта свое описание, тип и набор геокоординат.


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


Список источников публикуют на специальной странице в «Вики» проекта

Выгрузки состоят из PBF-файлов — этот формат используют вместо XML как более компактный. Превратить PBF в OSM XML ничего не стоит, с конвертацией справится куча одобренных сообществом утилит.

Для собственного справочника мы берем адресные объекты из ФИАС, а затем ищем их координаты в OSM. Если нашли, сохраняем объединенные данные. В итоге получаем такое пересечение ФИАС и OSM.

И все это замечательно, но есть одна проблема: с качеством данных в OSM дела обстоят непросто. Координаты объектов часто не соответствуют реальности.

Полигоны для регионов и районов адекватны. А для городов и ниже — уже не очень.

Поэтому основная работа, и с большой форой — это собрать из OSM адекватные данные и отсеять брак. Задача настолько объемная, что я отвел под нее в статье отдельный раздел.

Дома, которых нет в ФИАС, загружаем тоже из OSM. Выше я уже говорил, что в ФИАС отсутствуют десятки тысяч домов. Это даже не проблема, а просто реальность, фон. Поэтому мы пополняем свой справочник домами из OSM. Но только теми, для которых в ФИАС существует улица.

Разумеется, у пришедших из OSM зданий нет ФИАС ID. Поэтому мы идентифицируем их как ФИАС-код родителя + номер дома.

По справочнику ищем с помощью прекрасного Lucene — нашего многолетнего помощника. За наводку спасибо сведущему индийцу, написавшему пост Indexing Geographical Data With Lucene (хорошее дополнение — материал A dive into spatial search algorithms — о k-d-деревьях, на которых построен алгоритм поиска).

Как только мы узнали об у́дали Lucine, проблема с поиском решилась почти сама. Делов осталось — пройтись наждачкой.

  1. Загрузили в Lucene свой справочник координат и адресов, получили индекс. Для легкости убрали из него почти все, оставив лишь ID адресов и координаты.
  2. Наладили поиск по индексу: на вход — координаты, на выход — ID найденных адресных объектов. Другой информации поиск не возвращает, поскольку индекс мы донельзя скукожили.
  3. Насытили выдачу, загружая из «большого» ФИАС данные по найденным ID. Добавляем много всего, от нужного всем адреса одной строкой до признака столицы региона у городов.
  4. Придумали, как сортировать и отдавать полученные объекты.

Пока все выглядит просто, но это лишь малая часть работы. Никакого поиска адреса по координатам не получилось бы, не собери мы приличный справочник.

Как собрали базу координат и адресов

Для начала выложу багаж: прочитав статью, быстро сделать подобный справочник не получится. Мы собираем его с 2014 года, постоянно дополняя. Об этом чертовски длинном пути я и расскажу.

Самое сложное — это перебрать кординаты, которые пришли из OSM. На старте мы выверяли их как могли, в том числе руками. Главная цель тогда — получить опорные точки в крупных городах и сделать из них эталонный справочник. Теперь, когда точек опоры много, проверять новые данные вручную почти не приходится. За раз мы добавляем в эталонный справочник по 200 000–300 000 адресов с координатами. И вот как это делаем.

Формируем из OSM-тегов полные адреса́. В OSM-выгрузках составные части адресов хранятся как разные теги.

  • addr:city — *д. Булатниково*;
  • addr:street — *Центральная улица*;
  • addr:housenumber — *103*.

На следующем шаге нам понадобятся строки, поэтому пробегаем по тегам и собираем из них полный адрес.

Из тегов собираем строку д. Булатниково, Центральная улица, 103.

Прогоняем каждый адрес из OSM через сервис стандартизации «Дадаты». Он приводит адреса к единому формату «Как в ФИАС»:

  • исправляет опечатки;
  • расшифровывает сокращения вроде «НиНо» и «Мск»;
  • меняет старые названия на новые;
  • находит по индексу пропущенные в адресе города;
  • определяет ФИАС ID.

Адреса́ приходят от сервиса стандартизованными, хоть сейчас шли письмо или бандероль.

д. Булатниково, Центральная улица, 103

API стандартизации DaData.ru

142718, Московская обл, Ленинский р-н, с Булатниково, ул Центральная, д 103. a8b6a52f-e96d-4ec3-a0ff-641013ab0445

Читать еще:  Outlook адресная книга по умолчанию

a8b6a52f-e96d-4ec3-a0ff-641013ab0445 — это ФИАС ID адреса.

Адреса́, которые не получилось сопоставить с ФИАС, «Дадата» помечает флажком. Их разбираем вручную, вариантов несколько.

  1. Адрес пришел не в положенных тегах выгрузки OSM, а черт знает где. Встречали и вовсе не заполненные адресные теги, и город в теге улицы, и еще много всего.
  2. В OSM лежит экзотический объект вроде детской площадки, вузовского футбольного поля или вовсе кладбища. В ФИАС ничего такого нет, да и для наших целей эти результаты не годятся. Такие объекты просто отсеиваем.
  3. Ошибка — и не ошибка вовсе. Например, из OSM пришел район города, которого в ФИАС нет. Или в ОSМ объект находится в населенном пункте, а в ФИАС этот населенный пункт присоединили к городу и удалили. Тогда мы допиливаем алгоритм под загруженные данные.


Распарсил выгрузку, а там — путаница в тегах

Стандартизованные дома, улицы и населенные пункты мы храним как одну точку. Для улицы и населенного пункта эта точка — центр. В итоге все адресные объекты лежат в одной таблице, внутри — адрес, ФИАС ID, широта и долгота.

19.15. Геокодинг — из таблицы с адресами в слой с координатами¶

19.15.1. Введение¶

Допустим у вас есть электронная таблица с адресами но без координат, а вам нужно получить из неё слой с точками. Этот процесс называется геокодинг. В этой инструкции мы откроем файл xls, сконвертируем его в формат csv, откроем в NextGIS QGIS, геокодируем адреса, и вручную исправим не найденные координаты.

Для работы потребуется:

NextGIS QGIS.

Откройте электронную таблицу в Calc / Excel. Сохраните лист в формат csv в кодировке UTF-8 и с текстовыми значениями в кавычках. В десктопных Microsoft Excel нужный формат называется «CSV (UTF-8)».

В NextGIS QGIS установите плагин RuGeocoder.

В NextGIS QGIS: Веб –> RuGeocoder –> Конвертировать csv в shp

Рис. 19.137. У вас получится слой с точками, находящимися в 0 координат. ¶

Откройте таблицу атрибутов этого слоя, и проверьте правильность импортирования данных. Если в таблице данные битые, или отсутствуют, то сконвертируйте вашу таблицу в csv так, что бы выполнялись требования к формату в пункте 1.

В NextGIS QGIS: Веб –> RuGeocoder –> Пакетное геокодирование.

Слой, который будет геокодироваться.

Атрибут, в котором написан адрес.

Город, или регион (опционально)

После завершения работы, точки будут передвинуты на найденые адреса.

Выше был описан идеальный случай, в реальной жизни из-за несовершенства софта, вполне вероятно что что-то не заработает.

Если проблемы с преобразованием xls в слой QGIS, то есть альтернативный способ:

В XLS используя Calc или Excel добавить столбцы LAT и LON, запишите в них нули (или какие-нибудь другие координаты).

Сохраните XLS в CSV

В NextGIS QGIS Слой –> Добавить слой CSV. Откройте csv, настройте разделители так, что бы таблица атрибутов выглядела правильно (подробнее на http://docs.nextgis.ru/docs_ngqgis/source/map.html#csv). На вопросы о системе координат, всегда отвечайте EPSG:4326.

В NextGIS QGIS сохраните этот слой в формат GeoPackage.

Дальше используйте в «Пакетном геокодинге» этот слой в GeoPackage.

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

Если нашлось совсем мало адресов, то проще геокодировать вручную.

Получить слой с точками, как описано выше.

Инструментом Web –> RuGeocoder –> Панель быстрого геокодирования находить по одному адресу, и двигать.

© Copyright 2011-2020, NextGIS. Обновлено: 30-03-2020 19:53.

Geo2Tag

is an Open Source Location Based Services Platform

Обзор бесплатных сервисов геокодирования

На этой странице мы проведем обзор популярных сервисов геокодирования.

Google Geocoding

1) Подключаем Google Geocoding

2) Формат запроса, чтобы найти по названию объекта его координаты.

3) Обратная операция, по координатам найти объект.

4) Ответ приходит в виде json или xml. Подробнее об этом и в общем о Google Geocoding здесь: https://developers.google.com/maps/documentation/geocoding/intro?hl=ru
5) Важный фактор, что Google Geocoding работает только с google-картами.

Яндекс.Карты Геокодирование

Подробная документация с примерами здесь:

Эти примеры можно использовать прямо в браузере (ответ будет в xml).

Чтобы ответ пришел в виде json, нужно добавить format = json

Nominatim OpenStreetMap (http://wiki.openstreetmap.org/wiki/Nominatim)

Может использоваться как оффлайн сервис.

Ограничения: один запрос в секунду.

Поддерживаемые языки запросов: языки поддерживаемых стран (описанных в покрытии)

GEONAMES (http://www.geonames.org/about.html)

GEONAMES – географическая база.

Ограничения: 2000 запросов в час. Нужно создать аккаунт (в примерах используется тестовый аккаунт).

DATASCIENCETOOLKIT (http://www.datasciencetoolkit.org/)

Набор утилит для работы с данными, основанный на сервисах с открытым исходным кодом.

По умолчанию все запросы использует сервер http://www.datasciencetoolkit.org/ , но можно поднять свой сервер (на сайте есть инструкция с использованием vagrant http://www.datasciencetoolkit.org/developerdocs#setup).

Ограничения: скорее всего такие же как и у Nominatim OpenStreetMap, для Two Fishes описание ниже.

Покрытие: регионы из GEONAMES и улицы из OPENSTREETMAPS.

Политика использования: MIT и GPL лицензии.

Two Fishes geocoder (http://www.twofishes.net/)

Возможный оффлайн сервис, использует базу GEONAMES (описание и ссылки выше).

Ограничения: 100 запросов в секунду для прямого кодирования и 1000 запросов в секунду – для обратного.

Покрытие: как в GEONAMES.

OpenCage Geocoder (http://geocoder.opencagedata.com/)

API, такой же как и DATASCIENCETOOLKIT, использует различные сервисы с открытым исходным кодом для геокодирования, только более современный. Необходимо создать аккаунт (в примерах используется ключ от тестового аккаунта)

Покрытие: регионы из GEONAMES и улицы из OPENSTREETMAPS.

GISGRAPHY (https://github.com/gisgraphy/gisgraphy, http://www.gisgraphy.com/)

Возможный оффлайн сервис геокодирования, использует базу GEONAMES (описание и ссылки выше).

Ограничения:
Gisgraphy сервер (core I7, 4Gb of memory):

Ссылка на основную публикацию
Adblock
detector