Как посмотреть координаты на компьютере

Обновлено: 05.07.2024

Этичный хакинг и тестирование на проникновение, информационная безопасность

Оглавление: Руководство по GPS метаданным в фотографиях

Программы для редактирования метаинформации под Windows и Linux

С помощью программ mat и mat2 можно просматривать и удалять метаданные файлов (поддерживается огромное количество типов файлов). Но что если вместо удаления нужно изменить метаданные в фотографии или в документе? Эти программы не помогут в данной задаче.

Но есть другие инструменты, которые могут менять GPS координаты, дату и время съёмки, информацию о камере и любую другую метаинформацию, которую только может содержать файл. Также они могут выборочно удалять те или иные теги. Например, можно удалить GPS координаты, но оставить информацию о камере. А можно наоборот добавить комментарии в метаинформацию, например, с описанием события и других замечаний о сделанном снимке.

Дополнительно мы разберёмся в различных способах записи координат — чтобы что-то записать или отредактировать, нужно в этом разбираться. Также мы научимся копировать значения координат из фотографии в карту, чтобы можно было просмотреть место съёмки без загрузки изображения на сторонние сервисы.

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

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

В этой инструкции мы рассмотрим сразу три потрясающих программы:

Они все работают и на Linux и на Windows — по ссылкам для каждой из них есть подробные инструкции по установке. У программы Geotag ещё и графический интерфейс! То есть спуфинг (подмена) GPS на фотографиях сводится к редактированию цифр в таблице.

Самой мощной из этих программ является ExifTool (кстати, оцените документацию по ней). При работе с редактированием географических координат, Geotag использует именно ExifTool, поэтому если вы используете Geotag на Windows вам нужно также установить и ExifTool и указать путь до исполнимого файла (в инструкциях по ссылкам выше всё уже есть). Кстати, mat2 для показа и удаления метаинформации также использует ExifTool. А Exiv2 использует, например, редактор фотографий GIMP для показа и редактирования метаинформации.

Также менять метаданные умеет программа jhead, но её возможности очень ограниченные — например, она не может менять GPS координаты в фотографии.

Географические координаты

Географические координаты это широта и долгота.

Широта определяет расположение «вверх-вниз» на глобусе/карте. Нулём считается экватор. Долгота определяет расположение «вправо-влево» на глобусе/карте. Нулём считается Гринвич. О самих числах и как «на глаз» прикидывать в какой части планеты расположены координаты мы поговорим ниже, а пока про то, как их записывают — форматов координат много.

Форматы записи географических координат

Координаты (широта от −90° до +90°, долгота от −180° до +180°) могут записываться:

  • в ° градусах в виде десятичной дроби (современный вариант)
  • в ° градусах и ′ минутах с десятичной дробью
  • в ° градусах, ′ минутах и ″ секундах с десятичной дробью (исторически сложившаяся форма записи)

Разделителем десятичной дроби может служить точка или запятая. Положительные знаки координат представляются (в большинстве случаев опускаемым) знаком «+» либо буквами:

  • «N» или «с. ш.» — северная широта,
  • «E» или «в. д.» — восточная долгота.

Отрицательные знаки координат представляются либо знаком «−», либо буквами:

  • «S» или «ю. ш.» — южная широта,
  • «W» или «з. д.» — западная долгота.

Буквы могут стоять как впереди, так и сзади. Единых правил записи координат не существует.

На картах поисковых систем по умолчанию показываются координаты в градусах с десятичной дробью со знаком «−» для отрицательной долготы. На картах Google и картах Яндекс вначале широта, затем долгота. Эти координаты видны, например, при прокладке маршрутов от произвольных точек. При поиске распознаются и другие форматы.

Нам необязательно во всём этом детально разбираться. С практической точки зрения нам надо запомнить: искать на сервисах карт (например, Google Карты) можно координаты в формате «2 числа с десятичной дробью; разделителем десятичной дроби является точка».

К примеру, в окно поиска по карте вместо географического названия можно ввести два десятичных числа, допустим: 12.459444 99.978611. И Карты покажут вам место на планете, располагающееся по соответствующим координатам.


Но вот в метаданных координаты хранятся в виде трёх чисел — по этой причине программы, показывающие метаданные файлов, по умолчанию также показывают их в виде трёх чисел (градусы, минуты и секунды).

Например, exiftool:

А exiv2 выводит так:

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

Ещё можно добавить, что, например, Google Карты принимают следующие форматы:

Но удобнее всего использовать именно десятичный формат.

Как вывести координаты в десятичных числах из метаданных GPS

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

Я нашёл две программы, которые умеют показывать координаты в десятичном виде.


Во-вторых, это ExifTool в которой с помощью опций и указания имён тегов можно вывести именно то, что требуется.

С помощью опции «-lang ru» можно вывести название тегов метаинформации на русском языке:



Если нужна только широта и долгота, то название тегов такое «-GPSLatitude -GPSLongitude»:


Наконец, если указать опцию -n, то координаты будут выведены в десятичном виде:


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

Опция -c позволяет установить формат выводимых координат. Например, если вам слишком много (или слишком мало) цифр после десятичной точки, то их количество можно изменить этой опцией.


С помощью опции -c можно настроить не только десятичный формат, но и любой другой — можно сделать абсолютно любую форму вывода координат.

Как по координатам определить примерное расположение на земном шаре

Что вы можете сказать глядя на следующие координаты?

Если ничего, то сейчас мы научимся «на глаз» определять примерное расположение по координатам даже без карты — хотя бы в каких полушариях находится координата и как далеко она от экватора, Гринвича и полюсов.

Широта определяет расположение «вверх-вниз» на глобусе/карте: 0° — экватор, 90° — северный полюс (верх глобуса), -90° — южный полюс (низ глобуса).

Долгота определяет расположение «вправо-влево» на глобусе/карте: 0 — Гринвич (Лондон/Великобритания), от 0° до +180° на восток (вправо) и от 0° до −180° на запад (влево).

Обратите внимание, что диапазон широты равен 180 градусам (половина окружности), а диапазон долготы 360 градусов (полная окружность). Диапазон долготы позволяет «перемещаться» по всей окружности земного шара (по всему экватору). А диапазон широты позволяет перемещаться только по видимой половине — если нужно было бы переместиться за северный/южный полюс, то для этого нужно сменить долготу, то есть «переехать» в другую часть экватора. Поэтому хватает 180° широты, но необходимо 360° долготы.

В соответствии с международным соглашением, меридиану, который проходит через Гринвичскую обсерваторию (Лондон, Великобритания) было присвоено значение 0° долготы, иными словами, он был избран в качестве точки отсчёта долготы на земном шаре. Долгота других мест измеряется как угол на восток или запад от нулевого меридиана, в диапазоне от 0° до +180° на восток и от 0° до −180° на запад".

Итак, вернёмся к нашим координатам:

Широта 12 (положительное число) означает выше линии экватора, но не намного, где-то на 1/7 от всей высоты от экватора до северного полюса (90/12.46=7,22). Долгота 99 означает значительное отдаление от линии Гринвича в сторону востока — примерно четверть поворота земного шара на восток (180/99.97=0,55). (0,55 — это примерно половина от восточного полушария, которое составляет ½ от всей земли).

Если бы первая цифра (широта) была бы отрицательной, то координата была бы чуть ниже линии экватора. А если бы вторая цифра была бы отрицательной (долгота), то смещение было бы таким же большим, но уже в сторону запада (от Гринвича/Лондона).

Как узнать место, где снята фотография, без использования сторонних сервисов

Если вы не хотите загружать фотографию ни на какой сайт или сервис, то это вполне понятное желание.

Первый способ уже показан выше — извлеките из изображения координаты, перейдите на Google Maps и введите их, в одном из следующих форматов (различаются пробелами и запятыми, разделяющими два числа):

  • +12.459444 +99.978611
  • +12.459444, +99.978611
  • +12.459444,+99.978611

Знак + (плюс) писать необязательно, но знак минус (если он есть) писать обязательно.

Если вдруг у координаты нет десятичных цифр, то добавьте к ней «.0», иначе сервис не поймёт, что это координаты — оба числа должны быть с точкой и цифрой после неё.

Второй способ — использовать Geotag. Эта программа в один клик запускает свой локальный веб-сервер на котором размещена веб-страница с картой, открывает браузер и показывает на карте фотографии, которые вы выбрали.

Итак, запускаем Geotag и добавляем фотографии.

Теперь выбираем фотографии, которые мы хотим увидеть на карте (можно выбрать одну, или несколько, или все).

Кликаем правой кнопкой мыши по списку изображений и выбираем нужное действие.


Будет открыт браузер с такой страницей.


  • это не статичная картинка, это интерактивная карта
  • адрес страницы localhost
  • на карте присутствует меню с возможными действиями

Преобразование координат в десятичный вид и в минуты/секунды

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

В десятичный вид преобразование происходит по следующей формуле:

То есть градус остаётся как есть, а минуты и секунды делятся на 60 и 3600 соответственно.

Если в строке присутствуют буквы S (юг) или W (запад), то перед числом ставится знак минус. Вот и всё.

Чтобы не считать вручную (к тому же, при преобразовании в минуты и секунды нужно выполнить несколько действий), напишем небольшой скрипт, который будет это делать за нас.

Создадим файл geoconverter.php:

И скопируем в него:

В этом случае будет вычислена координата в формате градусы, минуты и секунды.

В этом случае будет вычислена координата в формате десятичного числа.

Надеюсь, они очевидны и их не нужно комментировать.

Онлайн сервисы по конвертации географических координат:

Онлайн сервисы геолокации и просмотра метаданных

Если вы всего лишь хотите просмотреть, какие метаданные присутствуют в файлах, а также посмотреть на карте где была снята фотография, то вы можете воспользоваться следующими онлайн-сервисами:

Теперь эти сервисы переведены на использование ExifTool, поэтому вы увидите абсолютно все метаданные вашего файла.

Продолжение: во второй части «Как изменить GPS и другие метаданные в фотографии» мы научимся удалять и менять теги GPS, время создания, комментарий, производителя и модель камеры в метаданных фотографий.


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

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

Где берем данные и чем ищем адрес

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

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

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

Координаты загружаем из OpenStreetMap (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-деревьях, на которых построен алгоритм поиска).

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

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

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

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

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

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

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

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

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

142718, Московская обл, Ленинский р-н, с Булатниково, ул Центральная, д 103.

ФИАС-код — a8b6a52f-e96d-4ec3-a0ff-641013ab0445

Стандартизованные дома, улицы и населенные пункты мы храним как одну точку. Для улицы и населенного пункта эта точка — центр. В итоге все адресные объекты лежат в одной таблице, внутри — адрес, ФИАС ID, широта и долгота.
Адрес ФИАС ID Широта Долгота
142718, Московская обл, Ленинский р-н, с Булатниково, ул Центральная, д 103 a8b6a52f-e96d-4ec3-a0ff-641013ab0445 55.558773 37.667103
119034, г Москва, пер Турчанинов, д 6 стр 2 8c925e61-9173-48b3-999e-dc85c86d89e7 55.737096 37.597190

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

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

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

Эталонные полигоны мы загружаем из OSM и храним как есть — в формате GeoJSON. Чтобы выбрать, к какому полигону примерить точку, смотрим в отдельную таблицу. В ней мы сопоставили префиксы КЛАДР-кодов и ID полигонов: находишь для адреса КЛАДР-код и видишь, какой полигон выбрать.



КЛАДР-код — это уникальный идентификатор, который использовали еще до появления ФИАС. Находить этот код для адреса умеет миллион сервисов

Утилита разрешает объекту отстоять от положенного полигона на 1 700 метров. Это правило добавили из-за шоссе, которые часто выходят за границы региона. Но расстояние больше 1 700 метров — признак ошибки, так говорит статистика.

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

Еще раз, построже, проверяем загруженные координаты домов. В дело снова вступает упомянутая утилита, и вот что она делает.

  1. Берет адрес нового дома и находит для него соседей в эталонном справочнике.
  2. По координатам считает расстояние между непроверенным новым домом и надежными соседними.

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

Допустим, в эталонном справочнике хранятся дома № 1, 2 и 3 по улице Коммунаров. В новых данных пришли дома № 5, 6 и 7 по той же улице. Судя по координатам, новые дома стоят рядом. Утилита видит, что дом № 5 находится рядом с домами № 1, 2 и 3 и добавляет его в эталонный справочник. Значит, дома № 6 и 7 тоже проходят проверку.

А дальше решается судьба пришедших из OSM данных:

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



В первой таблице — все объекты c ФИАС ID до домов: регионы, населенные пункты, улицы. Во второй — дома́ и ссылка на родителя из первой таблицы

Две таблицы нужны, чтобы назначить ключи отсутствующим в ФИАС домам. У них нет собственного ФИАС-кода, поэтому делаем вот как:

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

Справочник готов, осталось протестировать. За ночь прогоняем сервис по функциональным тестам и тестируем производительность. Скорость проверяем на Москве, запрашивая все дома в радиусе трех километров. Чтобы уж наверняка. Конечно, обложили все автотестами.

Главное после обновления — чтобы не стало хуже.

Обратное геокодирование глазами пользователя

На вход метод принимает три параметра: координаты, количество результатов и радиус поиска. Радиус по умолчанию — 100 метров, максимальный — километр. Точное значение задают в настройках.


Обратно метод возвращает найденные объекты: дома, улицы и населенные пункты. При этом сортирует их по убыванию точности.

  1. Дома́.
  2. Улицы.
  3. Населенные пункты.
  4. Города́.

После всех этих рокировок метод наконец-то возвращает объекты, которые нашел.


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



Все данные, которые отдает метод — в документации

Покрытие по координатам для разных регионов разное, вот так с домами:

  • Москва — 96%,
  • Санкт-Петербург — 88%,
  • другие города-миллионники — 74%,
  • остальная Россия — 47%.
  • Москва — 92%,
  • Санкт-Петербург — 79%,
  • другие города-миллионники — 75%,
  • остальная Россия — 67%.

Уже думаем, что добавить к методу: разрешить фильтрацию по типам объектов, возвращать расстояния до заданной точки, еще что-нибудь. Следим за спросом и решаем, вкладывать ли силы.

А в остальном все уже на проде. До 10 000 запросов в сутки — бесплатно, больше — по подписке от 5 000 ₽ в год. Если нужны адреса по координатам для коммерческого проекта, а «Геокодер» слишком дорог — попробуйте API «Дадаты».

Какие форматы записи координат понимают Карты Google

Навигационный сервис Google Maps умеет работать с тремя форматами записи координат:

  • Десятичные градусы (пример: 55.753575, 37.62104).
  • Градусы с десятичными минутами (пример: 55 45.214, 37 37.262).
  • Градусы с минутами и секундами (пример: 55°45′13″N 37°37′16″E).

Как использовать сервис в браузерах на ПК

Рассмотрим пример. Допустим, у нас есть следующие данные:

  • Широта 55°45′13″N (55.753575)
  • Долгота 37°37′16″E (37.62104)

Чтобы найти нужное место:

  • Откроем в любом веб-браузере сервис Карты Google и перейдём в режим «Спутник», чтобы карта выглядела более наглядно. Для этого нажмем кнопку, которая находится в левом нижнем углу карты.

переход в режим спутник

  • Через запятую вставим в строку поиска сначала широту, потом долготу. Формат не принципиален. Затем нажмём клавишу Enter.

широта и долгота

  • В нашем примере под поисковой строкой открылась панорама найденного места, где видно, что это Красная площадь Москвы. Если вы ввели координаты места, у которого нет сохраненной панорамы, то под поисковой строкой не отобразится ничего.

панорама Красной площади

  • Далее посмотрим на спутниковый снимок. Как видно, наша гипотеза подтвердилась.

Красная площадь на google карте

Особенности поиска на мобильных устройствах

На смартфонах и планшетах на базе Android и iOS поиск мест по координатам производят точно так же, только вместо браузера используют мобильное приложение Google Maps. Широту и долготу вводят в поисковую строку, которая показана стрелкой на скриншоте ниже. После этого найденное место отмечается на карте красным маркером.

куда отправимся

Как узнать координаты места по визуальному расположению

Если вам неизвестны координаты, но известно визуальное расположение искомой локации, определить ее широту и долготу с помощью Гугл Мапс тоже очень просто:

  • Переключите карту на спутниковый вид. Кликните по интересующему месту правой кнопкой мыши и выберите из меню «Что здесь?».

пункт что здесь

  • Смотрите нужные данные в окошке внизу экрана.

координаты объекта на карте гугл

На Андроид-устройствах меню открывается долгим касанием интересующего объекта. На iOS дополнительно придется нажать на надпись «Без названия».

Координаты некоторых знаменитых мест на Картах Google

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

  • Римский Колизей (41.890471, 12.492234).
  • Загадочный Стоунхендж (51.178937, -1.826243).
  • Замок Бран, также известный как Замок Графа Дракулы (45.515314, 25.367296).
  • Французский Версаль (48.805346, 2.120388).

А если вы знаете другие интересные места, которые также можно найти на Google Картах, делитесь своими находками в комментариях!


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

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

Где берем данные и чем ищем адрес

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

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

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

Координаты загружаем из OpenStreetMap (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-деревьях, на которых построен алгоритм поиска).

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

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

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

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

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

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

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

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

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

142718, Московская обл, Ленинский р-н, с Булатниково, ул Центральная, д 103.

ФИАС-код — a8b6a52f-e96d-4ec3-a0ff-641013ab0445

Стандартизованные дома, улицы и населенные пункты мы храним как одну точку. Для улицы и населенного пункта эта точка — центр. В итоге все адресные объекты лежат в одной таблице, внутри — адрес, ФИАС ID, широта и долгота.
Адрес ФИАС ID Широта Долгота
142718, Московская обл, Ленинский р-н, с Булатниково, ул Центральная, д 103 a8b6a52f-e96d-4ec3-a0ff-641013ab0445 55.558773 37.667103
119034, г Москва, пер Турчанинов, д 6 стр 2 8c925e61-9173-48b3-999e-dc85c86d89e7 55.737096 37.597190

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

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

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

Эталонные полигоны мы загружаем из OSM и храним как есть — в формате GeoJSON. Чтобы выбрать, к какому полигону примерить точку, смотрим в отдельную таблицу. В ней мы сопоставили префиксы КЛАДР-кодов и ID полигонов: находишь для адреса КЛАДР-код и видишь, какой полигон выбрать.



КЛАДР-код — это уникальный идентификатор, который использовали еще до появления ФИАС. Находить этот код для адреса умеет миллион сервисов

Утилита разрешает объекту отстоять от положенного полигона на 1 700 метров. Это правило добавили из-за шоссе, которые часто выходят за границы региона. Но расстояние больше 1 700 метров — признак ошибки, так говорит статистика.

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

Еще раз, построже, проверяем загруженные координаты домов. В дело снова вступает упомянутая утилита, и вот что она делает.

  1. Берет адрес нового дома и находит для него соседей в эталонном справочнике.
  2. По координатам считает расстояние между непроверенным новым домом и надежными соседними.

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

Допустим, в эталонном справочнике хранятся дома № 1, 2 и 3 по улице Коммунаров. В новых данных пришли дома № 5, 6 и 7 по той же улице. Судя по координатам, новые дома стоят рядом. Утилита видит, что дом № 5 находится рядом с домами № 1, 2 и 3 и добавляет его в эталонный справочник. Значит, дома № 6 и 7 тоже проходят проверку.

А дальше решается судьба пришедших из OSM данных:

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



В первой таблице — все объекты c ФИАС ID до домов: регионы, населенные пункты, улицы. Во второй — дома́ и ссылка на родителя из первой таблицы

Две таблицы нужны, чтобы назначить ключи отсутствующим в ФИАС домам. У них нет собственного ФИАС-кода, поэтому делаем вот как:

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

Справочник готов, осталось протестировать. За ночь прогоняем сервис по функциональным тестам и тестируем производительность. Скорость проверяем на Москве, запрашивая все дома в радиусе трех километров. Чтобы уж наверняка. Конечно, обложили все автотестами.

Главное после обновления — чтобы не стало хуже.

Обратное геокодирование глазами пользователя

На вход метод принимает три параметра: координаты, количество результатов и радиус поиска. Радиус по умолчанию — 100 метров, максимальный — километр. Точное значение задают в настройках.


Обратно метод возвращает найденные объекты: дома, улицы и населенные пункты. При этом сортирует их по убыванию точности.

  1. Дома́.
  2. Улицы.
  3. Населенные пункты.
  4. Города́.

После всех этих рокировок метод наконец-то возвращает объекты, которые нашел.


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



Все данные, которые отдает метод — в документации

Покрытие по координатам для разных регионов разное, вот так с домами:

  • Москва — 96%,
  • Санкт-Петербург — 88%,
  • другие города-миллионники — 74%,
  • остальная Россия — 47%.
  • Москва — 92%,
  • Санкт-Петербург — 79%,
  • другие города-миллионники — 75%,
  • остальная Россия — 67%.

Уже думаем, что добавить к методу: разрешить фильтрацию по типам объектов, возвращать расстояния до заданной точки, еще что-нибудь. Следим за спросом и решаем, вкладывать ли силы.

А в остальном все уже на проде. До 10 000 запросов в сутки — бесплатно, больше — по подписке от 5 000 ₽ в год. Если нужны адреса по координатам для коммерческого проекта, а «Геокодер» слишком дорог — попробуйте API «Дадаты».

Читайте также: