Detalhes sobre o feed de dados de navegação guiada

Um feed de dados passo a passo fornece informações de navegação apenas para dispositivos não projetados para orientação de navegação baseada em mapa. Ele fornece as próximas manobras com elementos que você fornece:

  • ícones (esquerda, direita, retorno)
  • números de voltas em rotatórias
  • nomes de vias
  • distâncias e tempo estimados até a próxima etapa do trajeto ou o destino final

É possível usar o feed passo a passo para criar experiências em que a IU completa do SDK de navegação não é adequada, como em telas pequenas. Por exemplo, você pode usar isso para passageiros de veículos de duas rodas, em que é possível projetar orientações de navegação para ajudar a chegar aos destinos mais rápido e com mais confiança, com o mínimo de distrações.

Elementos essenciais de exibição da navegação

Uma tela de dispositivo móvel que mostra uma próxima curva à direita a 15 metros na Church Street. Na parte de baixo da tela, o tempo restante até o destino é de 13
minutos, e a distância restante é de 3,2
km.

Os campos principais de cada etapa de navegação são o nome completo da via, a manobra e a distância total da etapa, que estão disponíveis em GMSNavigationStepInfo.

Para a viagem geral, é possível mostrar o tempo restante e a distância até a etapa atual ou até o destino, que estão disponíveis em GMSNavigationNavInfo. A imagem à direita mostra um exemplo desses elementos essenciais de navegação.

Configurar um listener de eventos

Para usar dados somente de navegação, é necessário implementar um listener de eventos para o evento didChangeNavInfo. No listener de eventos, acesse informações de viagem e etapas para fornecer navegação passo a passo aos usuários.

Para implementar processadores de eventos, o controlador de visualização do mapa precisa implementar o protocolo GMSNavigatorListener. Para informações detalhadas sobre o processamento de eventos no SDK de navegação para iOS, consulte Detectar eventos de navegação.

Processar o evento didChangeNavInfo

Crie um listener para o evento didChangeNavInfo e adicione suporte a instruções passo a passo ao app. No listener de eventos, use as seguintes classes e tipos enumerados para controlar a navegação passo a passo:

  • GMSNavigationNavInfo: classe que define informações sobre o estado da navegação.

  • GMSNavigationStepInfo: classe que define informações sobre uma única etapa em uma rota de navegação.

  • GMSNavigationNavState: enum que define o estado atual de uma navegação, como em rota, recalculando ou parada.

  • GMSNavigationDrivingSide: enumeração que define se esta etapa está em uma rota de direção à direita ou à esquerda.

  • GMSNavigationManeuver: enumeração que define a ação de navegação a ser realizada, como virar à esquerda ou à direita.

Confira abaixo exemplos de listeners de eventos para o evento 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;
        ...
      }
    }
    ...
  }

Use a propriedade navState de GMSNavigationNavInfo para receber o estado atual da navegação, que é um dos seguintes:

  • Enroute: o estado GMSNavigationNavStateEnroute significa que a navegação guiada está ativa e o usuário está na rota fornecida. Informações sobre a próxima etapa da manobra atual estão disponíveis.

  • Recalculando a rota: GMSNavigationNavStateRerouting significa que a navegação está em andamento, mas o navegador está procurando uma nova rota. A próxima etapa de manobra não está disponível porque ainda não há uma nova rota.

  • Interrompida: GMSNavigationNavStateStopped significa que a navegação foi encerrada. Por exemplo, a navegação é interrompida quando o usuário sai dela no app. No app de exemplo, um estado GMSNavigationNavStateStopped limpa a tela de informações de navegação para impedir que as instruções de etapa sejam mostradas.

Indicação de faixa

O SDK de navegação representa as faixas no card de direção como objetos de dados GMSNavigationLane e GMSNavigationLaneDirection. Um objeto GMSNavigationLane representa uma faixa específica durante a navegação e tem uma lista de objetos GMSNavigationLaneDirection que descrevem todas as curvas que podem ser feitas nessa faixa.

A direção recomendada que um motorista deve seguir em uma faixa é marcada usando o campo recommended.

Exemplo de orientação de faixa

O snippet a seguir ilustra a representação de dados das faixas exibidas na captura de tela anterior.

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

Imagens de orientação de faixa

O SDK de navegação oferece suporte à geração de imagens de faixa para cada etapa de navegação, conforme transmitido por GMSNavigationStepInfo. Esses ícones se encaixam nas orientações de dimensionamento de imagem do 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];
      

Como criar ícones para manobras

ícone de manobra

O tipo enumerado GMSNavigationManeuver define cada manobra possível que pode ocorrer durante a navegação. Você pode receber a manobra para uma determinada etapa da propriedade maneuver de GMSNavigationStepInfo.

Você precisa criar ícones de manobra e parear com as manobras associadas. Para algumas manobras, é possível configurar um mapeamento um para um com um ícone, como GMSNavigationManeuverDestinationLeft e GMSNavigationManeuverDestinationRight. No entanto, como algumas manobras compartilham características com outras, talvez você queira mapear mais de uma manobra para um único ícone. Por exemplo, GMSNavigationManeuverTurnLeft e GMSNavigationManeuverOnRampLeft podem ser mapeados para o ícone de virada à esquerda.

Algumas manobras contêm um rótulo adicional "No sentido horário" ou "No sentido anti-horário", que o SDK determina com base no lado de direção de um país. Por exemplo, em países onde a direção é feita do lado esquerdo da estrada, os motoristas fazem uma rotatória ou uma curva em U no sentido horário, enquanto os países com direção do lado direito vão no sentido anti-horário. O SDK de navegação detecta se uma manobra ocorre no tráfego da esquerda ou da direita e gera a manobra adequada. Portanto, o ícone da manobra pode ser diferente para uma manobra no sentido horário ou anti-horário.

Abra para conferir exemplos de ícones de diferentes manobras

Ícone de exemplo Movimentações passo a passo
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

Usar ícones gerados

O SDK de navegação oferece suporte à geração de ícones de manobra para um determinado GMSNavigationStepInfo. Esses ícones se encaixam nas orientações de dimensionamento de imagens do 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];