Прямое и обратное геокодирование

Действие 4: Это конец / TL;DR

Общие итоги:
Яндекс карты классные. Как ими пользоваться — непонятно.

Хорошая документация, чтобы “потрогать” сервис. Ужасная документация, чтобы что-то с ним сделать. Структура ссылок — “Хрен найдешь”, качество находки — “Вот колесо, оно катится. А далее вы сами легко сможете изобрести машину, ракету, подводную лодку”.

Основные моменты:
Как отобразить карту в проекте? Ссылка , тут всё просто.
Как добавить пин на карту? Ключевые слова Placemark, MapObjects. Искать в samples.
Как построить маршрут? Ключевое слово MasstransitRouting. Искать в samples.
Как сделать что-то еще? Искать в samples. Если там нет, то у вас проблемы.

Тарифы и особенности сервисов

Название Тариф Комментарий
Бесплатно до 25 000 запросов/сутки
Если больше – коммерческие тарифы от 120 000 рублей в год за 1000 запросов в сутки
Кроме количества запросов также ограничен лицензионным соглашением — результаты кодирования нельзя сохранять и использовать без карты (но можно кешировать), их нужно отображать только на картах Яндекса и только в рамках общедоступных сервисов (доступных всем или с открытой бесплатной регистрацией).
Бесплатно 10 000 запросов в сутки.
Платные тарифы от 5000 рублей в год за 50 тысяч запросов в сутки.
Оферта не позволяет его использовать полностью в автоматическом режиме — подсказки — только для уточнения данных, которые вводятся пользователем, прямо в форме где они вводятся. Обрабатывать собранные ранее массивы адресов в автоматическом режиме подсказками нельзя.
Если не использовать автоматический режим, то этот сервис самый дешевый на рынке.
На платных тарифах даёт массу полезной информации – цены на недвижимость, ближайшие станции метро, коды ФИАС и КЛАДР и тд
5$ за тысячу запросов, бесплатного лимита нет. Полностью платный сервис, поэтому я в своей работе его практически не использовал. Зато есть клиенты для Java, Python, Go и Node.js
Стоимость основана на использовании кредитов. Бесплатно вам дается 500 кредитов в день, что эквивалентно примерно 1666 запросам.
Коммерческие тарифы от 48 евро в месяц за 5000 кредитов (16 666 запросов) в сутки
У сервиса много других интересных функций помимо геокодирования:
Routing API и Route Optimization API — автоматическое построение и оптимизация маршрутов
Matrix API — построение логистической матрицы с учетом загруженности дорог
Isochrone API — сервис, позволяющий построить зону, в которую можно доехать из заданной точки за фиксированное время.
Map Matching API — сервис, который привязывает GPS-треки к дорогам, чтобы можно было построить историю передвижения.
Бесплатно до 100 000 запросов в месяц. Свыше 100 000 – 0,75$ за каждую 1000 запросов Удобный сервис, потому что имеет огромное количество официальных модулей для Swift, JS, Java, Python, Ruby. Плохо работает с Россией
OpenSource-решение, которое вы можете развернуть на своей машине бесплатно.

Как подключается API от Яндекс

Для того чтобы подключить API нужно внутрь тега прописать следующий код.

В первом примере мы подключаем полный пакет всех классов и методов ( GET запрос – )

Могут быть загружены как все компоненты API, так и отдельные пакеты, содержащие только необходимые компоненты. Это позволяет регулировать объем трафика, передаваемого клиентскому приложению.

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

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

Стандартные элементы управления

Теперь изменим код, чтобы на карте отображались :

  • Панель инструментов со стандартным набором кнопок: перетягивание карты (drag), увеличение выделенной области, измерение расстояний.
  • Переключатель отображаемого типа карты.
  • Изменение коэффициента масштабирования.
ymaps.ready(init);

function init() {
    var myMap = new ymaps.Map ('myMap', {
        center 55.75, 37.61,
        zoom 3,
        type 'yandex#satellite'
    });
    myMap.controls
        .add('mapTools')       // стандартные кнопки
        .add('typeSelector')   // переключатель типа карты
        .add('zoomControl');   // изменение масштаба
    var myPlacemark = new ymaps.Placemark(55.75, 37.61, { 
        iconContent 'Москва', 
        balloonContent 'Столица России' 
    }, {
        preset 'twirl#blueStretchyIcon'
    });
    myMap.geoObjects.add(myPlacemark);
}

Можно изменить стандартное расположение элементов управления:

myMap.controls
    .add('mapTools', {left5, bottom35})    // стандартные кнопки
    .add('typeSelector', {left5, top5})    // переключатель типа карты
    .add('zoomControl', {right5, top15});  // изменение масштаба

Добавить линейку масштаба и обзорную карту:

myMap.controls
    .add(new ymaps.control.ScaleLine())  // линейка масштаба
    .add(new ymaps.control.MiniMap({     // обзорная карта заданного типа
        type 'yandex#publicMap'
    }));

Создание карты

Создавать карту следует после того, как веб-страница загрузится целиком. Это значит, что контейнер для карты создан и к нему можно обращаться по id. Чтобы инициализировать карту после загрузки страницы, можно воспользоваться функцией ready().

ymaps.ready(init);

function init() {
    var myMap = new ymaps.Map ('myMap', {
        center 55.75, 37.61,
        zoom 10
    });
}

При инициализации карты, указав дополнительный параметр , мы можем задать тип нашей карты:

  • yandex#map — тип карты «схема» (по умолчанию);
  • yandex#satellite — тип карты «спутник»;
  • yandex#hybrid — тип карты «гибрид»;
  • yandex#publicMap — тип карты «народная карта»;
  • yandex#publicMapHybrid — тип карты «народный гибрид».
ymaps.ready(init);

function init() {
    var myMap = new ymaps.Map ('myMap', {
        center 55.75, 37.61,
        zoom 10,
        type 'yandex#hybrid'
    });
}

Действие 2: Поехали

Находим Getting started и приступаем. В начале все просто.

На “Step 3. Set up the library” возникают вопросы. Вью и фабрику нужно обязательно стартовать и останавливать отдельно, иначе, как нам сообщают, ничего не будет работать. Почему? А что будет, если что-то стартану, а что-то нет, или стартану что-то позже? А если несколько вьюх, то для каждого надо фабрику, или это синглтон?

Возможно, это всего лишь QuickStart и дальше мы найдем подробное описание! (нет)

Давайте смотреть, что есть по документации. А все, ничего больше нет. Есть только сгенерированная документация с комментариями типа:

Спасибо, Яндекс.

Ладно, на гитхабе есть еще проект с примерами использования . Внутри каждого класса активити есть комментарии о том, что он делает и зачем нужен (после документации это просто подарок судьбы). Есть несколько сценариев: создание кастомного слоя карты, построение маршрута для автомобиля, работа с объектами на карте и некоторые другие.

Выглядит ли апи мощным? Да.
Понятно ли как им пользоваться в случаях, чуть более сложных, чем примеры? Нет.(
Как это понять? ¯_(ツ)_/¯ Нырять с головой в код, по итогу исследований продавать книжку о том, что нашел.

Как задать ограничения для ключей API

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

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

  • Сертификат для отладки. Его следует использовать исключительно при тестировании приложений и работе с кодом до публикации. Не пытайтесь опубликовать приложение, подписанное с помощью сертификата для отладки. Этот сертификат создается автоматически при выполнении отладочной сборки приложения с помощью инструментов Android SDK.
  • Сертификат для выпуска. Используйте этот сертификат, когда будете готовы разместить ваше приложение в магазине. Он создается с помощью инструментов Android SDK при выполнении сборки в процессе подготовки к выпуску.

Дополнительную информацию о цифровых сертификатах вы найдете в руководстве по .

Чтобы задать ограничение для ключа API, выполните следующие действия:

  1. Откройте страницу Google Maps Platform > Credentials (Платформа Google Карт > Учетные данные).

  2. Выберите нужный ключ API. Откроется страница со свойствами ключа API.
  3. В разделе Key restrictions (Ограничения для ключа) установите следующие ограничения:

Ограничения для приложений:

  1. Выберите Приложения для Android.
  2. Нажмите + Название пакета и цифровой отпечаток.
  3. Укажите название пакета и цифровой отпечаток сертификата SHA-1. Пример:
    com.example.android.mapexample
    BB:0D:AC:74:D3:21:E1:43:67:71:9B:62:91:AF:A1:66:6E:44:5D:75

    Информацию о том, как получить цифровой отпечаток сертификата, вы можете найти в разделе .
    Если же вы используете функцию подписания приложений в Google Play, вы можете найти цифровой отпечаток сертификата на странице подписания приложений в Play Console.

Ограничения для API:

  1. Нажмите Применить ограничения для ключа.
  2. В раскрывающемся списке Выберите API нажмите Maps SDK для Android.
    Если Maps SDK для Android там нет, его необходимо .

Нажмите Сохранить.

Сравнительное тестирование качества геокодирования

Страна Город Адрес
1 Россия Москва Красная площадь д. 3
2 Россия Москва 2-й Карачаровский проезд, 2
3 Россия Казань Фатыха Амирхана 13
4 Россия Казань 2я Центральная, 172А
5 Россия Чистополь Лобачевского, 57
6 Россия Новокузнецк Ермака 16
7 Россия Улан-Удэ Столбовая, 68
8 Казахстан Нурсултан Кокжазык, 14
9 Казахстан Жезказган Космонавтов, 10
10 Беларусь Минск Переулок Стебенёва, 6
11 Беларусь Мозырь Рыжкова, 4
12 Украина Киев Суздальська вулиця 9
13 Украина Бучач Богдана Хмельницького вулиця 6
14 Венгрия Budapest Homokdomb 7
15 США CO, Fort Collins East Oak Street, 411

ЯндексДадатаGraphHopperMapBoxOSM

Итоги рейтинга по заграничным адресам:

  • По СНГ лидирует OSM, на втором месте – Яндекс, на третьем – .
  • В Европе и США с задачей геокодирования лучше всего справляются OSM, GraphHopper и .

Как задать собственный стиль для кнопки

В качестве иконки метки можно установить собственное изображение. Для этого необходимо задать следующие опции:

  •  — значение ‘default#image’ или ‘default#imageWithContent’ для меток соответственно без текста и с текстом поверх картинки;
  •  — URL графического файла значка;
  •  — размер значка в пикселах;
  •  — сдвиг значка в пикселах относительно точки привязки (задается, если “ножка” значка не находится в левом верхнем углу изображения;
  •  — для меток с текстом сдвиг текста относительно точки привязки метки.

Я предоставляю только часть информации, которая используется в большинстве случаев реализации карты. Вся подробная информация находится на сайте с документацией – https://tech.yandex.ru/maps/doc/jsapi/2.1/dg/concepts/geoobjects-docpage/

Действие 3: Разрабатываем

Задача 1: отобразить карту
Сложностей не встретил, все есть в гайде.

Задача 2: отобразить пины
Нам нужен “MapObjectsActivity.java», то, что мы ищем, называется Placemarks. Смотрим в код, чтобы понять, что с ними делать.

Задача 3: построить маршрут
Наш друг тут — “MasstransitRoutingActivity.java”. Маршрут можно попросить разный: только на машине, только пешком, и так и сяк; наверняка можно еще учесть метро и другие разные штуки, но я недонырнул.

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

Для решения этой задачи придется вернуться в поиск — и найти документацию для js . Она кажется гораздо более подробной и объемной (я завидую). Нам необходим “HTTP geocoding request” — тут довольно понятно написано, что это и как его использовать. Дело за реализацией http запросов-ответов на мобилках.