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

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

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

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

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

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

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

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

Настройка прослушивателя событий

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

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

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

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

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

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

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

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

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

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

Цель-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;
        ...
      }
    }
    ...
  }

Быстрый

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

Используйте свойство navState объекта GMSNavigationNavInfo чтобы получить текущее состояние навигации, которое может быть одним из следующих:

  • Enroute — состояние 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)
      

Цель-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)
      

Цель-C

GMSNavigationStepInfo *stepInfo = navInfo.currentStep;

GMSNavigationStepImageOptions *options = [[GMSNavigationStepImageOptions alloc] init];
options.maneuverImageSize = GMSNavigationManeuverImageSizeSquare96;
options.screenMetrics = UIScreen.mainScreen;

UIImage* maneuverImage = [stepInfo maneuverImageWithOptions:options];