- Мой (нано)опыт с Yandex.Maps API или зачем нужна инструкция
- Introduction
- Действие 0: Определения
- Действие 1: Поиск
- Действие 2: Поехали
- Действие 3: Разрабатываем
- Действие 4: Это конец / TL;DR
- Интеграция карт в ваше Android-приложение
- Yandex
- Определение собственной позиции
- Yandex map api для android
- Latest commit
- Git stats
- Files
- README.md
- Путь с указателями направления на карте с использованием Yandex Map Kit для Android
- 1. Встраивание библиотеки в проект (Eclipse, Windows)
- 2. Создание расширения для класса Overlay с целью вывода на карту пути с указателями направления и обработки событий «onClick» по карте
- Переходим с Google Maps на Yandex MapKit
Мой (нано)опыт с Yandex.Maps API или зачем нужна инструкция
Introduction
Я андроид разработчик и.
Мне довелось допиливать небольшой проект(
500h), в котором на старте было принято решение использовать Yandex.Maps API, потому что зачем для Москвы использовать гугл карты, если есть наши. Сейчас расскажу, как все прошло.
Я не проводил глубоких подкапотных исследований и никаких секретов не открою. Но, если вам, как и мне, надо очень быстро (вчера) начать использовать в вашем проекте карты, надеюсь, помогу сэкономить немного времени.
Если лень читать или сразу нужен вывод, отправляю в последнее “Действие 4: Это конец / TL;DR”
Действие 0: Определения
Начнем с определений: что, зачем, почему.
Задача: отобразить карту Москвы, пинами указать конкретные места, уметь построить маршрут от текущего положения до конкретной точки (или до нескольких).
Технология: Yandex.Maps API. Ссылки на документацию[1] ниже.
Итого: прочитайте документацию, реализуйте фичи.
Все выглядит просто, что может пойти не так.
Действие 1: Поиск
Прежде чем изучить документацию, её надо найти. Искать яндекс, конечно же, будем в гугле — найдем [2] или [2].ru [3]. Мы — девелоперы, видим кнопку “для девелоперов” — жмем. Огромная иконка “Maps API” выглядит как то, что нам нужно! (It’s a trap!)
В “. /maps” [4] нас ждут только бесконечный поиск, разочарование и страдания. Которые к нужной документации меня так и не привели.
Возвращаемся на шаг назад, листаем вниз и находим MapKit [5] — нам сюда. Навигация тут довольно грустная, поэтому вот важные ссылки — android samples [6] и Documentation [7] (возможно, иногда получится найти тут что-то полезное).
Действие 2: Поехали
Находим Getting started и приступаем. В начале все просто.
На “Step 3. Set up the library” возникают вопросы. Вью и фабрику нужно обязательно стартовать и останавливать отдельно, иначе, как нам сообщают, ничего не будет работать. Почему? А что будет, если что-то стартану, а что-то нет, или стартану что-то позже? А если несколько вьюх, то для каждого надо фабрику, или это синглтон?
Возможно, это всего лишь QuickStart и дальше мы найдем подробное описание! (нет)
Давайте смотреть, что есть по документации. А все, ничего больше нет. Есть только сгенерированная документация с комментариями типа:
Ладно, на гитхабе есть еще проект с примерами использования [8]. Внутри каждого класса активити есть комментарии о том, что он делает и зачем нужен (после документации это просто подарок судьбы). Есть несколько сценариев: создание кастомного слоя карты, построение маршрута для автомобиля, работа с объектами на карте и некоторые другие.
Выглядит ли апи мощным? Да.
Понятно ли как им пользоваться в случаях, чуть более сложных, чем примеры? Нет.(
Как это понять? ¯_(ツ)_/¯ Нырять с головой в код, по итогу исследований продавать книжку о том, что нашел.
Действие 3: Разрабатываем
Задача 1: отобразить карту
Сложностей не встретил, все есть в гайде.
Задача 2: отобразить пины
Нам нужен “MapObjectsActivity.java», то, что мы ищем, называется Placemarks. Смотрим в код, чтобы понять, что с ними делать.
Задача 3: построить маршрут
Наш друг тут — “MasstransitRoutingActivity.java”. Маршрут можно попросить разный: только на машине, только пешком, и так и сяк; наверняка можно еще учесть метро и другие разные штуки, но я недонырнул.
Дополнительная задача: позиционирование прямое и обратное. Надо же еще уметь определять местоположение. Прямое геокодирование — определять координаты по названию, обратное — определять название по координатам.
Для решения этой задачи придется вернуться в поиск — и найти документацию для js [9]. Она кажется гораздо более подробной и объемной (я завидую). Нам необходим “HTTP geocoding request” [10] — тут довольно понятно написано, что это и как его использовать. Дело за реализацией http запросов-ответов на мобилках.
Действие 4: Это конец / TL;DR
Общие итоги:
Яндекс карты классные. Как ими пользоваться — непонятно.
Хорошая документация, чтобы “потрогать” сервис. Ужасная документация, чтобы что-то с ним сделать. Структура ссылок — “Хрен найдешь”, качество находки — “Вот колесо, оно катится. А далее вы сами легко сможете изобрести машину, ракету, подводную лодку”.
Основные моменты:
Как отобразить карту в проекте? Ссылка [7], тут всё просто.
Как добавить пин на карту? Ключевые слова Placemark, MapObjects. Искать в samples.
Как построить маршрут? Ключевое слово MasstransitRouting. Искать в samples.
Как сделать что-то еще? Искать в samples. Если там нет, то у вас проблемы.
Источник
Интеграция карт в ваше Android-приложение
Есть много разных идей, для реализации которых могут понадобиться карты на мобильных устройствах.
Возможности таких устройств позволяют довольно оперативно получать информацию о местоположении, графические данные и графические преобразования для отображения объёма ландшафта.
В данном статье я расскажу как интегрировать возможность просмотра карт для мобильных устройств на основе Android, на примере Yandex Карт и Google Maps.
Функционал библиотек этих компаний позволяет:
- Перемещать карту
- Изменять масштаб
- Изменять виды карт
- Получать события от карты
Начнём с отечественного производителя.
Yandex
Библиотеку Yandex MapKit можно скачать с GitHub’а, там же есть версия и для iOS.
Но прежде чем начать использовать, нам надо получить API-key, для этого идём на почту и пишем письмо в support@mobmaps.yandex.ru, указав в заголовке «Map Kit запрос API-ключа». В ответ вам пришлют письмо с указанием дополнительных ссылок на документацию, на правила использования и собственно с самим ключом в теле письма (а могут и не прислать, кстати).
Пока ждём письмо, берём библиотеку и прикрепляем её к проекту.
После долгого ожидания с кружкой кофе, знакомимся с содержимым письма и информации по ссылкам, берём ключик и пишем в вашем layout’е приложения следующий код:
где заместо «you are key» вставляем полученный ключ. Всё, карта есть.
Далее код показывает, как перемещать карту на заданную координату и использовать зум:
Для использования Google Maps надо совершить куда более изощрённые действия. Я расскажу, как получить debug-key для использования карт, но процесс получения release версии похоже несколько замороченней, но я release ещё не получал.
Для получения debug-key, надо найти ваше хранилище ключей, для отладки.
По-умолчанию, путь будет выглядеть примерно так:
Затем открываем командную строку, переходим в каталог, куда установлена Java:
где путь_до_хранилища_ключей — свой путь до debug.keystore (осторожно, возможны проблемы с пробелами в пути).
После чего в том же окне будет выведен md5-ключ после «Certificate fingerprint (MD5)».
Идём по ссылке и регистрируем код.
После чего Google сгенерирует с нужным кодом для layout и встроенным кодом, берём его и вставляем к себе в layout.
Далее нам, надо наш Activity представить в примерно следующем виде:
Замечу, что Activity наследован должен быть от MapActivity хранящийся в com.google.android.maps.MapActivity.
А в манифесте прописать между тегами вставить:
И не забыть, про разрешение доступа в интернет для приложения:
В остальном функционал GoogleMaps и YandexMapKit весьма схож:
Как можно видеть, процесс интеграции карт в приложения довольно простой, а спектр использования довольно широк.
Более подробно можно ознакомиться ниже.
Определение собственной позиции
Чтобы немного расширить пример, приложу кусок кода:
Но для использования этого кода, в манифесте следует указать следующее разрешение:
Источник
Yandex map api для android
Yandex Map Kit for Android
Latest commit
Git stats
Files
Failed to load latest commit information.
README.md
Эта версия больше не поддерживается, актуальную инфрмацию о новых версиях MapKit можно найти по ссылкам:
В этом репозитории находится тестовое приложение, демонстрирующее возможности Yandex Map Kit.
- Добавлено новое API уOverlayItem setOverlayItemListener #256
- Исправлена ошибка #253
- Исправлена ошибка #249
- Исправлена ошибка #240
- Исправлена ошибка #234
- Исправлена ошибка утечки #243
- Исправлена ошибка #240
- Добавили свойство в MapEvent isGesture() #237
- Исправлены ошибки при отображении карты
- Добавлен arm64-v8a и x86_64 архитектуры
- Исправлены ошибки отображения кнопок на карте
- Добавлен пример работы с запросом разрешений на получения геопозиции
- Исправлены ошибки, приводившие к падениям
- Удалены все запросы разрешений, кроме получения геопозиции
- Клонируйте репозиторий примера git clone https://github.com/yandexmobile/yandexmapkit-android.git
- В папке yandexmapkit-sample находится пример приложения который через gradle зависимость подключает мапкит
- Данные проекты уже настроены для работы в среде Eclipse
- Импортируйте данные проекты в среду Eclipse или Android Studio
- Выполняете Gradle Sync для проекта.
- Подставьте свой API ключ во все layout где используется объект MapView
- Всё готово к запуску тестового проекта
Запуск из командной строки.
Миграция с первой версии
- При создании OverlayItem необходимо в конструкторе вместо объекта Bitmap передавать Drawable, можно воспользоваться new BitmapDrawable(you_bitmap)
- При создании объекта BalloonItem необходимо в конструкторе передавать Context (необходимый для загрузки ресурсов)
- Исправить использования интерфейса с OnBallonListener на OnBalloonListener и добавить новые методы из данного интерфейса
- Исправить имя метода у BalloonItem с setOnBallonListener на setOnBalloonViewClickListener
- Необходимо изменить логику работы интерфейса OnBalloonListener метода onBallonClick на onBalloonViewClick
Интеграция с Яндекс.Картами
Документация по интеграции с мобильными Яндекс.Картами выложена на tech.yandex.ru
Также у этого проекта есть:
- Wiki, в которой содержится полезная информация о Yandex Map Kit.
- JavaDoc, который находится в yandexmapkit-library/doc. В нем содержится описание классов и методов Yandex Map Kit.
Если вы хотите сообщить об ошибке или предложить идею в развитии, то напишите об этом, пожалуйста, в Issues.
Источник
Путь с указателями направления на карте с использованием Yandex Map Kit для Android
В этом сообщении рассмотрим:
- Встраивание библиотеки Yandex Map Kit Android в проект
- Создание расширения для класса Overlay с целью вывода на карту пути с указателями направления и обработки событий «onClick» по карте
1. Встраивание библиотеки в проект (Eclipse, Windows)
Загружаем архив с библиотекой отсюда и получаем API-ключ.
Создаем проект в Eclipse, копируем с заменой папки \yandexmapkit-library\res и \yandexmapkit-library\libs из загруженного архива в папку нашего проекта.
В настройках проекта добавляем ссылку на yandexmapkit-android.jar из папки libs нашего проекта (Build Path->Configure Buil Path->Libraries->Add External JARs)
Добавляем разрешения в манифест нашего проекта
Изменяем разметку activity
2. Создание расширения для класса Overlay с целью вывода на карту пути с указателями направления и обработки событий «onClick» по карте
Чтобы нарисовать путь, нам потребуется расширить класс OverlayIRender, который реализует интерфейс IRender
Если количество точек добавленных в наш путь больше 1, то в цикле отрисовываются отрезки пути и стрелки направления.
Теперь нужно создать наследника Overlay MyPathOverLay, назначить ему MyOverlayIRender для отрисовки.
Источник
Переходим с Google Maps на Yandex MapKit
Недавно довелось перевести приложение с использования Google Maps API v1 на Yandex MapKit.
По субъективному мнению большинства Yandex карты для России имеют более высокую детализацию, и поэтому, если ваше приложение ориентировано только на Росиию или ex-USSR и Турцию (в общем на те страны где Yandex есть), то имеет смысл рассмотреть возможность использования MapKit’а.
Приложение имеет следующую функциональность: карта с точками объектов на ней и возможностью поиска этих точек по адресу, отображением текущего местоположения и зумом. По каждой точке можно тапнуть и увидеть всплывающий баллун, содержащий дополнительную информацию о точке. При тапе на отдельном баллуне открывается новая активити с детальной информацией о данной точке и куском карты, отображающим только одну эту единственную точку.
Начнем… Идем на github и забираем оттуда библиотеку. Если вы подумали, что раз библиотека распространяется через GitHub, то она OpenSource, то тут вас ждет разочарование. Библиотека распространяется как Android Library Project + jar-файл с кучей обфусцированных классов, который лежит в папочке libs . Исходников нет, таким образом, заглянуть внутрь и понять что как работает мы не можем, а порой очень хочется, т.к. документация (в папке с библиотекой есть javadoc ) мягко говоря плохая: описание существующего API минимально, а многие методы не документированы вообще. Поэтому лежащий по соседсвту с библиотекой sample проект очень пригодится.
Кстати не пугайтесь обилия открытых задач на гитхабе. Это не обязательно баги — это такой способ задать вопрос в комьюнити по использованию библиотеки. Какого-нибдуь форума или отдельно выделенного места для подобных вопросов не существует. Есть вопрос? Создай issue!
Для получения ключа необходимо отправить запрос в тех. поддержку яндекса, а до тех пор пока его нам не выдали, в качестве debug -ключа можно использовать ключ вида 1234567890 (Спасибо sample-проекту, в документации об этом ни слова). К слову о ключах — здесь нас ожидает первый сюрприз: MapView не читает ключ из файла ресурсов, поэтому если у вас есть несколько лейаутов, содержащих внутри MapView , то ключ придется копировать в каждый из MapView , вынести его в файл конфигурации и доступаться к нему через @string/api_key не удастся. Эта загадка отняла у меня кучу времени, соответствующая задача была создана давным давно, но как видите за 3 месяца ситуация не изменилась. В общем, скорость реакции поддержки Yandex’а пугает.
Итак, после получения либы, первым делом решено было собрать sample-project и поиграть с ним. В репозитории лежат файлики Eclipse проекта, я же использую IntelliJ IDEA, поэтому первым делом необходимо было создать и настроить проект из существующих исходников. Здесь поджидал сюрприз — я досих пор так и не понял до конца в чем было дело, но ситуация была следующая: проект нормально компилировался и упаковывался в apk , но затем в рантайме при попытке перехода на любую из активитей падал с ошибкой string resource not found (дословный текст ошибки сейчас не помню). В файлах библиотеки лежит пустой R -файл заглушка, рискну предпложить, что проблема была в том, что IDEA по каким-то причинам в финальный apk -файл запаковывала именно его, что и приводило к дальнейшим ошибкам. Проблема решилась удалением из зависимостей sample-project модуля библиотеки и его повторным добавлением.
Казалось бы, обе библиотеки имеют схожее API и переход не должен отнять слишком много времени: и там и там MapView , и там и там MapController , и там и там GeoPoint … Но на этом сходства заканчиваются. Несмотря на одинаковые имена классов методы называются по разному и не для каждого метода из Google API существует его прямой аналог из MapKit. Например, в MapKit’е остутствует метод, позволяющий получить координаты ViewPort ‘а (видимой области карты), поэтому его придется реализовывать самостоятельно — через преобразование экранных ( ScreenPoint ) координат в глобальные ( GeoPoint ) — тыц. Экранные координаты нужно отсчитывать не относительно экрана, а относительно самого MapView .
В Google Maps баллун (сплывающее вью при тапе по точке) один элемент вместе с самой точкой, в MapKit’е — это отдельный объект. Поэтому логику работы баллунами придется переписать почти полностью.
В Google API GeoPoint хранит координаты в виде пары int ‘ов — это longitude / latutude * 1E6 , у Yandex’а это double longitude и latitude. С одной стороны, использование int ‘ов вместо double ‘ов позволяет сэкономить пару байт памяти и ускорить вычисления связанные с координатами (целочисленные операции всегда быстрее операций с плавающей точкой). С дургой стороны, это наводняет код конструкциями вида: *1E6 , /1E6 . В общем, здесь я ставлю плюсик Yandex’у, без постоянных умножений/делений на 1E6 с API работать удобнее, а соотношение удобства к выигришу в производительности, по-моему, в данной ситуации не велико.
Еще одной сложностью стало непредсказуемое поведение Balloon ‘ов. Дело в том, что время от времени открываемые баллуны отображаются под другими OverlayItem ‘ами и оказываются перекрытыми. При этом метод setPriority , который есть у всех отображаемых на карте элементах никакого влияния не оказывает. Как выяснилось позже причина не правильного переопределения метода compareTo . Данный метод используется при показе баллуна для сортировки объектов в z-плоскости. Ни документация, ни пример не содержат никакой информации о данной проблеме, данная зависимость вообще была установлена совершенно случайно в ходе экспериментов.
Ну и напоследок еще одно значительное отличие Yandex MapKit от Google Maps это то, что MapKit не поддерживает прямой геокодинг, только обратный. Т.е. библиотека предоставляет способ преобразовать географичиеские координаты (lat/long) в адрес или название места (см. класс GeoCode ). А вот в обратную сторону — улицу или город в координаты не умеет, поэтому прямой геокодинг придется реализовывать самостоятельно, например, с использованием того же Yandex Maps Web API. Google же умеет это делать сразу в обе стороны.
В заключение хотелось бы сказать, что в целом, впечатление от использования Yandex Maps положительные, API достаточно удобное, возможностей для моих задач оказалось достаточно, но основной минус — документация. Будем надеятся, что Яндекс все-таки приведет все в порядок.
Источник