- PVSM.RU - https://www.pvsm.ru -
В рамках практически любого онлайн-продукта можно встретиться с задачей, которая требует применения того или иного сервиса, связанного с картами, геокодированием, гео-позиционированием. Лично я уже почти 10 лет работаю над онлайн-каталогом недвижимости, а также в рамках ряда других проектов есть опыт использования специфичных функций различных онлайн гео-сервисов.
В этой статье я рассмотрю гео-задачи, которые наиболее часто встают перед программистами, сделаю небольшой обзор сервисов, предлагающих решения для этих задач, и поделюсь опытом использования этих сервисов.
Также рассчитываю на участие комментаторов — если заметите в обзоре неточность в описании, отсутствие вашего хорошего сервиса или вам просто есть что добавить к уже написанному — пишите в комментариях, я буду собирать всё в основной текст, чтобы на будущее всегда иметь под рукой хороший список инструментов на все случаи жизни.
Очень популярная задача — это отображение на сайте онлайн-карт. Например, чтобы показать, в каком точно месте на карте находится ваш офис. Или где можно забрать вещь, которую продает автор объявления.
Для отображения карт используются два основных вида API:
Все сервисы, которые я разрабатывал, работают в основном с Россией, поэтому я расскажу о тех API, которыми пользовался сам и которые популярны у нас. Знаю, что есть API и у bing, и других провайдеров карт, но я ими не пользовался.
Javascript API позволяет показать на сайте интерактивную карту с возможностью изменения масштаба, отображения маркеров, взаимодействия с картой (перетаскивание маркеров, отображение всплывающих подсказок и прочее).
Статичное API может быть использовано там, где вам нужно показать просто картинку карты, без интерактива. Например, вы хотите приложить карту к электронному письму, или дать возможность пользователю распечатать схему проезда к вам. Ну или ваш дизайнер нарисовал макет, в котором вместо фона используется карта — грузить для такой задачи полноценные JS карты выглядит избыточным. Также статичную картинку можно использовать как превью для ускорения загрузки страницы у пользователя — а по клику делать её интерактивной.
Геокодирование — процесс, который позволяет узнать координаты объекта по его адресу. Ну или обратное геокодирование — по координатам узнать, что за гео-объект там находится. Фактически все сервисы геокодирования работают с адресами, введенными в произвольном формате, заодно приводя их к своему стандарту. Полностью бесплатных сервисов геокодирования на рынке в данный момент я не нашел.
Типичные применения геокодирования — отобразить на карте введенный пользователем адрес, или наоборот (обратное) — пользователь поставил на карте метку, нужно её превратить в адрес.
Иногда бывает нужно дать пользователю ввести адрес в произвольном формате, а потом превратить этот адрес в структурированные данные — отдельно название страны, региона, города, улицы и номер дома. Это нужно всем сервисам, которые работают с недвижимостью, это нужно для определения дублей адресов, для заполнения почтовых квитанций и т.д.
В принципе, с этой задачей без проблем справляются все сервисы геокодинга из списка выше. При прямом геокодинге кроме координат они также возвращают и структурированную информацию о найденном гео-объекте.
Отдельно стоит отметить сервис «стандартизация» от DaData — по адресам из России они возвращают еще массу разной полезной информации, по 10 копеек за каждый адрес:
dadata.ru/api/clean/address [21]
Кроме того, к этом разделу я отношу также задачи поиска дополнительной информации об адресе. В частности это определение, к какому району города относится указанный адрес, и поиск ближайших станций метро — важные задачи, если мы делаем поиск объявлений по адресам.
Для определения района в рамках города я для себя нашел на данный момент два решения. Оба работают только для России.
Первое, и самое очевидное — DaData. Уже много было написано об этом сервисе, это действительно хороший сервис для работы с российскими адресами (и это не реклама). Попробуйте сами, убедитесь.
Если не хотите зависеть от стороннего сервиса — есть другое решение, которое я применял и продолжаю применять до сих пор. Это определение района по коду ОКАТО адреса. У каждого адреса в рамках России есть свой код ОКАТО — 11 цифр. Из них первые 5-8, в зависимости от города, однозначно указывают на район.
Я для тех городов, которые мне нужны, просто составил базу кодов ОКАТО для районов, получился примерно такой массив:
Следующий вопрос — как узнать код ОКАТО адреса? DaData возвращает его в рамках своих сервисов «Подсказки» и «Стандартизация». Есть сайт окато-октмо.рф [22] который по адресу показывает код ОКАТО, используя ту же дадату. Наша задача — самостоятельно узнать код ОКАТО по адресу, не завися ни от какого сервиса.
Для этого нам нужно скачать свежую базу данных ФИАС [23] и настроить поиск по ней. На хабре уже есть статья с примером как импортировать базу ФИАС в MSSQL [24]. В общем, настраиваете поиск по ФИАСУ, находите там нужный вам адрес, узнаете его код ОКАТО, по коду ОКАТО из списков районов узнаете район — всё, задача решена.
Если не хотите париться с загрузкой 60 гигабайт XML файлов в свою базу, есть более дешевый, но и менее функциональный, чем dadata, сервис, который позволяет работать с базой ФИАС:
kladr-api.ru/docs [25]
Нужная функция, особенно для жителей Москвы, когда вам нужно по адресу найти ближайшие к нему станции метро. Для этой задачи в данный момент я знаю два решения:
Сначала нужно узнать координаты адреса. Потом, как при обратном геокодировании, передаем в качестве параметров запроса эти координаты, и вид возвращаемого топонима kind=metro.
Отдельным параметром задаются размеры области, в пределах которой надо искать ближайшую станцию. Опытным путём я подобрал значения от 0,02 до 0,05 градусов в зависимости от города (в Москве радиус 2 километра от метро еще считается шаговой доступностью, а в Казани расстояние между станциями 1,5 километра).
Также есть проблема у такого метода, что иногда ближайшее по координатам метро не всегда ближайшее фактически (например находится на другом берегу реки, или вроде того). Определять ближайшее по доступности метро можно только с помощью сервисов построения маршрутов и матриц расстояний, о них будет в статье дальше. Для грубого определения ближайшей станции — геокодер яндекса вполне подходит, и дает выполнить до 25000 запросов в сутки бесплатно.
Да, и в этой задаче может помочь DaData — в рамках платных тарифов сервиса «подсказки» или «стандартизация» по каждому адресу также возвращается 3 ближайшие станции метро и расстояния до них.
Распространенная задача, если вы хотите показать своим клиентам какие-то организации в его городе. Например, вы продаете товары с доставкой, и хотите показать человеку все пункты выдачи какой-то службы в его городе. Или вы изготавливаете макеты для печати, и показываете пользователю на карте все типографии, куда он может обратиться чтобы распечатать ваш макет.
Ходят слухи, что у них есть платное закрытое API для поиска по организациям. Мне к нему доступ получить пока не удалось, да и поиска по организациям от яндекса для наших задач вполне хватает.
Частая задача в вебе — понять, из какого города на ваш сайт пришел посетитель. Для этой задачи есть решения в виде online-сервисов или самостоятельных решений для тех, кто не хочет зависеть от сторонних сервисов.
Онлайн сервис для определения города по IP — тут я могу посоветовать (для России) снова DaData: dadata.ru/api/detect_address_by_ip [28]
Лимит — 10 000 запросов в сутки. Если ваша посещаемость превышает 10 000 уников в сутки, есть смысл рассмотреть решения, которые устанавливаются на ваш сервер. Подробно о них можно почитать в обзоре от DaData [29], как они выбирали, что использовать.
Вкратце продублирую информацию:
IpGeoBase — раньше был неплохой сайт, который ежедневно обновлялся и давал базу ip адресов и соответствующих им городов в понятном машинно-читаемом формате, легко импортируемом в любую базу данных. К сожалению, перестал обновляться в 2017 году.
ipgeobase.ru [30]
SypexGeo — обновляется до сих пор, поставляется в виде скрипта php и базы данных к нему в собственном формате. Работает быстро, определяет хорошо
sypexgeo.net/ru/download [31]
MaxMind предлагает скачать бесплатные базы со сниженной точностью и отдельно API к ним на различных языках программирования. Более точные базы доступны в рамках платных продуктов.
dev.maxmind.com/geoip/geoip2/geolite2 [32]
Задача схожа с задачей обратного геокодирования, с небольшими различиями.
Иногда нам нужно определить местоположение пользователя, когда мы точно знаем его координаты (например получили их используя датчики GPS устройства или Geolocation API в браузере). Тут есть два варианта — обратное геокодирование нам возвращает название того места, где находится пользователь. Но что произойдет, если пользователь находится где-то на трассе между городами, или в пригороде или просто в чистом поле и хочет посмотреть объявления о продаже участков на этом поле? Не всегда обратный геокодер с этим справится.
В этом случае лично я поступаю так — у меня в базе данных хранятся все координаты городов России, в которых у нас имеются объявления и с которыми мы вообще работаем. И по координатам пользователя я просто определяю ближайший к нему город из нашей базы, с помощью простого запроса:
ORDER BY (|lng - :lng| + |lat - :lat|) ASC LIMIT 1
Иногда бывает нужно построить маршрут от одной точки до другой. Например, составить схему проезда от местоположения пользователя до вашего офиса. Платные решения есть от Яндекса и от Гугла — основное их отличие в том, что Яндекс продает подписку с годовой оплатой, а гугл тарифицирует запросы поштучно и списывает деньги с карты раз в месяц по итогу месяца.
Также у гугла есть премиум-подписка, которая дает некоторые дополнительные функции (например увеличение максимального размера картинки Static API) и депозит на лимиты. Также есть решение от 2Гис — самое дорогое в пересчете на 1 построенный маршрут.
Задачи построения маршрутов делятся на несколько подзадач:
Разные провайдеры предлагают разные решения для всех этих задач.
Благодаря 3aiats [33] было найдено бесплатное Open Source решение —
Общая особенность всех сервисов Яндекса для маршрутов — они работают на территории России, Абхазии, Азербайджана, Армении, Беларуси, Грузии, Казахстана, Кыргызстана, Молдовы, Таджикистана, Турции, Узбекистана и Украины.
Есть сервис app.swizz.ru [40], который использует API яндекса для построения маршрутов. У сервиса нет своего API, и он испытывает проблемы с лимитами от Яндекса, но по сути там можно посмотреть, как работает яндексовский построитель маршрутов. За ссылку спасибо 3aiats [33]
Главное отличие от яндекса — тарификация по принципу Pay-as-you-go, то есть за каждый запрос. Для небольших объемов тарифы будут выгоднее у Гугла, для больших — у Яндекса.
Также у гугла нет ограничения по странам, где они строят маршруты.
Уникальный сервис гугла, позволяющий работать с дорогами, по которым едет ваш транспорт.
Автоматически привязывает точки вашего маршрута к дорогам, показывает лучшую схему движения и всю информацию об участках дорог, которые повстречаются вам на пути.
Умеет к точкам привязывать ближайшие к ним участки дорог (например по GPS треку который скачет туда-сюда — показать по каким дорогам по факту был пройден маршрут).
Умеет показывать ограничения скорости на дорогах на маршруту.
Как отдельный класс сервисов для построения маршрутов стоит выделить готовые решения для оптимизации логистики, которые тарифицируются исходя из количества курьеров/машин на линии. По сути они комбинируют средства для построения маршрутов и другие сервисы чтобы максимально оптимизировать вашу логистику. Это достаточно сложные и нишевые решения, поэтому я их объединил в один список.
За пополнение списка спасибо 3aiats [33]
В современном мире вы можете найти готовый сервис фактически для любой задачи, которую вам нужно решить, либо решить её с помощью комбинации сервисов из списка выше. Вопрос только в стоимости этого решения, насколько оно будет для вас выгодно.
Многие сервисы по мере роста популярности переходят на всё более жесткие системы монетизации — как бесплатные когда-то карты гугла стали полностью платными, так же и Яндекс постепенно к этому идет.
Есть открытые OpenStreetMaps, которые вроде как можно заставить решать все задачи из списка, но для этого вам нужно их разворачивать у себя, и помимо своего проекта отдельно поддерживать еще целую инфраструктуру для карт — насколько это нужно, каждый решает для себя сам.
Вероятно, в обзоре я не указал некоторые отличные сервисы, которыми вы пользуетесь, либо вы пользовались сервисами из обзора и вам есть что добавить к уже написанному — пишите в комментариях, буду добавлять в текст.
Автор: Искандер Гиниятуллин
Источник [51]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/karty/325793
Ссылки в тексте:
[1] Отображение карт на сайте: #sitemaps
[2] Прямое и обратное геокодирование: #geocoding
[3] Разбор и автодополнение адресов: #parsing
[4] Поиск организаций: #places
[5] Определение местоположения пользователя: #users
[6] Построение маршрутов: #directions
[7] tech.yandex.ru/maps/jsapi/doc/2.1/quick-start/index-docpage: https://tech.yandex.ru/maps/jsapi/doc/2.1/quick-start/index-docpage/
[8] developers.google.com/maps/documentation/javascript/tutorial: https://developers.google.com/maps/documentation/javascript/tutorial
[9] api.2gis.ru/doc/maps/ru/quickstart: http://api.2gis.ru/doc/maps/ru/quickstart/
[10] azure.microsoft.com/ru-ru/services/azure-maps: https://azure.microsoft.com/ru-ru/services/azure-maps/
[11] docs.mapbox.com/api/maps: https://docs.mapbox.com/api/maps/
[12] tech.yandex.ru/maps/staticapi/doc/1.x/dg/concepts/input_params-docpage: https://tech.yandex.ru/maps/staticapi/doc/1.x/dg/concepts/input_params-docpage/
[13] developers.google.com/maps/documentation/maps-static/intro: https://developers.google.com/maps/documentation/maps-static/intro
[14] api.2gis.ru/doc/maps/1.0/static: http://api.2gis.ru/doc/maps/1.0/static/
[15] tech.yandex.ru/maps/geocoder: https://tech.yandex.ru/maps/geocoder/
[16] dadata.ru/api/suggest/address: https://dadata.ru/api/suggest/address/
[17] developers.google.com/maps/documentation/geocoding/intro: https://developers.google.com/maps/documentation/geocoding/intro
[18] www.graphhopper.com/developers: https://www.graphhopper.com/developers/
[19] docs.mapbox.com/api/search: https://docs.mapbox.com/api/search/
[20] nominatim.org/release-docs/develop/api/Overview: https://nominatim.org/release-docs/develop/api/Overview/
[21] dadata.ru/api/clean/address: https://dadata.ru/api/clean/address/
[22] окато-октмо.рф: https://%D0%BE%D0%BA%D0%B0%D1%82%D0%BE-%D0%BE%D0%BA%D1%82%D0%BC%D0%BE.%D1%80%D1%84/
[23] базу данных ФИАС: https://fias.nalog.ru/Updates.aspx
[24] как импортировать базу ФИАС в MSSQL: https://habr.com/ru/post/451720/
[25] kladr-api.ru/docs: https://kladr-api.ru/docs
[26] tech.yandex.ru/maps/geosearch: https://tech.yandex.ru/maps/geosearch/
[27] developers.google.com/places/web-service/usage-and-billing: https://developers.google.com/places/web-service/usage-and-billing
[28] dadata.ru/api/detect_address_by_ip: https://dadata.ru/api/detect_address_by_ip/
[29] обзоре от DaData: https://habr.com/ru/company/hflabs/blog/340466/
[30] ipgeobase.ru: http://ipgeobase.ru/
[31] sypexgeo.net/ru/download: https://sypexgeo.net/ru/download/
[32] dev.maxmind.com/geoip/geoip2/geolite2: https://dev.maxmind.com/geoip/geoip2/geolite2/
[33] 3aiats: https://habr.com/ru/users/3aiats/
[34] www.graphhopper.com/open-source: https://www.graphhopper.com/open-source/
[35] бесплатное и платное API: https://www.graphhopper.com/pricing/
[36] ne_kotin: https://habr.com/ru/users/ne_kotin/
[37] docs.mapbox.com/api/navigation: https://docs.mapbox.com/api/navigation/
[38] tech.yandex.ru/routing/router: https://tech.yandex.ru/routing/router/
[39] tech.yandex.ru/routing/distance_matrix: https://tech.yandex.ru/routing/distance_matrix/
[40] app.swizz.ru: http://app.swizz.ru/
[41] developers.google.com/maps/documentation/directions/intro: https://developers.google.com/maps/documentation/directions/intro
[42] developers.google.com/maps/documentation/distance-matrix/start: https://developers.google.com/maps/documentation/distance-matrix/start
[43] developers.google.com/maps/documentation/roads/intro: https://developers.google.com/maps/documentation/roads/intro
[44] wikiroutes.info/developers: https://wikiroutes.info/developers
[45] logistics.2gis.ru: https://logistics.2gis.ru/
[46] tech.yandex.ru/routing/vrp: https://tech.yandex.ru/routing/vrp/
[47] zig-zag.org: https://zig-zag.org/
[48] quickrun.ru: https://quickrun.ru
[49] maxoptra.ru: https://maxoptra.ru/
[50] www.antor.ru: https://www.antor.ru/
[51] Источник: https://habr.com/ru/post/462011/?utm_source=habrahabr&utm_medium=rss&utm_campaign=462011
Нажмите здесь для печати.