Подробная информация о пошаговой передаче данных

Пошаговый поток данных предоставляет только навигационную информацию для устройств, не предназначенных для навигации по карте. Он отображает предстоящие маневры с указанием данных, которые вы предоставляете:

  • значки (влево, вправо, разворот)
  • номера поворотов на кольцевых перекрестках
  • названия дорог
  • расчетные расстояния и время до следующего этапа навигации или конечного пункта назначения

Вы можете использовать пошаговую ленту для создания интерактивных платформ, где полный интерфейс Navigation SDK неуместен, например, для дисплеев с небольшим экраном. Например, это может пригодиться водителям двухколесных транспортных средств, которым можно проецировать только навигационные указания, чтобы помочь им быстрее и увереннее добираться до места назначения, минимизируя отвлекающие факторы.

Основные элементы навигационного дисплея

Мобильный экран, на котором отображается предстоящий поворот направо на Чёрч-стрит через 50 футов. Внизу экрана указано, что до пункта назначения осталось 13 минут, а расстояние — 2,1 мили.

Основными полями для каждого шага навигации являются полное название дороги, маневр и общее расстояние шага, которые доступны в 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];