Thông tin chi tiết về nguồn cấp dữ liệu theo từng chặng

Nguồn cấp dữ liệu đường đi từng chặng cung cấp thông tin chỉ đường cho các thiết bị không được thiết kế để hướng dẫn đường đi dựa trên bản đồ. Thành phần này cung cấp các thao tác sắp tới bằng các phần tử mà bạn cung cấp:

  • biểu tượng (trái, phải, rẽ vòng ngược)
  • số thứ tự rẽ trong vòng xoay
  • tên đường
  • khoảng cách và thời gian ước tính đến bước điều hướng tiếp theo hoặc đích đến cuối cùng

Bạn có thể sử dụng nguồn cấp dữ liệu từng chặng để tạo trải nghiệm khi giao diện người dùng SDK chỉ đường đầy đủ không phù hợp, chẳng hạn như đối với màn hình nhỏ. Ví dụ: bạn có thể sử dụng tính năng này cho người lái xe hai bánh, trong đó bạn có thể chiếu hướng dẫn chỉ đường để giúp họ đến đích nhanh hơn và tự tin hơn với ít sự phân tâm nhất.

Các thành phần hiển thị điều hướng thiết yếu

Màn hình thiết bị di động hiển thị một biển báo rẽ phải sắp tới trong vòng 15 mét vào đường Church. Ở cuối màn hình, thời gian còn lại để đến đích là 13 phút và quãng đường còn lại là 2, 1 dặm.

Các trường chính cho mỗi bước điều hướng là tên đường đầy đủ, thao tác và tổng quãng đường của bước, có trong GMSNavigationStepInfo.

Đối với chuyến đi tổng thể, bạn có thể muốn hiển thị thời gian và quãng đường còn lại đến bước hiện tại hoặc đến đích đến, tất cả đều có trong GMSNavigationNavInfo. Hình ảnh bên phải cho thấy ví dụ về các thành phần điều hướng thiết yếu này.

Thiết lập trình nghe sự kiện

Để sử dụng dữ liệu chỉ dành cho điều hướng, bạn phải triển khai trình nghe sự kiện cho sự kiện didChangeNavInfo. Trong trình nghe sự kiện, hãy truy cập thông tin về chuyến đi và bước để cung cấp thông tin chỉ đường từng chặng cho người dùng.

Để triển khai trình xử lý sự kiện, trình điều khiển thành phần hiển thị của bản đồ phải triển khai giao thức GMSNavigatorListener. Để biết thông tin chi tiết về cách xử lý sự kiện trong SDK điều hướng cho iOS, hãy xem phần Nghe sự kiện điều hướng.

Xử lý sự kiện didChangeNavInfo

Tạo trình nghe cho sự kiện didChangeNavInfo để thêm tính năng hỗ trợ từng chặng vào ứng dụng. Trong trình nghe sự kiện, hãy sử dụng các lớp và enum sau để kiểm soát tính năng chỉ đường từng chặng:

  • GMSNavigationNavInfo – Lớp xác định thông tin về trạng thái điều hướng.

  • GMSNavigationStepInfo – Lớp xác định thông tin về một bước dọc theo tuyến đường điều hướng.

  • GMSNavigationNavState – Enum xác định trạng thái hiện tại của một hành trình, chẳng hạn như đang trên đường, đang định tuyến lại hoặc đã dừng.

  • GMSNavigationDrivingSide – Enum xác định bước này là trên tuyến đường lái xe bên phải hay bên trái.

  • GMSNavigationManeuver – Enum xác định hành động điều hướng cần thực hiện, chẳng hạn như rẽ trái hoặc rẽ phải.

Dưới đây là ví dụ về trình nghe sự kiện cho sự kiện 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
          ...
        }
      }
    }
  }

Sử dụng thuộc tính navState của GMSNavigationNavInfo để biết trạng thái điều hướng hiện tại, trạng thái này là một trong những trạng thái sau:

  • Enroute (Đang trên đường) – Trạng thái GMSNavigationNavStateEnroute có nghĩa là tính năng chỉ đường đang hoạt động và người dùng đang đi theo tuyến đường đã cung cấp. Có thông tin về bước điều động sắp tới.

  • Đổi tuyến đườngGMSNavigationNavStateRerouting có nghĩa là quá trình điều hướng đang diễn ra, nhưng trình điều hướng đang tìm một tuyến đường mới. Bạn không thể thực hiện bước điều động sắp tới vì chưa có tuyến đường mới.

  • Đã dừngGMSNavigationNavStateStopped có nghĩa là quá trình điều hướng đã kết thúc. Ví dụ: tính năng điều hướng sẽ dừng khi người dùng thoát khỏi tính năng điều hướng trong ứng dụng. Trong ứng dụng mẫu, trạng thái GMSNavigationNavStateStopped sẽ xoá màn hình thông tin điều hướng để ngăn việc hiển thị hướng dẫn bước còn lại.

Hướng dẫn làn đường

SDK Điều hướng thể hiện các làn đường trong thẻ rẽ của chỉ đường dưới dạng đối tượng dữ liệu GMSNavigationLaneGMSNavigationLaneDirection. Đối tượng GMSNavigationLane đại diện cho một làn đường cụ thể trong quá trình điều hướng và có danh sách các đối tượng GMSNavigationLaneDirection mô tả tất cả các ngã rẽ có thể thực hiện từ làn đường này.

Hướng mà người lái xe nên đi trong làn đường được đánh dấu bằng trường recommended.

Ví dụ về tính năng hướng dẫn làn đường

Đoạn mã sau đây minh hoạ cách trình bày dữ liệu của các làn đường hiển thị trong ảnh chụp màn hình trước.

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

Hình ảnh hướng dẫn làn đường

Navigation SDK hỗ trợ tạo hình ảnh làn đường cho từng bước điều hướng do GMSNavigationStepInfo truyền tải. Các biểu tượng này phù hợp với hướng dẫn về kích thước hình ảnh của 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];
      

Tạo biểu tượng cho các thao tác

biểu tượng thao tác

Enum GMSNavigationManeuver xác định từng thao tác có thể xảy ra trong khi điều hướng và bạn có thể lấy thao tác cho một bước nhất định từ thuộc tính maneuver của GMSNavigationStepInfo.

Bạn phải tạo biểu tượng thao tác và ghép nối các biểu tượng đó với thao tác liên quan. Đối với một số thao tác, bạn có thể thiết lập mối liên kết một với một đến một biểu tượng, chẳng hạn như GMSNavigationManeuverDestinationLeftGMSNavigationManeuverDestinationRight. Tuy nhiên, vì một số thao tác có chung đặc điểm với các thao tác khác, nên bạn có thể muốn liên kết nhiều thao tác với một biểu tượng. Ví dụ: GMSNavigationManeuverTurnLeftGMSNavigationManeuverOnRampLeft đều có thể liên kết với biểu tượng rẽ trái.

Một số thao tác lái xe có thêm nhãn "Theo chiều kim đồng hồ" hoặc "Ngược chiều kim đồng hồ". SDK xác định nhãn này dựa trên bên lái xe của một quốc gia. Ví dụ: ở những quốc gia mà người lái xe đi ở bên trái đường, họ sẽ rẽ vòng tròn hoặc rẽ ngược theo chiều kim đồng hồ, trong khi ở những quốc gia mà người lái xe đi ở bên phải đường, họ sẽ rẽ ngược theo chiều kim đồng hồ. SDK Điều hướng phát hiện liệu một thao tác lái xe có xảy ra ở làn đường bên trái hay bên phải và xuất ra thao tác lái xe thích hợp. Do đó, biểu tượng thao tác của bạn có thể khác nhau đối với thao tác theo chiều kim đồng hồ so với thao tác ngược chiều kim đồng hồ.

Mở rộng để xem các biểu tượng ví dụ về các thao tác khác nhau

Biểu tượng mẫu Thao tác từng chặng
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

Sử dụng biểu tượng được tạo

SDK Điều hướng hỗ trợ tạo biểu tượng thao tác cho một GMSNavigationStepInfo nhất định. Các biểu tượng này phù hợp với hướng dẫn về việc định cỡ hình ảnh cho 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];