Навигация
Навигатор
Чтобы создать навигатор, можно использовать готовые элементы интерфейса и класс NavigationManager.
import 'package:dgis_mobile_sdk_full/dgis.dart' as sdk;
final sdk.Context sdkContext = sdk.DGis.initialize();
final sdk.NavigationManager navigationManager = sdk.NavigationManager(sdkContext);
После этого нужно добавить на карту маркер с текущим местоположением и связать ее с NavigationManager.
import 'package:dgis_mobile_sdk_full/dgis.dart' as sdk;
final sdk.MyLocationMapObjectSource locationSource = sdk.MyLocationMapObjectSource(sdkContext);
map.addSource(locationSource);
navigationManager.mapManager.addMap(map);
Навигатор может работать в трёх режимах: свободная навигация, ведение по маршруту и симуляция ведения.
Настройки навигатора можно изменить через свойства NavigationManager.
Свободная навигация
В этом режиме маршрут следования отсутствует, но навигатор будет информировать о превышениях скорости, дорожных камерах, авариях и ремонтных работах.
Чтобы запустить навигатор в этом режиме, нужно вызвать метод startFreeRoam() без параметров.
import 'package:dgis_mobile_sdk_full/dgis.dart' as sdk;
final sdk.Context sdkContext = sdk.DGis.initialize();
final sdk.NavigationManager navigationManager = sdk.NavigationManager(sdkContext);
navigationManager.startFreeRoam();
Ведение по маршруту
В этом режиме на карте будет построен маршрут от текущего местоположения до указанной точки назначения, и пользователь будет получать инструкции по мере движения.
Чтобы запустить навигатор в этом режиме, нужно вызвать метод start() и указать объект RouteBuildOptions: координаты точки назначения и настройки маршрута.
import 'package:dgis_mobile_sdk_full/dgis.dart' as sdk;
final routeBuildOptions = sdk.RouteBuildOptions(
finishPoint: sdk.RouteSearchPoint(
coordinates: sdk.GeoPoint(
latitude: sdk.Latitude(55.757670),
longitude: sdk.Longitude(37.660160),
),
),
routeSearchOptions: sdk.RouteSearchOptions.car(
sdk.CarRouteSearchOptions(),
),
);
navigationManager.start(routeBuildOptions);
Дополнительно при вызове метода start()
можно указать объект TrafficRoute — готовый маршрут для навигации (см. раздел Построение маршрута). В таком случае навигатор не будет пытаться построить маршрут от текущего местоположения, а начнёт ведение по указанному маршруту.
navigationManager.start(routeBuildOptions, trafficRoute);
Симуляция ведения по маршруту
В этом режиме навигатор не будет отслеживать реальное местоположение устройства, а запустит симулированное движение по указанному маршруту. Режим удобно использовать для отладки.
Чтобы запустить навигатор в режиме симуляции, нужно вызвать метод startSimulation(), указав готовый маршрут (TrafficRoute) и его настройки (RouteBuildOptions).
Скорость движения можно изменить с помощью свойства SimulationSettings.speedMode (метры в секунду).
navigationManager.simulationSettings.speedMode = sdk.SimulationSpeedMode.overSpeed(
sdk.SimulationAutoWithOverSpeed(10)
);
navigationManager.startSimulation(routeBuildOptions, trafficRoute);
Остановить симуляцию можно с помощью метода stop().
navigationManager.stop();
Отображение пробок на карте
Чтобы включить показ дорожного трафика, нужно добавить на карту источник данных TrafficSource.
final sdk.TrafficSource trafficSource = sdk.TrafficSource(sdkContext);
map.addSource(trafficSource);
Навигация внутри зданий
SDK предоставляет возможность строить маршруты внутри некоторых зданий, для которых существуют этажные планы. Например, можно проложить маршрут до конкретного магазина в торговом центре, составить сложный маршрут между несколькими точками и т. д.
Этот тип навигации включен в набор стандартной поставки Full SDK, однако имеет ряд ограничений:
- Может быть активирован только в режиме пешеходной навигации.
- Из-за особенностей работы современных систем позиционирования возможности определения позиции внутри зданий сильно ограничены. Когда система определит, что устройство попало в пределы здания, слежение за геопозицией и ее отображение отключится, оставив построенный маршрут и рекомендации по проходу.
Создание маршрута
Создание маршрута происходит по принципам, описанным в разделе Ведение по маршруту с несколькими важными дополнениями. Разберем на примере:
import 'package:dgis_mobile_sdk_full/dgis.dart' as sdk;
// Также необходим объект RouteBuildOptions
final routeBuildOptions = sdk.RouteBuildOptions(
finishPoint: sdk.RouteSearchPoint(
coordinates: sdk.GeoPoint(
latitude: sdk.Latitude(55.757670),
longitude: sdk.Longitude(37.660160),
),
objectId: ..., // Можно получить из DgisMapObject
levelId: ..., // Можно получить из DirectoryObject или RenderedObjectInfo
),
// routeSearchOptions должен иметь тип PedestrianRouteSearchOptions
routeSearchOptions: sdk.RouteSearchOptions.pedestrian(
sdk.PedestrianRouteSearchOptions(),
),
);
При создании конечной точки маршрута RouteSearchPoint обязательно указать параметры objectId
и levelId
.
Отображение
Для определения вхождения в режим навигации внутри здания можно пользоваться стандартными возможностями SDK, а именно подпиской на канал indoorChannel. Этот канал можно получить из NavigationManager.indoorDetector.