Как сделать карту android studio

Добавил пользователь Alex
Обновлено: 04.10.2024

В этой статье мы рассмотрим 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):

  • OS X и Linux:~ / .android /
  • Windows: C: \ Users \ yourusername.android \

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

Linux или OS X

Windows

Боковая панель приборной панели

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

Боковая панель приборной панели

Добавить учетные данные

Выберите ключ Android .

Создать ключ

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

Назовите ключ

В Android Studio создайте новый проект, который я назвал моим MapDemo01 . Убедитесь, что у него есть имя пакета, которое соответствует тому, которое вы использовали при генерации ключа в консоли разработчика Google, в противном случае вам придется изменить имя пакета в консоли разработчика, чтобы оно соответствовало вашему приложению.

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

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

В файле манифеста добавьте следующее как дочерний элемент тега application . Замените ваш ключ API в атрибуте value .

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

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

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

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

Если вы ориентируетесь на более ранние версии SDK сервисов Google Play, вы должны запросить разрешение android.permission.WRITE_EXTERNAL_STORAGE .

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

Карты представлены в API классами GoogleMap и MapFragment .

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

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

Выше мы добавили фрагмент к действию и установили для его атрибута android:name com.google.android.gms.maps.MapFragment . Это присоединяет MapFragment к действию. Если вам требуется поддержка старых устройств, используйте com.google.android.gms.maps.SupportMapFragment из библиотеки поддержки.

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

Просмотр карты

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

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

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

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

Просмотр карты

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

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

  • Нормальный: Типичная дорожная карта. Показаны дороги, некоторые искусственные объекты и важные природные объекты, такие как реки. Метки дорог и объектов также видны.
  • Гибрид: добавлены спутниковые фотографии с дорожными картами. Метки дорог и объектов видны.
  • Спутник: спутниковые фотографии. Метки дорог и объектов не видны.
  • Местность: Топографические данные. Карта содержит цвета, контурные линии и метки, а также затенение перспективы. Некоторые дороги и метки также видны.
  • Нет: нет плитки. Карта отображается как пустая сетка без загруженных плиток.

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

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

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

Измените activity_main.xml, как показано ниже, чтобы включить только базовый MapFragment . Мы добавим больше конфигурации на карту в коде.

В MainActivity мы реализуем интерфейс OnMapReadyCallback и OnMapReadyCallback использовать onMapReady обратного вызова onMapReady чтобы получить дескриптор объекта GoogleMap . Объект GoogleMap является внутренним представлением самой карты. Чтобы установить параметры просмотра карты, измените ее объект GoogleMap .

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

Добавьте onMapReady обратного вызова onMapReady .

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

Добавьте следующее в конец onCreate() . Мы вызываем getMapAsync() для фрагмента, чтобы зарегистрировать обратный вызов.

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

Просмотр карты

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

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

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

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

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

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

Просмотр карты

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

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

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

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

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

Просмотр карты

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

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

Вывод

Мы только что коснулись возможностей API Карт Google, он предлагает множество других функций, включая отображение тепловых карт, рисование фигур на карте, преобразование объектов KML (расширение формата данных XML) в географические фигуры и их рендеринг. как слой поверх карты и многое другое. Чтобы узнать больше об API, ознакомьтесь с документацией .

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

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

Google Maps

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

Webviews

Это кажется отличной альтернативой. Я уверен, что могу придумать простую карту изображений, которая даст вам больше информации при нажатии на определенное здание. Единственная проблема в том, что вам также нужен интернет соединение.

OpenGL?

Я никогда не рассматривал это слишком много, но я слышал, что это трудно и больно реализовать. Он мог бы работать локально, но стоит ли это того?

есть ли другой способ разработки интерактивной карты? Что-то нужно иметь в виду, что я также хотел бы когда-нибудь перенести это на iOS (Если у кого-то есть опыт с этим)

Если вы хотите полный контроль и удобно использовать html и javascript, я бы настоятельно рекомендовал использовать с открытым исходным кодом OpenLayers библиотека. Вы можете создать html-страницу, сохранить ее в активах и запустить локально на устройстве. Вы можете создать свой собственный набор картографических листов или даже использовать один файл jpeg, а затем "отобразить" здания, которые вы хотите на нем, а затем использовать простой, но обширный API OpenLayers, чтобы обеспечить выбор здания и отображение информации. Он даже имеет мультитач функциональность встроенная для панорамирования и масштабирования. Отлично работает на мобильном телефоне.

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

ps. У меня нет принадлежности к OpenLayers, кроме активного использования его для моих проектов.

Для работы с SDK нужно вызвать метод initialize() объекта DGis, указав контекст приложения и набор ключей доступа (объект ApiKeys).

В SDK используется два ключа: map (основной ключ SDK) и directory (ключ доступа к дополнительным API: справочнику объектов и маршрутизатору).

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

Чтобы создать карту, добавьте MapView в ваш activity:

Для карты можно указать начальные координаты ( cameraTargetLat - широта; cameraTargetLng - долгота) и масштаб ( cameraZoom ).

MapView также можно создать программно. В таком случае настройки можно указать в виде объекта MapOptions.

Объект карты (Map) можно получить, вызвав метод getMapAsync() :

Общие принципы работы Отложенные результаты

Некоторые методы SDK (например те, которые обращаются к удалённому серверу) возвращают отложенные результаты (Future). Для работы с ними нужно создать обработчик получения данных и обработчик ошибок.

Пример получения объекта из справочника:

По умолчанию обработка результатов происходит в UI-потоке. Чтобы это изменить, для onResult и onError можно указать Executor.

Подробнее про работу со справочником можно посмотреть в разделе Справочник объектов.

Потоки значений

Некоторые объекты SDK предоставляют потоки значений, которые можно обработать, используя механизм каналов: на поток можно подписаться, указав функцию-обработчик данных, и отписаться, когда обработка данных больше не требуется. Для работы с потоками значений используется интерфейс Channel.

Пример подписки на изменение видимой области карты (поток новых прямоугольных областей):

После окончания работы с каналом важно отменить подписку, чтобы избежать утечки памяти. Для этого нужно вызвать метод close() :

Источники данных для карты

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

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

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

Чтобы удалить созданный источник данных и все связанные с ним объекты, нужно вызвать метод карты removeSource() :

Список активных источников данных можно получить, используя свойство map.sources .

Добавление объектов

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

Для добавления объектов используются методы addObject() и addObjects(). Для каждого динамического объекта можно указать поле userData , которое будет хранить произвольные данные, связанные с объектом. Настройки объектов можно менять после их создания.

Для удаления объектов используются методы removeObject() и removeObjects(). Чтобы удалить все объекты, можно использовать метод removeAll().

Маркер

Чтобы добавить маркер на карту, нужно создать объект Marker, указав нужные настройки, и передать его в вызов addObject() менеджера объектов.

В настройках нужно указать координаты маркера (параметр position ).

Чтобы изменить иконку маркера, нужно указать объект Image в качестве параметра icon . Создать Image можно с помощью следующих функций:

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

Дополнительно можно указать текст для маркера и другие настройки (см. MarkerOptions).

Линия

Чтобы нарисовать на карте линию, нужно создать объект Polyline, указав нужные настройки, и передать его в вызов addObject() менеджера объектов.

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

Свойство-расширение .lpx преобразует целое число в объект LogicalPixel.

Многоугольник

Чтобы нарисовать на карте многоугольник, нужно создать объект Polygon, указав нужные настройки, и передать его в вызов addObject() менеджера объектов.

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

Дополнительно можно указать цвет полигона и параметры обводки (см. PolygonOptions).

Кластеризация

Для добавления маркеров на карту в режиме кластеризации нужно создать менеджер объектов (MapObjectManager) через MapObjectManager.withClustering(), указав инстанс карты, расстояние между кластерами в логических пикселях, максимальный zoom-уровень формирования кластеров и пользовательскую имплементацию протокола SimpleClusterRenderer. SimpleClusterRenderer используется для кастомизации кластеров в MapObjectManager.

Управление камерой

Для работы с камерой используется объект Camera, доступный через свойство map.camera .

Перелёт

Чтобы запустить анимацию перелёта камеры, нужно вызвать метод move() и указать параметры перелёта:

  • position - конечная позиция камеры (координаты и уровень приближения). Дополнительно можно указать наклон и поворот камеры (см. CameraPosition).
  • time - продолжительность перелёта в секундах (Duration).
  • animationType - тип анимации (CameraAnimationType).

Функция move() возвращает объект Future, который можно использовать, чтобы обработать событие завершения перелёта.

Для указания продолжительности перелёта можно использовать расширение .seconds :

Для более точного контроля над анимацией перелёта можно использовать контроллер перелёта, который будет определять позицию камеры в каждый конкретный момент времени. Для этого нужно реализовать интерфейс CameraMoveController и передать созданный объект в метод move() вместо параметров перелёта.

Получение состояния камеры

Текущее состояние камеры (находится ли камера в полёте) можно получить, используя свойство state . См. CameraState для списка возможных состояний камеры.

Подписаться на изменения состояния камеры можно с помощью свойства stateChannel .

Получение позиции камеры

Текущую позицию камеры можно получить, используя свойство position (см. объект CameraPosition).

Подписаться на изменения позиции камеры (и угла наклона/поворота) можно с помощью свойства positionChannel .

Моё местоположение

На карту можно добавить специальный маркер, который будет отражать текущее местоположение устройства. Для этого нужно добавить на карту источник данных MyLocationMapObjectSource.

Получение объектов по экранным координатам

Информацию об объектах на карте можно получить, используя пиксельные координаты. Для этого нужно вызвать метод карты getRenderedObjects(), указав координаты в пикселях и радиус в экранных миллиметрах. Метод вернет отложенный результат, содержащий информацию обо всех найденных объектах в указанном радиусе на видимой области карты (список RenderedObjectInfo).

Пример функции, которая принимает координаты нажатия на экран и передаёт их в метод getRenderedObjects() :

Справочник объектов

Для поиска объектов в справочнике нужно создать объект SearchManager, вызвав один из следующих методов:

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

Если идентификатор (ID) объекта известен, то для получения информации о нём нужно вызвать метод searchById(). Метод вернёт отложенный результат DirectoryObject.

Если ID объекта не известен, то можно создать поисковый запрос (объект SearchQuery) с помощью SearchQueryBuilder и передать его в метод search(). Вызов вернёт отложенный результат SearchResult, содержащий список найденных объектов (DirectoryObject), разделенный на страницы.

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

Также с помощью справочника можно получать подсказки при текстовом поиске объектов (см. Suggest API для демонстрации). Для этого нужно создать объект SuggestQuery с помощью SuggestQueryBuilder и передать его в метод suggest(). Вызов вернёт отложенный результат SuggestResult, содержащий список подсказок (Suggest).

Построение маршрута

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

Чтобы найти маршрут между двумя точками, нужно вызвать метод findRoute(), передав координаты точек в виде объектов RouteSearchPoint. Дополнительно можно указать параметры маршрута (RouteOptions), а также список промежуточных точек маршрута (список RouteSearchPoint).

Вызов вернёт отложенный результат со списком объектов TrafficRoute. Чтобы отобразить найденный маршрут на карте, нужно на основе этих объектов создать объекты RouteMapObject и добавить их в источник данных RouteMapObjectSource.

Вместо пары TrafficRouter и RouteMapObjectSource для построения маршрута можно использовать RouteEditor и RouteEditorSource. В таком случае не нужно обрабатывать список TrafficRoute, достаточно передать координаты маршрута в виде объекта RouteParams в метод setRouteParams() и маршрут отобразится автоматически.

Собственный источник геопозиции

В рамках SDK можно использовать произвольный источник геопозиции. Для этого нужно реализовать интерфейс LocationSource.

Чтобы зарегистрировать созданный источник в SDK, нужно вызвать функцию registerPlatformLocationSource().

Основная точка входа в интерфейс - функция activate() . Когда SDK потребуется геопозиция, в эту функцию будет передан объект LocationChangeListener. После этого, чтобы сообщить текущую геопозицию, нужно передать в него массив объектов Location (от более старой позиции к более новой), используя метод onLocationChanged().

Чтобы сообщить изменение доступности источника, можно вызвать метод onAvailabilityChanged().

Дополнительно можно менять логику определения геопозиции в зависимости от требуемой точности. Требуемая точность передаётся в функцию setDesiredAccuracy() в виде объекта DesiredAccuracy.

Когда источник геопозиции больше не требуется, будет вызвана функция deactivate() .

Как зарегистрировать андроид-приложение в Google Maps API и как добавить карты в ваше приложение на android, с помощью Android Studio и службы Google Framework для создания простых картографических приложений на Android, вы узнаете в этом уроке. Нужно выполнить следующие шаги:
1.Настроить Android Studio для Maps API
2.Получить ключ API key для Google Maps Android API
3.Добавить карту на экран приложения, используя MapFragment

Виталий Непочатов

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

5 полезных сервисов для бесплатного образования и поиска работы

5 полезных сервисов для бесплатного образования и поиска работы

127 полезных и бесплатных онлайн академий

127 полезных и бесплатных онлайн академий

Ресурсы для objective-C программистов

Ресурсы для objective-C программистов

' data-post_id="301308" data-user_id="0" data-is_need_logged="1" data-lang="en" data-decom_comment_single_translate=" комментарий" data-decom_comment_twice_translate=" комментария" data-decom_comment_plural_translate=" комментариев" data-multiple_vote="1" data-text_lang_comment_deleted='Комментарий удален' data-text_lang_edited="Отредактировано в" data-text_lang_delete="Удалить" data-text_lang_not_zero="Поле не NULL" data-text_lang_required="Это обязательное поле." data-text_lang_checked="Отметьте один из пунктов" data-text_lang_completed="Операция завершена" data-text_lang_items_deleted="Объекты были удалены" data-text_lang_close="Закрыть" data-text_lang_loading="Загрузка. ">

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