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

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

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

Вы можете использовать пошаговую ленту для создания впечатлений, когда полный пользовательский интерфейс 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 , чтобы получить текущее состояние навигации, которое может быть одним из следующих:

  • Enroute - Состояние GMSNavigationNavStateEnroute означает, что в данный момент активна направляемая навигация и пользователь находится на предоставленном маршруте. Доступна информация о текущем предстоящем шаге маневра.

  • Изменение маршрута - GMSNavigationNavStateRerouting означает, что навигация выполняется, но навигатор ищет новый маршрут. Предстоящий шаг маневра недоступен, поскольку нового маршрута пока нет.

  • StoppedGMSNavigationNavStateStopped означает, что навигация завершена. Например, навигация останавливается, когда пользователь выходит из навигации в приложении. В примере приложения состояние 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];