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

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

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

Você pode usar o feed de navegação guiada para criar experiências em que a interface completa do SDK de navegação não é adequada, como em telas pequenas. Por exemplo, você pode usar isso para motoristas de veículos de duas rodas, em que é possível projetar orientações apenas de navegação para ajudá-los a chegar aos destinos com mais rapidez e confiança, com o mínimo de distrações.

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

Uma tela de dispositivo móvel que mostra uma curva à direita a 15 metros na Rua
da Igreja. Na parte de baixo da tela, o tempo restante até o destino é de 13 minutos, e a distância restante é de 3,3 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, talvez você queira mostrar o tempo e a distância restantes até a etapa atual ou o destino, que estão disponíveis em GMSNavigationNavInfo. A imagem à direita mostra um exemplo desses elementos de navegação essenciais.

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 as informações de viagem e etapa para oferecer navegação guiada aos usuários.

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

Como processar o evento didChangeNavInfo

Crie um listener para o evento didChangeNavInfo para adicionar suporte à navegação guiada ao seu app. No listener de eventos, use as seguintes classes e tipos enumerados para controlar a navegação guiada:

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

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

  • GMSNavigationNavState: tipo enumerado que define o estado atual de uma navegação, como em rota, traçando novo trajeto ou parada.

  • GMSNavigationDrivingSide: tipo enumerado que define se essa etapa está em uma rota com direção à direita ou à esquerda.

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

Confira abaixo exemplos de listeners 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 conferir 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á no trajeto fornecido. As informações sobre a próxima etapa da manobra estão disponíveis.

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

  • Stopped: GMSNavigationNavStateStopped significa que a navegação foi encerrada. Por exemplo, a navegação é interrompida quando o usuário sai da navegação no app. No app de exemplo, um estado GMSNavigationNavStateStopped limpa a exibição de informações de navegação para evitar que instruções de etapas persistentes sejam mostradas.

Indicação de faixa

O SDK de navegação representa as faixas no card de navegaçã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 conversões que podem ser feitas nessa faixa.

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

Exemplo de indicação de faixa

O snippet a seguir ilustra a representação de dados das faixas mostradas 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 indicação de faixa

O SDK do Navigation é compatível com a 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 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];
      

Como criar ícones para manobras

Ícone de uma manobra

O tipo enumerado GMSNavigationManeuver define cada manobra possível que pode ocorrer durante a navegação, e você pode acessar a manobra de uma determinada etapa na propriedade maneuver de GMSNavigationStepInfo.

É necessário criar ícones de manobra e associá-los às manobras correspondentes. Para algumas manobras, é possível configurar um mapeamento individual para 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 virar à esquerda.

Algumas manobras contêm um rótulo adicional "Clockwise" ou "CounterClockwise", que o SDK determina com base no lado de direção de um país. Por exemplo, em países onde se dirige do lado esquerdo da via, os motoristas fazem uma rotatória ou um retorno no sentido horário, enquanto os países onde se dirige do lado direito fazem isso no sentido anti-horário. O SDK de navegação detecta se uma manobra ocorre no trânsito à esquerda ou à direita e gera a manobra apropriada. Portanto, o ícone de manobra pode ser diferente para uma manobra no sentido horário e outra no sentido anti-horário.

Abra para ver exemplos de ícones para diferentes manobras

Ícone de amostra Manobras da navegação guiada
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 do Navigation é compatível com a geração de ícones de manobra para um determinado 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];