Создание SVG карты в Android Studio
Практически везде рассматривается добавление именно готовых карт Google Maps. Что делать если нужно добавить в приложение свою, кастомную SVG карту. Из функционала достаточно зума и кликабкльных меток.
Отслеживать
задан 12 дек 2022 в 6:14
79 1 1 серебряный знак 10 10 бронзовых знаков
Что делать — углубляться в вопрос и писать самому или поискать (возможно доделать) готовые «сторонние» библиотеки
12 дек 2022 в 7:02
@woesss Единственная сторонняя библиотека, которую я нашел — SVGMapView больше не поддерживается. Я надеялся что за несколько лет появились новые сторонние или встроенные решения.
12 дек 2022 в 7:11
Ну а что мешает вам её «поддержать» — кто же будет это делать, если все будут ждать готовое-халявное? Библиотеки так и живут — их создают/поддерживают для нужд проекта. Если она становится популярной и собирает донаты, либо разработчик видит в ней такую перспективу — тогда уже ей занимаются целенаправленно
Как привязать карту к мобильному приложению на Java?
Создаю мобильное приложение в Android Studio на Java, некий тур по городу. Для этого мне нужно добавить карту, получив API. Пробовал 2гис, не дали ключ, в google maps нужна оплата, Яндекс Карты не отреагировали на заявку. Недавно узнал, что есть карты open street map, api которых можно без проблем подключить в проект. Но уже 3 дня не могу найти информации, как это сделать. Что нужно скачивать, как настраивать среду разработки и какой код писать, чтобы добавить api в проект?
- Вопрос задан более двух лет назад
- 251 просмотр
1 комментарий
Средний 1 комментарий
Интеграция карт в ваше Android-приложение
Есть много разных идей, для реализации которых могут понадобиться карты на мобильных устройствах.
Возможности таких устройств позволяют довольно оперативно получать информацию о местоположении, графические данные и графические преобразования для отображения объёма ландшафта.
- Перемещать карту
- Изменять масштаб
- Изменять виды карт
- Получать события от карты
Начнём с отечественного производителя.
Yandex
Библиотеку Yandex MapKit можно скачать с GitHub’а, там же есть версия и для iOS.
Но прежде чем начать использовать, нам надо получить API-key, для этого идём на почту и пишем письмо в support@mobmaps.yandex.ru, указав в заголовке «Map Kit запрос API-ключа». В ответ вам пришлют письмо с указанием дополнительных ссылок на документацию, на правила использования и собственно с самим ключом в теле письма (а могут и не прислать, кстати).
Пока ждём письмо, берём библиотеку и прикрепляем её к проекту.
После долгого ожидания с кружкой кофе, знакомимся с содержимым письма и информации по ссылкам, берём ключик и пишем в вашем layout’е приложения следующий код:
где заместо «you are key» вставляем полученный ключ. Всё, карта есть.
Далее код показывает, как перемещать карту на заданную координату и использовать зум:
final MapView mMapView = (MapView) findViewById(R.id.map); // Получаем MapController MapController mMapController = mMapView.getMapController(); // Перемещаем карту на заданные координаты mMapController.setPositionAnimationTo(new GeoPoint(60.113337, 55.151317)); mMapController.setZoomCurrent(15);
Для использования Google Maps надо совершить куда более изощрённые действия. Я расскажу, как получить debug-key для использования карт, но процесс получения release версии похоже несколько замороченней, но я release ещё не получал.
Для получения debug-key, надо найти ваше хранилище ключей, для отладки.
По-умолчанию, путь будет выглядеть примерно так:
C:\Documents and Settings\\.android\debug.keystore
Затем открываем командную строку, переходим в каталог, куда установлена Java:
cd C:\Program Files\Java\jre6\bin
Затем пишем:
keytool -list -alias androiddebugkey -keystore .keystore -storepass android -keypass android
где путь_до_хранилища_ключей — свой путь до debug.keystore (осторожно, возможны проблемы с пробелами в пути).
После чего в том же окне будет выведен md5-ключ после «Certificate fingerprint (MD5)».
Идём по ссылке и регистрируем код.
После чего Google сгенерирует с нужным кодом для layout и встроенным кодом, берём его и вставляем к себе в layout.
Далее нам, надо наш Activity представить в примерно следующем виде:
package com.fewpeople.geoplanner; import android.os.Bundle; import com.google.android.maps.MapActivity; public class GeoMapActivity extends MapActivity < @Override public void onCreate(Bundle savedInstanceData) < super.onCreate(savedInstanceData); setContentView(R.layout.geomap); >@Override protected boolean isRouteDisplayed() < return false; >>
Замечу, что Activity наследован должен быть от MapActivity хранящийся в com.google.android.maps.MapActivity.
А в манифесте прописать между тегами
И не забыть, про разрешение доступа в интернет для приложения:
В остальном функционал GoogleMaps и YandexMapKit весьма схож:
final MapView mMapView = (MapView) findViewById(R.id.mapview); // Получаем MapController MapController mMapController = mMapView.getController(); // Перемещаем карту на заданные координаты mMapController.animateTo(new GeoPoint(60.113337, 55.151317)); mMapController.setZoom(15);
Как можно видеть, процесс интеграции карт в приложения довольно простой, а спектр использования довольно широк.
Более подробно можно ознакомиться ниже.
Определение собственной позиции
Чтобы немного расширить пример, приложу кусок кода:
final MapView cMapView = (MapView) findViewById(R.id.map); // Получаем MapController MapController cMapController = cMapView.getMapController(); // Включаем элементы интерфейса, контролирующие зум cMapView.setBuiltInZoomControls(true); // Создаём менеджер местоположения и "слушателя" final LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); final LocationListener locationListener = new LocationListener() < @Override public void onStatusChanged(String provider, int status, Bundle extras) <>@Override public void onProviderEnabled(String provider) <> @Override public void onProviderDisabled(String provider) <> @Override public void onLocationChanged(Location location) <> >; locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener); // создаём overlay для отображения своей позиции cMyLocationOverlay = new MyLocationOverlay(this, cMapView); cMyLocationOverlay.disableCompass(); cMyLocationOverlay.enableMyLocation(); cMapView.getOverlays().add(cMyLocationOverlay); // зум cMapController.setZoomCurrent(15); // Получаем свои координаты (можно использовать LocationManager.NETWORK_PROVIDER, для иного способа определения позиции) Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); // Перемещаем карту на заданные координаты cMapController.animateTo(new GeoPoint((int) location.getLatitude() * 1000000, (int) location.getLongitude() * 1000000));
Но для использования этого кода, в манифесте следует указать следующее разрешение:
Краткое руководство. Создание Android-приложения с поддержкой Azure Maps
В этой статье показано, как добавить Azure Maps в Android-приложение. В этом руководстве описывается:
- настроили среду разработки;
- создание учетной записи службы Azure Maps;
- получение первичного ключа Azure Maps для использования в приложении;
- ссылка на библиотеки Azure Maps из проекта;
- добавление в приложение элемента управления Azure Maps.
Предварительные требования
- Подписка на Microsoft Azure. Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начинать работу.
- Android Studio. Если у вас нет Android Studio, вы можете бесплатно получить его от Google.
Многие инструкции в этом кратком руководстве были созданы с помощью Android Studio Arctic Fox (2020.3.1). Если вы используете другую версию Android Studio, действия, характерные для Android Studio, могут отличаться.
Создание учетной записи Azure Maps
Создайте учетную запись службы Azure Maps с помощью приведенных ниже действий.
- В верхнем левом углу окна портала Azure щелкните Создать ресурс.
- В поле Поиск в Marketplace введите Azure Maps, а затем выберите Azure Maps в результатах поиска.
- Нажмите кнопку Создать.
- На странице Создание учетной записи Azure Maps введите следующие значения:
- Подписку, которую необходимо использовать для этой учетной записи.
- Имя группы ресурсов для этой учетной записи. Вы создать новую или использовать существующую группу ресурсов.
- Имя новой учетной записи.
- Ценовая категория этой учетной записи. Выберите Gen2 (2-е поколение).
- Ознакомьтесь с условиями и установите флажок, чтобы подтвердить, что вы прочитали и согласны с лицензионным соглашением и заявлением о конфиденциальности.
- Нажмите кнопку Просмотреть и создать.
- Убедившись, что все правильно на странице Проверка и создание , нажмите кнопку Создать .

Получение ключа подписки для учетной записи.
После успешного создания учетной записи Azure Maps получите ключ подписки, который позволяет запрашивать API Карт.
- Откройте учетную запись службы Azure Maps на портале.
- В левой области выберите Проверка подлинности.
- Скопируйте первичный ключ и сохраните его локально, чтобы использовать далее в этом руководстве.
В целях безопасности рекомендуется чередовать первичный и вторичный ключи. Для этого обновите приложение, чтобы использовать вторичный ключ, разверните его, а затем нажмите кнопку цикла/обновления рядом с первичным ключом, чтобы создать первичный ключ. Старый первичный ключ будет отключен. Дополнительные сведения о смене ключей см. в статье Настройка azure Key Vault с ротацией ключей и аудитом.

Создание проекта в Android Studio
Выполните следующие действия, чтобы создать новый проект с пустым действием в Android Studio.
- Запустите Android Studio и выберите в меню Файл пункты Создать и Новый проект…
- На экране Новый проект выберите Телефон и планшет в списке Шаблоны в левой части экрана.

- Выберите Пустое действие в списке шаблонов, а затем нажмите кнопку Далее.

- На экране Пустое действие введите значения для следующих полей:
- Имя. Введите AzureMapsApp.
- Имя пакета. Используйте значение по умолчанию com.example.azuremapsapp.
- Путь для сохранения. Используйте значение по умолчанию или выберите новое расположение для сохранения файлов проекта. Не используйте пробелы в пути или имени файла из-за потенциальных проблем с инструментами NDK.
- Язык. Выберите Kotlin или Java.
- Минимальный пакет Minimum SDK. Выберите API 21: Android 5.0.0 (Lollipop) в качестве минимального пакета SDK. Это самая ранняя версия, поддерживаемая пакетом SDK для Azure Maps Android.
- Нажмите кнопку Готово, чтобы создать новый проект.
Дополнительные сведения об установке Android Studio и создании проекта см. в документации по Android Studio.
Настройка виртуального устройства
Android Studio позволяет настроить виртуальное устройство Android на вашем компьютере. Это позволит тестировать приложение во время разработки.
Чтобы настроить виртуальное устройство Android (AVD), выполните следующие действия.
- Выберите Диспетчер AVD в меню Инструменты.
- Появится Виртуальная диспетчер устройств Android. Выберите Создание виртуального устройства.
- В категории Phones (Телефоны) выберите Nexus 5X и щелкните Next (Далее).
Дополнительные сведения о настройке AVD см. в статье Создание виртуальных устройств и управление ими в документации по Android Studio.

Установка пакета SDK для Android для Azure Maps
Следующим шагом при создании приложения является установка пакета SDK для Android для Azure Maps. Чтобы установить этот пакет SDK, выполните следующие действия.
-
Откройте файл параметров проекта settings.gradle и добавьте следующий код в раздел Репозитории:
maven
repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)

Теперь файл параметров проекта должен выглядеть следующим образом:
Откройте файл gradle.properties проекта, убедитесь, что android.useAndroidX для обоих android.enableJetifier свойств задано значение true . Если файл gradle.properties не содержит android.useAndroidX и android.enableJetifier , добавьте следующие две строки в конец файла:
android.useAndroidX=true android.enableJetifier=true
- Убедитесь, что для параметра проекта minSdk установлено значение 21 или больше.
- Убедитесь, что compileOptions в разделе Android выглядят следующим образом:
compileOptions
implementation 'com.azure.android:azure-maps-control:1.+'


Чтобы обновить основное действие, выберите app > res > layout >activity_main.xml в Навигаторе проекта.
- В файле MainActivity.java :
- Добавьте операции импорта для пакета SDK в Azure Maps.
- Настройте сведения об аутентификации Azure Maps.
- Получите экземпляр элемента управления картой в методе onCreate.
Если задать сведения о проверке подлинности глобально в классе AzureMaps с помощью методов setSubscriptionKey или setAadProperties , не нужно будет добавлять эти сведения в каждое представление.
Элемент управления картой содержит собственные методы жизненного цикла для управления жизненным циклом OpenGL Android. Они должны вызываться непосредственно из содержащего их действия. Чтобы правильно вызвать методы жизненного цикла элемента управления картой, переопределите следующие методы жизненного цикла в действии, которое содержит элемент управления картой, а затем вызовите соответствующий метод управления картой.
- onCreate(Bundle)
- onDestroy()
- onLowMemory()
- onPause()
- onResume()
- onSaveInstanceState(Bundle)
- onStart()
- onStop()
Измените файл MainActivity.java следующим образом:
package com.example.azuremapsapp; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import com.azure.android.maps.control.AzureMaps; import com.azure.android.maps.control.MapControl; import com.azure.android.maps.control.layer.SymbolLayer; import com.azure.android.maps.control.options.MapStyle; import com.azure.android.maps.control.source.DataSource; public class MainActivity extends AppCompatActivity < static < AzureMaps.setSubscriptionKey(""); //Alternatively use Azure Active Directory authenticate. //AzureMaps.setAadProperties("", "", ""); > MapControl mapControl; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mapControl = findViewById(R.id.mapcontrol); mapControl.onCreate(savedInstanceState); //Wait until the map resources are ready. mapControl.onReady(map ->< //Add your post map load code here. >); > @Override public void onResume() < super.onResume(); mapControl.onResume(); >@Override protected void onStart() < super.onStart(); mapControl.onStart(); >@Override public void onPause() < super.onPause(); mapControl.onPause(); >@Override public void onStop() < super.onStop(); mapControl.onStop(); >@Override public void onLowMemory() < super.onLowMemory(); mapControl.onLowMemory(); >@Override protected void onDestroy() < super.onDestroy(); mapControl.onDestroy(); >@Override protected void onSaveInstanceState(Bundle outState) < super.onSaveInstanceState(outState); mapControl.onSaveInstanceState(outState); >>
- В файле MainActivity.kt :
- добавить операции импорта для пакета SDK в Azure Maps;
- настроить сведения о проверке подлинности Azure Maps;
- получить экземпляр элемента управления картой в методе onCreate.
Если задать сведения о проверке подлинности глобально в классе AzureMaps с помощью методов setSubscriptionKey или setAadProperties , не нужно будет добавлять эти сведения в каждое представление.
Элемент управления картой содержит собственные методы жизненного цикла для управления жизненным циклом OpenGL Android. Они должны вызываться непосредственно из содержащего их действия. Чтобы правильно вызвать методы жизненного цикла элемента управления картой, переопределите следующие методы жизненного цикла в действии, которое содержит элемент управления картой. Необходимо вызывать соответствующий метод элемента управления картой.
- onCreate(Bundle)
- onDestroy()
- onLowMemory()
- onPause()
- onResume()
- onSaveInstanceState(Bundle)
- onStart()
- onStop()
Измените файл MainActivity.kt следующим образом:
package com.example.azuremapsapp; import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import com.azure.android.maps.control.AzureMap import com.azure.android.maps.control.AzureMaps import com.azure.android.maps.control.MapControl import com.azure.android.maps.control.events.OnReady class MainActivity : AppCompatActivity() < companion object < init < AzureMaps.setSubscriptionKey(""); //Alternatively use Azure Active Directory authenticate. //AzureMaps.setAadProperties("", "", ""); > > var mapControl: MapControl? = null override fun onCreate(savedInstanceState: Bundle?) < super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) mapControl = findViewById(R.id.mapcontrol) mapControl?.onCreate(savedInstanceState) //Wait until the map resources are ready. mapControl?.onReady(OnReady < map: AzureMap ->>) > public override fun onStart() < super.onStart() mapControl?.onStart() >public override fun onResume() < super.onResume() mapControl?.onResume() >public override fun onPause() < mapControl?.onPause() super.onPause() >public override fun onStop() < mapControl?.onStop() super.onStop() >override fun onLowMemory() < mapControl?.onLowMemory() super.onLowMemory() >override fun onDestroy() < mapControl?.onDestroy() super.onDestroy() >override fun onSaveInstanceState(outState: Bundle) < super.onSaveInstanceState(outState) mapControl?.onSaveInstanceState(outState) >>

- Нажмите на панели инструментов кнопку выполнения, как показано на следующем рисунке (или нажмите Control + R на компьютере Mac), чтобы выполнить сборку приложения.
Создание приложения в Android Studio занимает несколько секунд. После этого вы сможете протестировать приложение на эмулированном устройстве Android. Должна отобразиться карта примерно следующего вида.

По умолчанию Android перезагружает действие при изменении ориентации или скрытии клавиатуры. Это приводит к сбросу состояния карты (перезагрузка карты, которая сбрасывает представление и перезагружает данные в исходное состояние). Чтобы предотвратить это, добавьте в mainfest следующее: android:configChanges=»orientation|keyboardHidden» . Это приведет к остановке перезагрузки действия и вызову onConfigurationChanged() при изменении ориентации или скрытии клавиатуры.
Очистка ресурсов
В следующих учебниках в разделе Дальнейшие действия подробно описывается использование и настройка службы Azure Maps с помощью учетной записи. Если вы намерены перейти к их изучению, не удаляйте ресурсы, созданные при работе с этим кратким руководством.
Если вы не намерены продолжать изучение учебников, выполните следующие действия, чтобы удалить ресурсы.
- Закройте Android Studio и удалите созданное приложение.
- Если вы тестировали приложение на внешнем устройстве, удалите приложение с этого устройства.
Если вы не планируете продолжать разработку с помощью пакета SDK для Android для Azure Maps:
- Перейдите на страницу портала Azure. На главной странице портала выберите Все ресурсы.
- Выберите свою учетную запись службы Azure Maps. В верхней части страницы выберите Удалить.
- Кроме того, если вы не планируете продолжать разработку приложений для Android, удалите Android Studio.
Дополнительные примеры кода см. в следующих руководствах:
- Управление аутентификацией в Azure Maps
- Изменение стилей карт Android
- Добавление слоя символов
- Добавление слоя линий
- Добавление слоя многоугольников
Дальнейшие действия
В этом кратком руководстве вы создали учетную запись службы Azure Maps и запустили демоверсию приложения. Сведения об Azure Maps см. в этих руководствах:
