Пошаговый поток данных предоставляет только навигационную информацию для устройств, не предназначенных для навигации по карте. Он отображает предстоящие маневры с указанием данных, которые вы предоставляете:
- значки (влево, вправо, разворот)
- номера поворотов на кольцевых перекрестках
- названия дорог
- расчетные расстояния и время до следующего этапа навигации или конечного пункта назначения
Вы можете использовать пошаговую ленту для создания интерактивных платформ, где полный интерфейс 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
для получения текущего состояния навигации, которое может быть одним из следующих:
В пути — состояние
GMSNavigationNavStateEnroute
означает, что навигационная система активна и пользователь находится на заданном маршруте. Доступна информация о текущем этапе предстоящего манёвра.Изменение маршрута —
GMSNavigationNavStateRerouting
означает, что навигация продолжается, но навигатор ищет новый маршрут. Предстоящий этап манёвра недоступен, поскольку новый маршрут ещё не создан.Остановлено —
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 определяет в зависимости от стороны движения в стране. Например, в странах с левосторонним движением водители совершают круговой разворот или разворот по часовой стрелке, тогда как в странах с правосторонним движением — против часовой стрелки. Навигационный 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];