Szczegóły dotyczące pliku danych zakręt po zakręcie

Pliki danych z informacjami krok po kroku zawierają informacje nawigacyjne przeznaczone do urządzeń, które nie są przeznaczone do nawigacji na mapie. Umożliwia to uwzględnienie nadchodzących manewrów z uwzględnieniem podanych przez Ciebie elementów:

  • ikony (skręt w lewo, w prawo, zawracanie)
  • numery na rondzie
  • nazwy dróg,
  • szacowane odległości i czas do następnego etapu nawigacji lub docelowego miejsca docelowego;

Możesz użyć danych wskazówek do tworzenia funkcji, w których pełny interfejs Navigation SDK nie jest odpowiedni, np. na małych ekranach. Możesz na przykład wyświetlać wskazówki tylko do nawigacji, aby pomóc użytkownikom pojazdów dwukołowych szybciej i pewniej dotrzeć do celu, przy minimalnych rozpraszających czynnikach.

Podstawowe elementy wyświetlania nawigacji

Ekran telefonu komórkowego z informacją o zbliżającym się skręcie w prawo na ulicę Church. U dołu ekranu czas pozostały do celu to 13 minut, a odległość do pokonania to 3, 4 km.

Główne pola każdego kroku nawigacji to pełna nazwa drogi, manewr i całkowita odległość kroku, które są dostępne w GMSNavigationStepInfo.

W przypadku całej podróży możesz wyświetlić pozostały czas i odległość do bieżącego kroku lub do miejsca docelowego. Wszystkie te informacje są dostępne w GMSNavigationNavInfo. Obraz po prawej stronie przedstawia przykład tych podstawowych elementów nawigacji.

Konfigurowanie detektora zdarzeń

Aby używać danych tylko do nawigacji, musisz zaimplementować detektor zdarzeń didChangeNavInfo. W słuchaczu zdarzeń uzyskuj informacje o trasie i kroku, aby zapewnić użytkownikom nawigację krok po kroku.

Aby zaimplementować metody obsługi zdarzeń, kontroler widoku mapy musi zaimplementować protokół GMSNavigatorListener. Szczegółowe informacje o obsługiwaniu zdarzeń w pakiecie Navigation SDK na iOS znajdziesz w artykule Nasłuchiwanie zdarzeń nawigacji.

Obsługa zdarzenia didChangeNavInfo

Aby dodać do aplikacji obsługę nawigacji krok po kroku, utwórz odbiornik dla zdarzenia didChangeNavInfo. W odbiorniku zdarzenia użyj tych klas i typów enumeracji, aby sterować nawigacją krok po kroku:

  • GMSNavigationNavInfo — Klasa definiująca informacje o stanie nawigacji.

  • GMSNavigationStepInfo – klasa definiująca informacje o pojedynczym kroku na trasie nawigacyjnej.

  • GMSNavigationNavState — Enum określający bieżący stan nawigacji, np. w drodze, przekierowanie lub zatrzymanie.

  • GMSNavigationDrivingSide — Enum określający, czy ten krok jest na trasie z kierunkiem jazdy po prawej czy po lewej stronie.

  • GMSNavigationManeuver — Enum określający działanie nawigacyjne do wykonania, np. skręć w lewo lub w prawo.

Poniżej znajdziesz przykładowe detektory zdarzeń didChangeNavInfo:

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

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

Użyj właściwości navState obiektu GMSNavigationNavInfo, aby uzyskać bieżący stan nawigacji, który może być jeden z tych:

  • W drodze – stan GMSNavigationNavStateEnroute oznacza, że nawigacja przewodnikiem jest obecnie aktywna, a użytkownik znajduje się na wskazanej trasie. Informacje o kroku, który ma być wykonany w ramach bieżącego manewru, są dostępne.

  • Zmiana trasy – GMSNavigationNavStateRerouting oznacza, że nawigacja jest w trakcie, ale nawigator szuka nowej trasy. Następny krok manewru jest niedostępny, ponieważ nie ma jeszcze nowej trasy.

  • Zatrzymano GMSNavigationNavStateStopped oznacza, że nawigacja została zakończona. Na przykład nawigacja kończy się, gdy użytkownik ją zamknie. W przypadku aplikacji przykładowej stan GMSNavigationNavStateStopped powoduje wyczyszczenie informacji o nawigacji, aby zapobiec wyświetlaniu instrukcji z poprzedniego kroku.

Asystent pasa ruchu

Pakiet SDK nawigacji reprezentuje pasy na karcie skrętu w nawigacji jako obiekty danych GMSNavigationLaneGMSNavigationLaneDirection. Obiekt GMSNavigationLane reprezentuje określony pas podczas nawigacji i zawiera listę obiektów GMSNavigationLaneDirection, które opisują wszystkie zakręty, które można wykonać na tym pasie.

Pole recommended wskazuje zalecany kierunek jazdy po pasie.

Przykład asystenta pasa ruchu

Poniższy fragment kodu przedstawia dane dotyczące pasów wyświetlone na poprzednim zrzucie ekranu.

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

Obrazy asystenta pasa ruchu

Pakiet SDK do nawigacji obsługuje generowanie obrazów pasów ruchu dla każdego kroku nawigacji, jak podano w GMSNavigationStepInfo. Te ikony są zgodne z zaleceniami dotyczącymi rozmiarów obrazów w 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];
      

Tworzenie ikon manewrów

Ikona manewru

Enum GMSNavigationManeuver definiuje wszystkie możliwe manewry, które mogą wystąpić podczas nawigacji. Manewr dla danego kroku można uzyskać z właściwości maneuver obiektu GMSNavigationStepInfo.

Musisz utworzyć ikony manewrów i sparować je z powiązanymi manewrami. W przypadku niektórych manewrów możesz skonfigurować bezpośrednie mapowanie na ikonę, taką jak GMSNavigationManeuverDestinationLeftGMSNavigationManeuverDestinationRight. Ponieważ jednak niektóre manewry mają wspólne cechy, możesz zmapować więcej niż jeden manewr do jednej ikony. Na przykład GMSNavigationManeuverTurnLeftGMSNavigationManeuverOnRampLeft mogą być mapowane na ikonę skrętu w lewo.

Niektóre manewry zawierają dodatkową etykietę „W prawo” lub „W lewo”, którą pakiet SDK określa na podstawie strony jezdni w danym kraju. Na przykład w krajach, w których ruch odbywa się po lewej stronie drogi, kierowcy pokonują rondo lub wykonują manewr cofania zgodnie z kierunkiem ruchu wskazówek zegara, a w krajach, w których ruch odbywa się po prawej stronie drogi, – w przeciwnym kierunku. Pakiet SDK nawigacji wykrywa, czy manewr odbywa się po lewej czy po prawej stronie drogi, i wyświetla odpowiedni manewr. Dlatego ikona manewru może się różnić w zależności od tego, czy manewr odbywa się zgodnie z kierunkiem ruchu wskazówek zegara, czy przeciwnie do niego.

Rozwiń, aby zobaczyć przykłady ikon różnych manewrów

Przykładowa ikona Manewry zakręt po zakręcie
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

Używanie wygenerowanych ikon

Pakiet SDK do nawigacji obsługuje generowanie ikon manewrów dla danego GMSNavigationStepInfo. Te ikony są zgodne z zaleceniami dotyczącymi rozmiaru obrazu w 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];