Навигация
С помощью SDK вы можете работать со следующими сценариями навигации:
- Запустить навигатор в разных режимах (свободная навигация, ведение по маршруту и симуляция ведения), в том числе внутри зданий.
- Предлагать пользователю альтернативные маршруты по пути.
- Получать динамические данные маршрута в ходе навигации.
- Настраивать звуковые оповещения в навигаторе.
Чтобы создать навигатор, используйте готовые элементы интерфейса и класс NavigationManager. Вы можете получать данные о текущем местоположении устройства одним из способов:
- Использовать стандартный источник данных и при необходимости включить определение местоположения через Radar API.
- Настроить навигатор для работы с собственным источником геопозиции.
Начало работы
Добавьте в MapView элементы NavigationView и DefaultNavigationControls.
<ru.dgis.sdk.map.MapView
android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<ru.dgis.sdk.navigation.NavigationView
android:id="@+id/navigationView"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<ru.dgis.sdk.navigation.DefaultNavigationControls
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</ru.dgis.sdk.navigation.NavigationView>
</ru.dgis.sdk.map.MapView>
Чтобы у SDK был доступ к данным о текущем местоположении устройства, используйте стандартный источник данных DefaultLocationSource или создайте собственный источник геопозиции. Зарегистрируйте источник данных в SDK: вызовите метод registerPlatformLocationSource() и передайте в него контекст SDK и источник.
Добавьте на карту маркер с текущей геопозицией устройства с помощью источника данных MyLocationMapObjectSource и передайте его в метод карты addSource().
Создайте объект NavigationManager.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
sdkContext = DGis.initialize(applicationContext, apiKeys)
// Создание и регистрация в SDK источника данных о текущей геопозиции
locationProvider = DefaultLocationSource(applicationContext)
registerPlatformLocationSource(sdkContext, locationProvider)
setContentView(R.layout.activity_navigation)
// Создание объекта NavigationManager
navigationManager = NavigationManager(sdkContext)
findViewById<MapView>(R.id.mapView).apply { mapView ->
lifecycle.addObserver(mapView)
mapView.getMapAsync { map ->
navigationManager.mapManager.addMap(map)
// Добавление маркера с текущей геопозицией на карту
map.addSource(
MyLocationMapObjectSource(sdkContext)
)
}
}
findViewById<NavigationView>(R.id.navigationView).apply {
// Привязка созданного объекта NavigationManager к элементу интерфейса NavigationView
navigationManager = this@NavigationActivity.navigationManager
}
// Запуск навигатора в режиме свободной навигации
navigationManager.start()
}
Навигатор может работать в трёх режимах: свободная навигация, ведение по маршруту и симуляция ведения.
Настройки навигатора можно измени ть через свойства объекта NavigationManager.
Использование Radar API
Вместе со стандартным источником данных о местоположении устройства DefaultLocationSource вы можете использовать Radar API. Radar API вычисляет местоположение устройства по сотовым вышкам и ближайшим точкам доступа Wi-Fi.
Если включено использование Radar API, то постоянно сравнивается точность геопозиции, полученная из GPS и через Radar API. По умолчанию приоритетной являются геопозиция, вычисленная с помощью GPS. Геопозиция, вычисленная через Radar API, используется в следующих случаях:
- Потеря сигнала GPS.
- Ухудшение точности GPS до значения параметра
minimalAcceptableGpsAccuracyM
, который передаётся при инициализацииDefaultLocationSource
. При этом точность геопозиции из Radar API должна быть выше, чем у GPS.