Пошаговый поток данных предоставляет только навигационную информацию для устройств, не предназначенных для навигации на основе карт. Он предоставляет предстоящие маневры с элементами, которые вы предоставляете:
- значки (влево, вправо, разворот)
- номера поворотов на перекрестках с круговым движением
- названия дорог
- расчетные расстояния и время до следующего этапа навигации или конечного пункта назначения
Вы можете использовать пошаговую ленту для создания впечатлений, когда полный пользовательский интерфейс Navigation SDK не подходит, например, для дисплеев с небольшим экраном. Например, вы можете использовать это для водителей двухколесных транспортных средств, где вы можете проецировать только навигационные указания, чтобы помочь им быстрее и увереннее добраться до места назначения с минимальными отвлекающими факторами.
Основные элементы навигационного дисплея
Основными полями для каждого шага навигации являются полное название дороги, маневр и общее расстояние шага, которые доступны в GMSNavigationStepInfo
.
Для всей поездки вы можете захотеть отобразить оставшееся время и расстояние до текущего шага или до пункта назначения, все это доступно в GMSNavigationNavInfo
. На изображении справа показан пример этих важных элементов навигации.
Настройте прослушиватель событий
Чтобы использовать только навигационные данные, вам необходимо реализовать прослушиватель событий для события didChangeNavInfo
. В прослушивателе событий получите доступ к информации о поездке и шаге, чтобы предоставить пошаговую навигацию вашим пользователям.
Для реализации обработчиков событий контроллер представления карты должен реализовать протокол GMSNavigatorListener
. Подробную информацию об обработке событий в Navigation SDK для iOS см. в разделе Прослушивание навигационных событий .
Обработка события didChangeNavInfo
Создайте слушателя для события didChangeNavInfo
, чтобы добавить поддержку пошаговой навигации в ваше приложение. В слушателе событий используйте следующие классы и перечисления для управления пошаговой навигацией:
GMSNavigationNavInfo
— Класс, определяющий информацию о состоянии навигации.GMSNavigationStepInfo
— класс, определяющий информацию об одном шаге навигационного маршрута.GMSNavigationNavState
— перечисление, определяющее текущее состояние навигации, например, на маршруте, изменение маршрута или остановка.GMSNavigationDrivingSide
— перечисление, определяющее, находится ли этот шаг на маршруте с правым или левым движением.GMSNavigationManeuver
— перечисление, определяющее действие навигации, которое необходимо выполнить, например, поворот налево или поворот направо.
Ниже показаны примеры прослушивателей событий для события didChangeNavInfo
:
Быстрый
// ViewController.swift class SomeViewController: UIViewController { ... mapView.navigator?.add(self); ... } extension SomeViewController: GMSNavigatorListener { func navigator(_ navigator: GMSNavigator, didUpdateNavInfo navInfo: GMSNavigationNavInfo) { // Get the current step information if navInfo.navState == .enroute { if let currentStep = navInfo.currentStep { ... roadNameLabel.text = currentStep.simpleRoadName ... } } } }
Objective-C
// ViewController.h @interface SomeViewController () <GMSNavigatorListener> @end // ViewController.m @implementation SomeViewController // Some initialization code. ... { ... [_mapView.navigator addListener:self]; ... } #pragma mark GMSNavigatorListener - (void)navigator:(GMSNavigator *)navigator didUpdateNavInfo:(GMSNavigationNavInfo *)navInfo { // Get the current step information if (navInfo.navState == GMSNavigationNavStateEnroute) { GMSNavigationStepInfo *currentStep = navInfo.currentStep; if (currentStep) { ... roadNameLabel.text = currentStep.simpleRoadName; ... } } ... }
Навигационные состояния
Используйте свойство navState
объекта GMSNavigationNavInfo
, чтобы получить текущее состояние навигации, которое может быть одним из следующих:
Enroute - Состояние
GMSNavigationNavStateEnroute
означает, что в данный момент активна направляемая навигация и пользователь находится на предоставленном маршруте. Доступна информация о текущем предстоящем шаге маневра.Изменение маршрута -
GMSNavigationNavStateRerouting
означает, что навигация выполняется, но навигатор ищет новый маршрут. Предстоящий шаг маневра недоступен, поскольку нового маршрута пока нет.Stopped —
GMSNavigationNavStateStopped
означает, что навигация завершена. Например, навигация останавливается, когда пользователь выходит из навигации в приложении. В примере приложения состояниеGMSNavigationNavStateStopped
очищает дисплей навигационной информации, чтобы предотвратить отображение затянувшихся пошаговых инструкций.
Руководство по выбору полосы движения
Navigation SDK представляет полосы в навигационной карте поворота как объекты данных GMSNavigationLane
и GMSNavigationLaneDirection
. Объект GMSNavigationLane
представляет определенную полосу во время навигации и имеет список объектов GMSNavigationLaneDirection
, которые описывают все повороты, которые можно сделать из этой полосы.
Рекомендуемое направление движения водителя по полосе обозначено с помощью recommended
поля.
Пример указания полосы движения
Следующий фрагмент иллюстрирует представление данных полос, показанных на предыдущем снимке экрана.
// Lane 1
GMSNavigationLaneDirections =
[{/*GMSNavigationLaneShape=*/
GMSNavigationLaneShapeNormalLeft, /*recommended=*/ true}]
// Lane 2
GMSNavigationLaneDirections =
[{/*GMSNavigationLaneShape=*/
GMSNavigationLaneShapeNormalLeft, /*recommended=*/ true}]
// Lane 3
GMSNavigationLaneDirections =
[{/*GMSNavigationLaneShape=*/
GMSNavigationLaneShapeStraight, /*recommended=*/ false}]
// Lane 4
GMSNavigationLaneDirections =
[{/*GMSNavigationLaneShape=*/
GMSNavigationLaneShapeStraight, /*recommended=*/ false},
{/*GMSNavigationLaneShape=*/ GMSNavigationLaneShapeNormalRight, /*recommended=*/ false}]
Изображения для указания полосы движения
Navigation SDK поддерживает генерацию изображений полос для каждого шага навигации, как передано GMSNavigationStepInfo
. Эти значки соответствуют руководству по размеру изображений CarPlay .
Быстрый
let currentStepInfo = navInfo.currentStep let options = GMSNavigationStepImageOptions() options.maneuverImageSize = .square96 options.screenMetrics = UIScreen.mainScreen let maneuverImage = currentStepinfo.maneuverImage(options: options)
Objective-C
GMSNavigationStepInfo *stepInfo = navInfo.currentStep; GMSNavigationStepImageOptions *options = [[GMSNavigationStepImageOptions alloc] init]; options.maneuverImageSize = GMSNavigationManeuverImageSizeSquare96; options.screenMetrics = UIScreen.mainScreen; UIImage* maneuverImage = [stepInfo maneuverImageWithOptions:options];
Создание иконок для маневров
Перечисление GMSNavigationManeuver
определяет каждый возможный маневр, который может произойти во время навигации, и вы можете получить маневр для заданного шага из свойства maneuver
объекта GMSNavigationStepInfo
.
Вам необходимо создать значки маневров и связать их с соответствующими маневрами. Для некоторых маневров вы можете настроить сопоставление один к одному значку, например GMSNavigationManeuverDestinationLeft
и GMSNavigationManeuverDestinationRight
. Однако, поскольку некоторые маневры имеют общие характеристики с другими маневрами, вам может потребоваться сопоставить более одного маневра с одним значком. Например, GMSNavigationManeuverTurnLeft
и GMSNavigationManeuverOnRampLeft
могут оба сопоставляться со значком поворота влево.
Некоторые маневры содержат дополнительную метку «По часовой стрелке» или «Против часовой стрелки», которую SDK определяет на основе стороны движения в стране. Например, в странах с левосторонним движением водители делают круговой разворот или разворот по часовой стрелке, тогда как в странах с правосторонним движением водители делают разворот против часовой стрелки. Navigation SDK определяет, происходит ли маневр в левостороннем или правостороннем движении, и выводит соответствующий маневр. Поэтому значок маневра может отличаться для маневра по часовой стрелке и против часовой стрелки.
Разверните, чтобы увидеть примеры значков для различных маневров
Образец значка | Пошаговые маневры |
---|---|
![]() | DEPART UNKNOWN |
![]() | STRAIGHT ON_RAMP_UNSPECIFIED OFF_RAMP_UNSPECIFIED NAME_CHANGE |
![]() | TURN_RIGHT ON_RAMP_RIGHT |
![]() | TURN_LEFT ON_RAMP_LEFT |
![]() | TURN_SLIGHT_RIGHT ON_RAMP_SLIGHT_RIGHT OFF_RAMP_SLIGHT_RIGHT |
![]() | TURN_SLIGHT_LEFT ON_RAMP_SLIGHT_LEFT OFF_RAMP_SLIGHT_LEFT |
![]() | TURN_SHARP_RIGHT ON_RAMP_SHARP_RIGHT OFF_RAMP_SHARP_RIGHT |
![]() | TURN_SHARP_LEFT ON_RAMP_SHARP_LEFT OFF_RAMP_SHARP_LEFT |
![]() | TURN_U_TURN_COUNTERCLOCKWISE ON_RAMP_U_TURN_COUNTERCLOCKWISE OFF_RAMP_U_TURN_COUNTERCLOCKWISE |
![]() | TURN_U_TURN_CLOCKWISE ON_RAMP_U_TURN_CLOCKWISE OFF_RAMP_U_TURN_CLOCKWISE |
![]() | ROUNDABOUT_SHARP_RIGHT_COUNTERCLOCKWISE |
![]() | ROUNDABOUT_SHARP_RIGHT_CLOCKWISE |
![]() | ROUNDABOUT_RIGHT_COUNTERCLOCKWISE |
![]() | ROUNDABOUT_RIGHT_CLOCKWISE |
![]() | ROUNDABOUT_SLIGHT_RIGHT_COUNTERCLOCKWISE |
![]() | ROUNDABOUT_SLIGHT_RIGHT_CLOCKWISE |
![]() | ROUNDABOUT_STRAIGHT_COUNTERCLOCKWISE |
![]() | ROUNDABOUT_STRAIGHT_CLOCKWISE |
![]() | ROUNDABOUT_SLIGHT_LEFT_COUNTERCLOCKWISE |
![]() | ROUNDABOUT_SLIGHT_LEFT_CLOCKWISE |
![]() | ROUNDABOUT_LEFT_COUNTERCLOCKWISE |
![]() | ROUNDABOUT_LEFT_CLOCKWISE |
![]() | ROUNDABOUT_SHARP_LEFT_COUNTERCLOCKWISE |
![]() | ROUNDABOUT_SHARP_LEFT_CLOCKWISE |
![]() | ROUNDABOUT_U_TURN_COUNTERCLOCKWISE |
![]() | ROUNDABOUT_U_TURN_CLOCKWISE |
![]() | ROUNDABOUT_COUNTERCLOCKWISE |
![]() | ROUNDABOUT_CLOCKWISE |
![]() | ROUNDABOUT_EXIT_COUNTERCLOCKWISE |
![]() | ROUNDABOUT_EXIT_CLOCKWISE |
![]() | MERGE_RIGHT OFF_RAMP_RIGHT |
![]() | MERGE_LEFT OFF_RAMP_LEFT |
![]() | FORK_RIGHT TURN_KEEP_RIGHT ON_RAMP_KEEP_RIGHT OFF_RAMP_KEEP_RIGHT |
![]() | FORK_LEFT TURN_KEEP_LEFT ON_RAMP_KEEP_LEFT OFF_RAMP_KEEP_LEFT |
![]() | MERGE_UNSPECIFIED |
![]() | DESTINATION |
![]() | DESTINATION_RIGHT |
![]() | DESTINATION_LEFT |
![]() | FERRY_BOAT |
![]() | FERRY_TRAIN |
Используйте сгенерированные значки
Navigation SDK поддерживает генерацию значков маневра для заданного GMSNavigationStepInfo
. Эти значки соответствуют руководству по размеру изображений CarPlay .
Быстрый
let currentStepInfo = navInfo.currentStep let options = GMSNavigationStepImageOptions() options.maneuverImageSize = .square96 options.screenMetrics = UIScreen.mainScreen let maneuverImage = currentStepinfo.maneuverImage(options: options)
Objective-C
GMSNavigationStepInfo *stepInfo = navInfo.currentStep; GMSNavigationStepImageOptions *options = [[GMSNavigationStepImageOptions alloc] init]; options.maneuverImageSize = GMSNavigationManeuverImageSizeSquare96; options.screenMetrics = UIScreen.mainScreen; UIImage* maneuverImage = [stepInfo maneuverImageWithOptions:options];