Как сделать карту на андроид

Весь мир в кармане или как сделать мобильную карту за пару дней

Как сделать карту на андроид

В прошлой статье я рассказывал о том, как можно быстро сделать Web-звонилку. А что если поставить более амбициозную задачу — собрать своё собственное приложение с картой, без рекламы и с блэк-джеком? А если всего за пару дней?

Давайте сделаем это! Прошу под кат.

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

Выбираем движок карты

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

Следующий шаг — выбираем картодвижок. На просторах интернета их довольно мало, бесплатных ещё меньше, а с поддержкой офлайна вообще единицы. Предлагаю воспользоваться довольно крутым вариантом — mapsforge/vtm. Это векторный OpenGL движок, очень шустрый, поддерживает офлайн, Android, iOS, различные источники данных, кастомную стилизацию, оверлеи, маркеры, 3D и даже 3D-модели объектов! Очень, очень круто.

В репозитории достаточно много примеров для быстрого старта, есть готовые карты, есть плагин, позволяющий собрать собственную карту из данных в OSM формате. Итак, приступаем!

Создаём источник данных MapFileTileSource, указываем местонахождение файла карты. Дополнительно позиционируемся в центр интересующего нас баундинг-бокса, чтоб не оказаться где-то за пределами выбранной локации при старте приложения. Устанавливаем дефолтную тему. Добавляем слой домов и слой подписей. На этом всё. Запускаем — чудеса!

Как сделать карту на андроид

Кажется, быстрее и проще и быть не может.

Делаем геокодинг

Следующий важный шаг — реализация геокодинга. Сама по себе карта — это уже неплохо, но нужна интерактивность. Мы хотим тапать в карту и видеть информацию по объекту, в который попали. И здесь есть некоторая сложность. По большому счёту, полноценный геокодинг в нашей библиотеке отсутствует. Это, пожалуй, самый большой её минус. Если ничего не изобретать, то мы можем воспользоваться имеющейся функциональностью.

Получилось относительно многословно. Нужно найти тайл, получить ways (в терминологии OSM way — это линейный объект), и можно из них извлечь какую-то атрибутику. Помимо ways есть возможность получить ещё и POI, но на этом всё. Остальную логику придется накручивать самостоятельно: выбирать «правильный» из всего множества объектов, в которые попал клик, фильтровать по зум-левелам. И ещё один момент. Фактически, мы теряем информацию об исходной геометрии и получаем в ответ на поиск просто набор линий. Если захочется сделать ещё и гео-редактор, то этого явно будет недостаточно.

Но для демонстрации подхода нас всё устраивает.

Как сделать карту на андроид

«Продвинутый» геокодинг

Вообще говоря, есть более продвинутый вариант. Для этого нам понадобится своя база. В частности, можно воспользоваться SQLite. Правда, нам недостаточно будет стандартного SQLite, и придётся собирать свой, подключив к нему плагин RTree для геопоиска. Как это сделать, я уже рассказывал в статье, раздел «Делаем хороший поиск».
В этом случае мы получаем полный контроль над данными, можем сохранять всё, что требуется, и в нужном формате. Еще и Full Text Search сможем прикрутить и искать наши геообъекты и фирмы по названию, адресу и другим атрибутам.

Один из вариантов реализации можно посмотреть в репозитории.

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

Добавляем важные мелочи

Давайте добавим пару важных функций.

Начнём с текущей геопозиции. В mapsforge/vtm для этого как раз имеется спец. слой LocationLayer. Использование крайне простое.

Есть только один недостаток — это постоянная пульсация «синей точки» на границе экрана, когда текущая локация находится за пределами карты. Скорее всего, в процессе использования вы редко будете оказываться в такой ситуации, но это вызывает постоянный перерендеринг, соответственно, немного нагружает процессор. Избавиться от этого немного сложнее, нужно залезть в шейдер и поправить его. Но это уже совсем для перфекционистов. Как сделать — можно посмотреть тут.

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

Ещё нам понадобятся кнопки зума.

И вишенка на торте — компас.

Как сделать карту на андроид

Захватываем мир

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

И дела обстоят так, что с нашим движком это намного проще, чем кажется.
Нам нужно немного модифицировать метод загрузки карты, добавив в него MultyMapTileSource. Это по сути враппер для любых других источников тайлов, который позволяет отображать на карте сразу всё, что в него добавлено. Просто киллер-фича. В итоге нам остаётся подготовить карту мира с минимальной детализацией, добавить её самой первой в наш враппер, а поверх рисовать всё остальное. Более того, мы можем сразу добавить все карты, какие у нас есть в каталоге с картами приложения! Шикарно, просто шикарно. И не забываем, что это офлайн 🙂

Пожалуй, мы готовы к релизу. Собираем билд, выкладываем в маркет и получаем заслуженные звёзды 🙂

Пара ложек дёгтя в огромной бочке мёда

Движок open source, развивается активно, но команда у него, прямо скажем, довольно скромная. По большому счёту это один человек под ником devemux86. И ещё пара ребят контрибьютят время от времени.

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

Есть еще один нюанс, который может не понравиться. Это отрисовка скруглений и окружностей. Пример того, как это выглядит, на скриншоте:

Как сделать карту на андроид

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

Пожалуй, это все минусы на сегодня. Вам решать, сможете вы с ними жить или нет. А мы тем временем используем эту библиотеку уже более 1,5 лет, полёт отличный, по крайней мере, на Андроиде.

Итоги

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

Если возникнет интерес, в следующей статье покажу, как сделать этажи а-ля 2ГИС. И это на самом деле гораздо проще, чем кажется 🙂

Источник

10 приложений для скидочных карт на Android

Задача дисконтных ПО – освободить кошелек пользователя от скопившихся пластиковых карточек. Все данные переносятся в учетную запись и хранятся там. Для того чтобы воспользоваться скидкой в магазине, нужно просто поднести экран к фотосканеру. Так как данное нововведение зарекомендовало себя не везде, предлагаем рассмотреть 10 приложений, «признанных» всеми считывающими системами.

Pinbonus

Как сделать карту на андроид

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

Stocard

Как сделать карту на андроид

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

Кошелек

Как сделать карту на андроид

Getcard

Как сделать карту на андроид

В Геткард можно не только пользоваться скидками, но и зарабатывать. Схема продумана весьма интересно:

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

Cardved

Как сделать карту на андроид

В данном приложении, помимо дисконтных карт, можно хранить визитки. Их можно вручную создавать и редактировать. Есть платная платформа (без рекламы). В остальном – повторяются функции предыдущих кошельков.

Verycard

Как сделать карту на андроид

Верикард обладает массой полезных функций. Вот некоторые из них:

Приложение условно разделено на клиентскую и административную часть. Таким образом, ПО радует покупателей и облегчает работу владельцев магазинов за счет слаженной обратной связи.

QIWI Бонус

Как сделать карту на андроид

Программа является проектом QIWI – компании, создавшей одноименный электронный кошелек. Дизайн ПО продуман до мелочей: удобные виртуальные полки, оповещения от брендовых магазинов, быстрый доступ к картам. Данные дисконтов хранятся на облаке. Приложение работает в offline режиме.

WhereAreMyCards

Как сделать карту на андроид

Функции приложения полностью повторяют вышеуказанные. Скидочные карты можно отправлять и дарить другим пользователям. Также дисконты можно сделать общедоступными. Если у вас бонусы закончились – «стащите» немного у других! И да, это законно, ведь владельцы карт дали на это разрешение.

VirtualCards

Как сделать карту на андроид

Отличительная черта VirtualCards – возможность создавать список покупок. Программа – незаменимый помощник для забывчивых пользователей, она будет вас сопровождать вплоть до выхода из магазина. Создавать список можно в текстовом формате или голосовом. Дисконты? Куда же без них! Хранить скидочные карты можно прямо здесь.

Wallet

Как сделать карту на андроид

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

Источник

Карты в вашем Android-приложении

Как сделать карту на андроид

Довольно часто перед разработчиком мобильного приложения возникает необходимость отобразить что либо на карте. Какие же варианты есть у разработчика?

Я рассматривал два варианта.

Вариант 1. Внешнее приложение с картой

Пожалуй, самый простой в реализации вариант. Когда нужно, вы просто открываете сторонее приложение с картой — создаете uri вида geo: широта, долгота, в параметре z можно указать масштаб (от 1 до 23):

При этом, если на аппарате пользователя установлено несколько приложений с картами, то пользователю будет предложено выбрать в каком приложении должна быть показана заданная точка:

Как сделать карту на андроид

Да-да. Таким способ показывается именно заданная точка, а не просто карта (хотя, Яндекс.Карты показывают просто карту и, судя по моей переписке с ними, считают, что так и надо).

Вариант 2. Встроенная карта

Встроенная карта более сложна в реализации. Не буду останавливаться на всех деталях, основное хорошо описано в документации.

Остановлюсь лишь на некоторых тонкостях.

Maps API Key

Для работы встроенной карты необходимо получить ключи. Ключи, а не ключ, потому что для debug-версии и для release-версии вашего приложения ключи будут разными.
Чтоб не менять ключи вручную каждый раз, можно создать два layout’a с картой и написать в коде что-то типа:

Другие варианты (в т.ч. для определения debug/release-версии сборки) можно найти тут.

Текущее положение

Для отображения текущего положения на карте необходимо написать следующее:

Не забудьте отключить определение местоположения при остановке/закрытии activity:

Маркеры

На карту маркеры добавляются просто:

При этом если добавить несколько маркеров, то все маркеры на одном слое будут одинаковыми. Как сделать маркеры разными (как на скриншоте выше — желтыми, красными, зелеными)? Либо создать несколько слоев, либо воспользоваться методом SetMarker:

Без первых трех строк вместо маркера будет показана пустота.
Если не использовать отрицательные значения w и h и не делить их пополам, то у маркеров будет неправильная тень.

Источник

Добавление карт в приложение Android с помощью служб Google Play

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

В этой статье мы рассмотрим API-интерфейс Google Maps Android, который позволяет добавлять в приложение карты на основе Google Maps. API автоматически обрабатывает доступ к серверам Google Maps, загрузку данных, отображение карты и реакцию на жесты карты. Вы можете использовать вызовы API для добавления маркеров, многоугольников и наложений на базовую карту и для изменения вида пользователя определенной области карты. Эти объекты предоставляют дополнительную информацию для местоположений на карте и позволяют пользователю взаимодействовать с картой.

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

Получить ключ API

Чтобы использовать Google Maps Android API, необходимо зарегистрировать проект приложения в консоли разработчиков Google и получить ключ API Google, чтобы добавить свое приложение.

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

Инструменты Android SDK автоматически генерируют отладочный сертификат при первом создании отладочной сборки, поэтому все, что нам нужно сделать, это получить его. Файл называется debug.keystore и по умолчанию он хранится в том же каталоге, что и файлы виртуального устройства Android (AVD):

Чтобы просмотреть сведения о сертификате, выполните следующее:

Linux или OS X

Windows

Вы попадете на панель управления проектом, в центре экрана нажмите «Использовать API Google».

Как сделать карту на андроид

После включения API нажмите Перейти к учетным данным на левой панели.

Как сделать карту на андроид

Как сделать карту на андроид

Как сделать карту на андроид

В следующем диалоговом окне вы можете изменить имя ключа, но я оставил его как ключ Android по умолчанию 1

Как сделать карту на андроид

Добавление карты

Добавьте следующее в файл build.gradle (Module: app) и синхронизируйте gradle.

Добавьте следующее как дочерний элемент элемента manifest в файле manifest.

Google Maps Android API использует OpenGL ES версии 2 для визуализации карты. Если OpenGL ES версии 2 не установлен, ваша карта не появится. Рекомендуется включить приведенный выше код в файл манифеста, который уведомляет внешние службы об этом требовании. В частности, он не позволяет Google Play Store отображать ваше приложение на устройствах, которые не поддерживают OpenGL ES версии 2.

Если вы нацелены на версию 8.3 или более позднюю версию SDK служб Google Play, вам больше не нужно разрешение WRITE_EXTERNAL_STORAGE для использования Google Maps Android API.

Если ваше приложение ориентировано на уровень API 23 (Android 6.0), который требует использования разрешений во время выполнения, вы должны использовать версию 8.3 или более позднюю из SDK сервисов Google Play.

Следующие разрешения определены в манифесте сервисов Google Play и автоматически объединяются с манифестом приложения во время сборки. Вам не нужно явно добавлять их в манифест:

Чтобы добавить карту в ваше приложение, добавьте объект Fragment в Activity который будет обрабатывать карту. Вы можете сделать это в коде или XML-файлах макета. Мы будем использовать последний метод.

Измените activity_main.xml, как показано ниже:

Запустите приложение, и вы увидите карту, встроенную в вид.

Как сделать карту на андроид

Вид карты по умолчанию показывает вид Земли с камерой, центрированной по экватору и перпендикулярно поверхности. Вы можете настроить начальное состояние карты, изменив настройки, такие как положение камеры (включая: местоположение, масштаб, направление и наклон), тип карты, включая кнопки масштабирования или компаса на экране, жесты, которые пользователь может использовать для управления камера, включен ли облегченный режим (растровое изображение карты, которая поддерживает подмножество функций, предоставляемых полным API).

Вы можете настроить начальное состояние карты либо через XML, либо программно.

Обновите фрагмент в файле activity_main.xml :

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

Как сделать карту на андроид

Выше мы включили настройки для положения камеры, такие как местоположение, масштаб, направление и наклон. cameraBearing устанавливает направление, в котором вертикальная линия на карте указывает, в градусах по часовой стрелке от севера. cameraTargetLat и cameraTargetLng устанавливают местоположение центра карты. cameraTilt устанавливает положение камеры на дуге между прямым положением по центру карты и поверхностью Земли. cameraZoom определяет масштаб карты, при больших уровнях масштабирования на экране может быть больше деталей, в то время как при меньших уровнях масштабирования на экране больше мира.

Мы устанавливаем mapType в normal который является типом карты по умолчанию. Другие доступные варианты описаны ниже.

Последний набор настроек определяет, появятся ли на экране элементы управления компасом и масштабированием, а также включает / отключает некоторые жесты.

Установка состояния карты программно

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

Измените определение класса:

Вышеуказанный объект получает объект GoogleMap и устанавливает тип карты и положение камеры, а затем перемещает камеру в это положение.

Запустите приложение, и вы должны увидеть карту с установленной конфигурацией.

Как сделать карту на андроид

Вы можете использовать animateCamera() вместо moveCamera() чтобы получить хороший эффект перемещения камеры на место при загрузке карты.

Добавление маркеров на карту

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

Здесь мы создали три маркера. Первый имеет пользовательский значок, в то время как остальные будут иметь значок по умолчанию. Второй маркер использует snippet() для отображения большего количества данных в информационном окне при касании маркера. Два других будут отображать только текст заголовка.

Как сделать карту на андроид

Отображение текущего местоположения пользователя

Вашему приложению может потребоваться показать местоположение пользователя на карте. Это можно сделать либо с помощью API местоположения сервисов Google Play, либо с помощью слоя «Мое местоположение» и кнопки «Мое местоположение», чтобы отобразить текущее местоположение пользователя на карте.

Слой «Мое местоположение» предоставляет простой способ отображения местоположения устройства на карте. Чтобы использовать это, вам нужно разрешение на местоположение.

Добавьте следующее разрешение в файл манифеста.

Здесь мы запрашиваем coarse данные о местоположении, но для большей точности вы можете запросить fine данные.

Добавьте следующее в onMapReady() после кода, который создает маркеры.

Запустите приложение, и вы увидите кнопку « Мое местоположение» в правом верхнем углу карты. При нажатии на кнопку камера центрирует карту по текущему местоположению устройства, если оно известно. Местоположение обозначено на карте маленькой синей точкой, если устройство неподвижно, или как шеврон, если устройство движется.

Как сделать карту на андроид

Слой My Location не возвращает никаких данных. Если вы хотите получить доступ к данным о местоположении программным способом, вам следует использовать API определения местоположения Google Play Services.

API определения местоположения сервисов Google Play является предпочтительным способом добавления информации о местоположении в ваше приложение Android. Он имеет другие функциональные возможности, не предоставляемые слоем «Мое местоположение», что позволяет вам:

Вывод

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *