Как наладить поиск адреса по координатам (и где взять нужный справочник)
Весной мы добавили в API DaData.ru фичу «Обратное геокодирование», она же «Адрес по координатам». Название намекает: метод принимает геокоординаты и отдает данные об адресе.
Солидный продукт с той же функциональностью предлагает «Яндекс» — он называется «Геокодер». Но сервис «Яндекса» бесплатен только для открытых некоммерческих проектов. Стандартный же тариф — от 120 000 ₽ в год — подходит не всем.
Мы подумали — если сделать бесплатную или недорогую альтернативу «Геокодеру», разработчики наверняка скажут спасибо. И сделали. В статье расскажу, как устроен «Адрес по координатам»: как мы наладили поиск, собрали справочник и упаковали в готовый метод.
Где берем данные и чем ищем адрес
Подступаясь к задаче, мы изучили готовые решения: где взять справочник координат с адресами и как потом искать по этому справочнику географические объекты. Оказалось, за нужными инструментами даже не придется далеко ходить.
Адресные объекты берем в ФИАС — Федеральной информационной адресной системе. Это самый полный из открытых и официальных адресных справочников. Подробно о нем мы уже писали на «Хабре», а сейчас важны четыре факта:
Координаты загружаем из OpenStreetMap (OSM). OSM — проект со свободной лицензией: энтузиасты собирают координаты всевозможных объектов и выкладывают для всех желающих.
Если по-простому, OSM — это набор точек, линий и полигонов на карте. У каждого объекта свое описание, тип и набор координат. Данные OSM для России лежат по адресам needgeo.com, osm.sbin.ru/osm_dump/ и osmosis.svimik.com/latest/.
Список источников публикуют на специальной странице в «Вики» проекта
Выгрузки состоят из 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-деревьях, на которых построен алгоритм поиска).
Как только мы узнали об у́дали Lucene, проблема с поиском решилась почти сама. Делов осталось — пройтись наждачкой.
Как собрали базу координат и адресов
Для начала выложу багаж: прочитав статью, быстро сделать подобный справочник не получится. Мы собираем его с 2014 года, постоянно дополняя. Об этом чертовски длинном пути я и расскажу.
Самое сложное при составлении справочника — перебрать кординаты, которые пришли из OSM. На старте мы выверяли их как могли, в том числе руками. Главная цель тогда — получить опорные точки в крупных городах и сделать из них эталонный справочник. Теперь, когда таких точек много, проверять новые данные вручную почти не приходится. За раз мы добавляем в эталонный справочник 200 000–300 000 адресов с координатами, и вот как это делаем.
Формируем из OSM-тегов полные адреса́. В OSM-выгрузках составные части адресов разбросаны по разным тегам:
Прогоняем каждый новый адрес через API стандартизации «Дадаты». Сервис приводит адреса к единому формату «Как в ФИАС»:
142718, Московская обл, Ленинский р-н, с Булатниково, ул Центральная, д 103.
Адрес | ФИАС ID | Широта | Долгота |
---|---|---|---|
142718, Московская обл, Ленинский р-н, с Булатниково, ул Центральная, д 103 | a8b6a52f-e96d-4ec3-a0ff-641013ab0445 | 55.558773 | 37.667103 |
119034, г Москва, пер Турчанинов, д 6 стр 2 | 8c925e61-9173-48b3-999e-dc85c86d89e7 | 55.737096 | 37.597190 |
Разбираем адреса, которые «Дадата» не стандартизовала. Адреса́, которые не получилось сопоставить с ФИАС, сервис помечает флажком. Их проверяем вручную, вариантов здесь несколько.
Проверяем, насколько адекватны загруженные координаты. Для этого специальной утилитой смотрим, попадают ли координаты нового объекта в полигон родительского региона или района. Если адрес сообщает, что объект находится в Омской области, будь добр по координатам попадать в ее полигон. Вхождения в город не требуем — не все города точно освещены в OSM, для многих данные не обновляют.
Эталонные полигоны мы загружаем из OSM и храним как есть — в формате GeoJSON. Чтобы выбрать, к какому полигону примерить точку, смотрим в отдельную таблицу. В ней мы сопоставили префиксы КЛАДР-кодов и ID полигонов: находишь для адреса КЛАДР-код и видишь, какой полигон выбрать.
КЛАДР-код — это уникальный идентификатор, который использовали еще до появления ФИАС. Находить этот код для адреса умеет миллион сервисов
Утилита разрешает объекту отстоять от положенного полигона на 1 700 метров. Это правило добавили из-за шоссе, которые часто выходят за границы региона. Но расстояние больше 1 700 метров — признак ошибки, так говорит статистика.
На этом для городов и улиц проверка заканчивается.
Еще раз, построже, проверяем загруженные координаты домов. В дело снова вступает упомянутая утилита, и вот что она делает.
Проверку проходят только дома, которые удалены от надежных коллег не более чем на 150 метров. Причем каждый новый одобренный дом мы учитываем при разборе следующих. Вот как это работает.
Допустим, в эталонном справочнике хранятся дома № 1, 2 и 3 по улице Коммунаров. В новых данных пришли дома № 5, 6 и 7 по той же улице. Судя по координатам, новые дома стоят рядом. Утилита видит, что дом № 5 находится рядом с домами № 1, 2 и 3 и добавляет его в эталонный справочник. Значит, дома № 6 и 7 тоже проходят проверку.
А дальше решается судьба пришедших из OSM данных:
В первой таблице — все объекты c ФИАС ID до домов: регионы, населенные пункты, улицы. Во второй — дома́ и ссылка на родителя из первой таблицы
Две таблицы нужны, чтобы назначить ключи отсутствующим в ФИАС домам. У них нет собственного ФИАС-кода, поэтому делаем вот как:
Справочник готов, осталось протестировать. За ночь прогоняем сервис по функциональным тестам и тестируем производительность. Скорость проверяем на Москве, запрашивая все дома в радиусе трех километров. Чтобы уж наверняка. Конечно, обложили все автотестами.
Главное после обновления — чтобы не стало хуже.
Обратное геокодирование глазами пользователя
На вход метод принимает три параметра: координаты, количество результатов и радиус поиска. Радиус по умолчанию — 100 метров, максимальный — километр. Точное значение задают в настройках.
Обратно метод возвращает найденные объекты: дома, улицы и населенные пункты. При этом сортирует их по убыванию точности.
После всех этих рокировок метод наконец-то возвращает объекты, которые нашел.
Внутри — много разного о найденных объектах: строки с полным и сокращенным адресом, актуальное и устаревшие названия, почтовый индекс, ФИАС-код родительского объекта и так далее.
Все данные, которые отдает метод — в документации
Покрытие по координатам для разных регионов разное, вот так с домами:
Уже думаем, что добавить к методу: разрешить фильтрацию по типам объектов, возвращать расстояния до заданной точки, еще что-нибудь. Следим за спросом и решаем, вкладывать ли силы.
А в остальном все уже на проде. До 10 000 запросов в сутки — бесплатно, больше — по подписке от 5 000 ₽ в год. Если нужны адреса по координатам для коммерческого проекта, а «Геокодер» слишком дорог — попробуйте API «Дадаты».
Оригинал статьи опубликован в блоге HFLabs.
Координаты Google
Предлагаем воспользоваться аналогичным сервисом от Яндекса — найти координаты
Здравствуйте, уважаемые друзья портала u-karty.ru!
Заполните форму поиска Google Maps — ввести город, улица, номер дома. Наберите через пробел название любого географического объекта. Или самому переместить метку в нужное место, и осуществить поиск (нажать «Найти») по координатам объекта на карте Гугл. Подобный поиск уже применяли, когда искали в Краснодаре улицы и районы. Воспользуйтесь изменением масштаба схемы (искомый масштаб появится в третьем поле сверху), чтобы подробнее рассмотреть местоположение дома на улице.
Как вы могли заметить, при перемещении метки на схеме, изменяются географические параметры. Получаем своеобразную карту с широтами и долготами. Ранее мы уже занимались определением координат на карте Яндекс
Используя метод от обратного, каждый сможет по известным параметрам осуществить поиск по координатам в Гугле. Вместо географического названия объекта, заполняем форму поиска известными координатами. Сервис определит и покажет на карте точное географическое местоположение улицы, района.
Интересные места в Google Maps — онлайн тайны со спутника
Зная адрес любого города мира, легко определяется широта и долгота Вашингтона и Сантьяго, Пекина и Москвы. Схема г. Саратова с номерами домов и улиц доступна как гостям города, так и местным жителям. Уверены, вы уже смогли освоить данный инструмент на странице, по умолчанию на карте находится центр столицы России — город Москва. Нашли свою широту и долготу на карте по адресу — геолокация месторасположения
Мы же предлагаем узнать тайны сервиса Maps Google онлайн. Спутник не пролетит мимо интересных исторических мест, каждое из которых популярно в определенной части земного шара
Ниже вы сможете сами убедиться в том, что данные интересные места земли заслуживают особого внимания. И сервис Google Maps Спутник с удовольствием предлагает найти и увидеть самые известные географические тайны мира. Считаем, что жителям Самарской области будет также интересно. Как выглядит Автозаводский район Тольятти — они уже знают
Вам не надо определять их географические координаты и искать нужные карты Гуглы сервиса. Достаточно скопировать любые параметры из списка ниже — широту и долготу (CTRL+C)
К примеру, будем смотреть со спутника (перейти на тип схемы «Спутник») крупнейший стадион мира и Бразилии — Маракана ( Рио-де-Жанейро, Maracana). Копируем широту и долготу из списка ниже:
Сохранить в закладки в любом браузере — CTRL+D
Приглашаем поделиться списком со своими друзьями!
Благодарим за предоставленные данные сервис Google Maps
Web-геосервисы. Обзор современных решений
В рамках практически любого онлайн-продукта можно встретиться с задачей, которая требует применения того или иного сервиса, связанного с картами, геокодированием, гео-позиционированием. Лично я уже почти 10 лет работаю над онлайн-каталогом недвижимости, а также в рамках ряда других проектов есть опыт использования специфичных функций различных онлайн гео-сервисов.
В этой статье я рассмотрю гео-задачи, которые наиболее часто встают перед программистами, сделаю небольшой обзор сервисов, предлагающих решения для этих задач, и поделюсь опытом использования этих сервисов.
Также рассчитываю на участие комментаторов — если заметите в обзоре неточность в описании, отсутствие вашего хорошего сервиса или вам просто есть что добавить к уже написанному — пишите в комментариях, я буду собирать всё в основной текст, чтобы на будущее всегда иметь под рукой хороший список инструментов на все случаи жизни.
Оглавление
Отображение карт на сайте
Очень популярная задача — это отображение на сайте онлайн-карт. Например, чтобы показать, в каком точно месте на карте находится ваш офис. Или где можно забрать вещь, которую продает автор объявления.
Для отображения карт используются два основных вида API:
Javascript API
Javascript API позволяет показать на сайте интерактивную карту с возможностью изменения масштаба, отображения маркеров, взаимодействия с картой (перетаскивание маркеров, отображение всплывающих подсказок и прочее).
Javascript API Яндекс.Карт
Javascript API Google Maps
2ГИС API
Azure Maps
MapBox
Static API
Статичное API может быть использовано там, где вам нужно показать просто картинку карты, без интерактива. Например, вы хотите приложить карту к электронному письму, или дать возможность пользователю распечатать схему проезда к вам. Ну или ваш дизайнер нарисовал макет, в котором вместо фона используется карта — грузить для такой задачи полноценные JS карты выглядит избыточным. Также статичную картинку можно использовать как превью для ускорения загрузки страницы у пользователя — а по клику делать её интерактивной.
Static API Яндекс.Карт
Static API Google maps
2ГИС Static API
MapBox
Геокодирование
Геокодирование — процесс, который позволяет узнать координаты объекта по его адресу. Ну или обратное геокодирование — по координатам узнать, что за гео-объект там находится. Фактически все сервисы геокодирования работают с адресами, введенными в произвольном формате, заодно приводя их к своему стандарту. Полностью бесплатных сервисов геокодирования на рынке в данный момент я не нашел.
Типичные применения геокодирования — отобразить на карте введенный пользователем адрес, или наоборот (обратное) — пользователь поставил на карте метку, нужно её превратить в адрес.
Геокодер Яндекс.Карт
«Подсказки» от DaData
Google Maps Geocoding API
GraphHopper
MapBox
OpenStreetMaps Nominatim
Разбор и автодополнение адресов
Иногда бывает нужно дать пользователю ввести адрес в произвольном формате, а потом превратить этот адрес в структурированные данные — отдельно название страны, региона, города, улицы и номер дома. Это нужно всем сервисам, которые работают с недвижимостью, это нужно для определения дублей адресов, для заполнения почтовых квитанций и т.д.
В принципе, с этой задачей без проблем справляются все сервисы геокодинга из списка выше. При прямом геокодинге кроме координат они также возвращают и структурированную информацию о найденном гео-объекте.
Кроме того, к этом разделу я отношу также задачи поиска дополнительной информации об адресе. В частности это определение, к какому району города относится указанный адрес, и поиск ближайших станций метро — важные задачи, если мы делаем поиск объявлений по адресам.
Определение района в рамках города
Если не хотите зависеть от стороннего сервиса — есть другое решение, которое я применял и продолжаю применять до сих пор. Это определение района по коду ОКАТО адреса. У каждого адреса в рамках России есть свой код ОКАТО — 11 цифр. Из них первые 5-8, в зависимости от города, однозначно указывают на район.
Я для тех городов, которые мне нужны, просто составил базу кодов ОКАТО для районов, получился примерно такой массив:
Для этого нам нужно скачать свежую базу данных ФИАС и настроить поиск по ней. На хабре уже есть статья с примером как импортировать базу ФИАС в MSSQL. В общем, настраиваете поиск по ФИАСУ, находите там нужный вам адрес, узнаете его код ОКАТО, по коду ОКАТО из списков районов узнаете район — всё, задача решена.
Поиск ближайших станций метро
Яндекс Геокодер
Сначала нужно узнать координаты адреса. Потом, как при обратном геокодировании, передаем в качестве параметров запроса эти координаты, и вид возвращаемого топонима kind=metro.
Отдельным параметром задаются размеры области, в пределах которой надо искать ближайшую станцию. Опытным путём я подобрал значения от 0,02 до 0,05 градусов в зависимости от города (в Москве радиус 2 километра от метро еще считается шаговой доступностью, а в Казани расстояние между станциями 1,5 километра).
Также есть проблема у такого метода, что иногда ближайшее по координатам метро не всегда ближайшее фактически (например находится на другом берегу реки, или вроде того). Определять ближайшее по доступности метро можно только с помощью сервисов построения маршрутов и матриц расстояний, о них будет в статье дальше. Для грубого определения ближайшей станции — геокодер яндекса вполне подходит, и дает выполнить до 25000 запросов в сутки бесплатно.
DaData
Поиск организаций
Распространенная задача, если вы хотите показать своим клиентам какие-то организации в его городе. Например, вы продаете товары с доставкой, и хотите показать человеку все пункты выдачи какой-то службы в его городе. Или вы изготавливаете макеты для печати, и показываете пользователю на карте все типографии, куда он может обратиться чтобы распечатать ваш макет.
Яндекс поиск по организациям
Google Places Api
Определение местоположения пользователя по IP
Частая задача в вебе — понять, из какого города на ваш сайт пришел посетитель. Для этой задачи есть решения в виде online-сервисов или самостоятельных решений для тех, кто не хочет зависеть от сторонних сервисов.
Вкратце продублирую информацию:
IpGeoBase — раньше был неплохой сайт, который ежедневно обновлялся и давал базу ip адресов и соответствующих им городов в понятном машинно-читаемом формате, легко импортируемом в любую базу данных. К сожалению, перестал обновляться в 2017 году.
ipgeobase.ru
SypexGeo — обновляется до сих пор, поставляется в виде скрипта php и базы данных к нему в собственном формате. Работает быстро, определяет хорошо
sypexgeo.net/ru/download
MaxMind предлагает скачать бесплатные базы со сниженной точностью и отдельно API к ним на различных языках программирования. Более точные базы доступны в рамках платных продуктов.
dev.maxmind.com/geoip/geoip2/geolite2
Определение местоположения пользователя по координатам
Задача схожа с задачей обратного геокодирования, с небольшими различиями.
Иногда нам нужно определить местоположение пользователя, когда мы точно знаем его координаты (например получили их используя датчики GPS устройства или Geolocation API в браузере). Тут есть два варианта — обратное геокодирование нам возвращает название того места, где находится пользователь. Но что произойдет, если пользователь находится где-то на трассе между городами, или в пригороде или просто в чистом поле и хочет посмотреть объявления о продаже участков на этом поле? Не всегда обратный геокодер с этим справится.
Построение маршрута
Иногда бывает нужно построить маршрут от одной точки до другой. Например, составить схему проезда от местоположения пользователя до вашего офиса. Платные решения есть от Яндекса и от Гугла — основное их отличие в том, что Яндекс продает подписку с годовой оплатой, а гугл тарифицирует запросы поштучно и списывает деньги с карты раз в месяц по итогу месяца.
Также у гугла есть премиум-подписка, которая дает некоторые дополнительные функции (например увеличение максимального размера картинки Static API) и депозит на лимиты. Также есть решение от 2Гис — самое дорогое в пересчете на 1 построенный маршрут.
Благодаря 3aiats было найдено бесплатное Open Source решение —
GraphHopper
MapBox (спасибо ne_kotin)
Яндекс
Google Directions Api
Google Distance Matrix API
Google Roads API
WikiRoutes
Azure Maps
2Гис Логистика
Сервисы для оптимизации логистики
Заключение
В современном мире вы можете найти готовый сервис фактически для любой задачи, которую вам нужно решить, либо решить её с помощью комбинации сервисов из списка выше. Вопрос только в стоимости этого решения, насколько оно будет для вас выгодно.
Многие сервисы по мере роста популярности переходят на всё более жесткие системы монетизации — как бесплатные когда-то карты гугла стали полностью платными, так же и Яндекс постепенно к этому идет.
Есть открытые OpenStreetMaps, которые вроде как можно заставить решать все задачи из списка, но для этого вам нужно их разворачивать у себя, и помимо своего проекта отдельно поддерживать еще целую инфраструктуру для карт — насколько это нужно, каждый решает для себя сам.
Вероятно, в обзоре я не указал некоторые отличные сервисы, которыми вы пользуетесь, либо вы пользовались сервисами из обзора и вам есть что добавить к уже написанному — пишите в комментариях, буду добавлять в текст.
Определение координат
Предлагаем воспользоваться аналогичным сервисом от Google — найти месторасположение и поиск по координатам + местонахождение интересных мест в мире на схеме Гугл Мапс
Определение широты и долготы на карте?
На странице быстрое определение координат на карте — узнаем широту и долготу города. Онлайн поиск улиц и домов по адресу, по GPS, для определения координат на карте Яндекс, как найти местоположение — подробнее описано ниже.
Определение географических координат любого города в мире (узнать широту и долготу) по онлайн карте от сервиса Яндекс на самом деле очень простой процесс. У вас два удобных варианта, остановимся подробнее на каждом из них.
Вы можете установить приложение для браузера Google Chrome, Opera и Яндекс браузер
Первый вариант: Необходимо воспользоваться формой поиска, и ввести в поле название географического объекта (страну, город, улицу, номер дома). То есть, заполнить форму адресом объекта для нахождения координат. Например, нужно определить географические координаты широту и долготу улиц города Ростова-на-Дону.
Заполняем форму: Ростов-на-Дону Пушкинская 10 (с помощью и при наличии номера дома, поиск будет проходить более точный). Справа в верхнем углу расположена форма определения координат, которая содержит 3 точных параметра — координаты метки, центр карты и масштаб приближения.
После активации поиска «Найти» в каждом поле будут нужные данные — долгота и широта. Смотрим поле «Центр карты».
Второй вариант: В этом случае еще проще. Интерактивная карта мира с координатами содержит метку. По умолчанию она стоит в центре города Москва. Необходимо перетащить метку и поставить на нужный город, например, определяем координаты на карте Санкт-Петербурга с улицами и номерами домов. Широта и долгота автоматически будут соответствовать объекту поиска. Смотрим поле «Координаты метки».
Скопировать географические координаты центра Украины пгт. Добровеличковка — Ctrl+C
48.3848,31.1769 48.3848 северной широты и 31.1769 восточной долготы
Долгота +37° 17′ 6.97″ в.д. (37.1769)
Широта +48° 38′ 4.89″ с.ш. (48.3848)
На въезде в поселок городского типа установлен знак, оповещающий об этом интересном факте. Рассматривать его территорию, скорее всего будет неинтересно. Есть куда более занимательные места в мире.
Как по координатам найти место на карте?
Рассмотрим обратный процесс, для примера сравните определение географических координат широты и долготы по адресу на карте Google. Зачем нужно определение широты и долготы на карте? Допустим вам понадобится, определить по координатам GPS навигатора точное расположение автомобиля на схеме. Или близкий друг позвонит в выходной день и сообщит координаты своего местонахождения, приглашая вас присоединиться к охоте или рыбной ловле.
Кроме вышеперечисленного, вы легко сможете определить координаты на карте любой станции метро в городе. После названия города пишем название станции. И наблюдаем, где расположится метка и её координаты с широтой и долготой. Для определения протяженности маршрута, необходимо применить инструмент «Линейка» (измерение расстояний на карте). Ставим метку в начале маршрута и затем в конечной точке. Сервис автоматически определит расстояние в метрах и покажет сам трек на карте.
Точнее обследовать место на карте представляется возможным благодаря схеме «Спутник» (верхний угол справа). Посмотрите, как выглядит карта города Новосибирска со спутника. Вы можете проделать с ней все вышеперечисленные операции.
Карта мира с долготой и широтой
Представьте, вы находитесь в незнакомой местности, и рядом нет никаких объектов или ориентиров. И спросить не у кого! Каким образом вы смогли бы объяснить своё точное местоположение, что бы вас быстро нашли?
Благодаря таким понятиям, как широта и долгота, вас смогут обнаружить и найти. Широта показывает местоположение объекта по отношению к Южному и Северному полюсам. За нулевую широту принято считать экватор. Южный полюс расположен на 90 град. южной широты, а Северный на 90 градусе северной широты.
Этих данных оказывается недостаточно. Необходимо знать положение также относительно Востока и Запада. Здесь и пригодится координата долгота.
Сохранить в закладки в любом браузере — CTRL+D
Приглашаем поделиться страницей сервиса со своими друзьями!
Благодарим за предоставленные данные сервис Яндекс. Карты