Навигация | Mobile SDK | 2GIS Documentation
Flutter SDK

Навигация

Чтобы создать навигатор, можно использовать готовые элементы интерфейса и класс 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.