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

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

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

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

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

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

Основные поля для каждого шага навигации – это полное название дороги, маневр и общее расстояние шага, которые доступны в GMSNavigationStepInfo.

Для поездки в целом можно показывать оставшееся время и расстояние до текущего шага или до пункта назначения. Все эти данные доступны в GMSNavigationNavInfo. На изображении справа показан пример таких элементов навигации.

Как настроить прослушиватель событий

Чтобы использовать данные только для навигации, необходимо реализовать прослушиватель событий для события didChangeNavInfo. В прослушивателе событий получите доступ к информации о поездке и шагах, чтобы предоставить пользователям пошаговую навигацию.

Чтобы реализовать обработчики событий, контроллер представления карты должен реализовывать протокол GMSNavigatorListener. Подробную информацию об обработке событий в Navigation SDK для iOS можно найти в статье Прослушивание событий навигации.

Обработка события didChangeNavInfo

Чтобы добавить в приложение поддержку пошаговой навигации, создайте прослушиватель для события didChangeNavInfo. В прослушивателе событий используйте следующие классы и перечисления для управления пошаговой навигацией:

  • GMSNavigationNavInfo  – класс, определяющий информацию о состоянии навигации.

  • GMSNavigationStepInfo – класс, определяющий информацию об одном шаге на маршруте навигации.

  • GMSNavigationNavState – перечисление, определяющее текущее состояние навигации, например "в пути", "перерасчет маршрута" или "остановлено".

  • GMSNavigationDrivingSide Перечисление, определяющее, является ли этот шаг маршрутом с правосторонним или левосторонним движением.

  • GMSNavigationManeuver – перечисление, определяющее навигационное действие, например поворот налево или направо.

Ниже приведены примеры прослушивателей событий для события didChangeNavInfo.

Swift

  // 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.

Swift

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.

Swift

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];