경로 정보 가져오기

이 가이드를 따라 현재 경로의 시간, 거리, 경로 구간을 가져오도록 앱을 설정하세요.

개요

현재 경로에 관한 정보를 가져오려면 navigator 인스턴스에서 적절한 속성을 가져옵니다.

코드 보기

/*
 * Copyright 2017 Google Inc. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import GoogleNavigation
import UIKit

class ViewController: UIViewController {

  var mapView: GMSMapView!
  var locationManager: CLLocationManager!

  override func loadView() {

    locationManager = CLLocationManager()

    let camera = GMSCameraPosition.camera(withLatitude: 47.67, longitude: -122.20, zoom: 14)
    mapView = GMSMapView.map(withFrame: CGRect.zero, camera: camera)

    // Show the terms and conditions.
    let companyName = "Ride Sharing Co."
    GMSNavigationServices.showTermsAndConditionsDialogIfNeeded(
      withCompanyName: companyName
    ) { termsAccepted in
      guard termsAccepted else {
        // Handle the case when the user rejects the terms and conditions.
        return
      }
      // Enable navigation after the user accepts the terms.
      self.mapView.isNavigationEnabled = true
      // Request authorization to use location services.
      self.locationManager.requestAlwaysAuthorization()
    }

    self.view = mapView
    makeButtons()
  }

  // Create a route and start guidance.
  func startNav() {
    var destinations = [GMSNavigationWaypoint]()
    destinations.append(
      GMSNavigationWaypoint.init(
        placeID: "ChIJnUYTpNASkFQR_gSty5kyoUk",
        title: "PCC Natural Market")!)
    destinations.append(
      GMSNavigationWaypoint.init(
        placeID: "ChIJJ326ROcSkFQRBfUzOL2DSbo",
        title: "Marina Park")!)

    mapView.navigator?.setDestinations(destinations) { routeStatus in
      guard routeStatus == .OK else {
        print("Handle route statuses that are not OK.")
        return
      }
      self.mapView.navigator?.isGuidanceActive = true
      self.mapView.cameraMode = .following
      self.mapView.locationSimulator?.simulateLocationsAlongExistingRoute()
    }

    mapView.roadSnappedLocationProvider?.startUpdatingLocation()
  }

  func getTimeToNextDestination() {
    if let navigator = mapView.navigator {
      let time = navigator.timeToNextDestination
      let minutes = floor(time / 60)
      let seconds = round(time - minutes * 60)
      print("Time to next destination: \(minutes):\(seconds)")
    }
  }

  func getDistanceToNextDestination() {
    if let navigator = mapView.navigator {
      let distance = navigator.distanceToNextDestination
      let miles = distance * 0.00062137
      print("Distance to next destination: \(miles) miles.")
    }
  }

  func getCurrentRouteLeg() {
    if let navigator = mapView.navigator {
      let currentLeg = navigator.currentRouteLeg
      let nextDestination = currentLeg?.destinationWaypoint?.title ?? "Not Available"
      let lat = currentLeg?.destinationCoordinate.latitude.description ?? "Not Available"
      let lng = currentLeg?.destinationCoordinate.longitude.description ?? "Not Available"
      print("Destination: \(nextDestination) at (\(lat),\(lng)")
    }
  }

  func getTraveledPath() {
    if let navigator = mapView.navigator {
      let latestPath = navigator.traveledPath
      if latestPath.count() > 0 {
        let begin: CLLocationCoordinate2D = latestPath.coordinate(at: 0)
        let current: CLLocationCoordinate2D = latestPath.coordinate(at: latestPath.count() - 1)
        print(
          "Path from (\(begin.latitude),\(begin.longitude)) to (\(current.latitude),\(current.longitude))"
        )
      }
    }
  }

  // Add some buttons to the view.
  func makeButtons() {
    // Start navigation.
    let navButton = UIButton(frame: CGRect(x: 5, y: 150, width: 200, height: 35))
    navButton.backgroundColor = .blue
    navButton.alpha = 0.5
    navButton.setTitle("Start navigation", for: .normal)
    navButton.addTarget(self, action: #selector(startNav), for: .touchUpInside)
    self.mapView.addSubview(navButton)

    // Get the time to the next destination.
    let timeButton = UIButton(frame: CGRect(x: 5, y: 190, width: 200, height: 35))
    timeButton.backgroundColor = .blue
    timeButton.alpha = 0.5
    timeButton.setTitle("Time to next destination", for: .normal)
    timeButton.addTarget(self, action: #selector(getTimeToNextDestination), for: .touchUpInside)
    self.mapView.addSubview(timeButton)

    // Get the distance to the next destination.
    let distanceButton = UIButton(frame: CGRect(x: 5, y: 230, width: 200, height: 35))
    distanceButton.backgroundColor = .blue
    distanceButton.alpha = 0.5
    distanceButton.setTitle("Distance to next destination", for: .normal)
    distanceButton.addTarget(
      self, action: #selector(getDistanceToNextDestination), for: .touchUpInside)
    self.mapView.addSubview(distanceButton)

    // Get the current route leg.
    let routeButton = UIButton(frame: CGRect(x: 5, y: 270, width: 200, height: 35))
    routeButton.backgroundColor = .blue
    routeButton.alpha = 0.5
    routeButton.setTitle("Get current route leg", for: .normal)
    routeButton.addTarget(self, action: #selector(getCurrentRouteLeg), for: .touchUpInside)
    self.mapView.addSubview(routeButton)

    // Get the most recently traveled path.
    let pathButton = UIButton(frame: CGRect(x: 5, y: 310, width: 200, height: 35))
    pathButton.backgroundColor = .blue
    pathButton.alpha = 0.5
    pathButton.setTitle("Get traveled path", for: .normal)
    pathButton.addTarget(self, action: #selector(getTraveledPath), for: .touchUpInside)
    self.mapView.addSubview(pathButton)

  }

}
/*
 * Copyright 2017 Google Inc. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#import "ViewController.h"
@import GoogleNavigation;

@interface ViewController ()

@end

@implementation ViewController {
  GMSMapView *_mapView;
  CLLocationManager *_locationManager;
}

- (void)loadView {

  _locationManager = [[CLLocationManager alloc] init];

  GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:47.67
                                                          longitude:-122.20
                                                               zoom:14];
  _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera];

  // Show the terms and conditions.
  NSString *companyName = @"Ride Sharing Co.";
  [GMSNavigationServices
   showTermsAndConditionsDialogIfNeededWithCompanyName:companyName
                                              callback:^(BOOL termsAccepted) {
     if (termsAccepted) {
       // Enable navigation if the user accepts the terms.
       _mapView.navigationEnabled = YES;

       // Request authorization to use location services.
       [_locationManager requestAlwaysAuthorization];

     } else {
       // Handle the case when the user rejects the terms and conditions.
     }
   }];

  self.view = _mapView;

  [self makeButtons];
}

// Create a route and start guidance.
- (void)startNav {
  NSArray<GMSNavigationWaypoint *> *destinations =
  @[[[GMSNavigationWaypoint alloc] initWithPlaceID:@"ChIJnUYTpNASkFQR_gSty5kyoUk"
                                             title:@"PCC Natural Market"],
    [[GMSNavigationWaypoint alloc] initWithPlaceID:@"ChIJJ326ROcSkFQRBfUzOL2DSbo"
                                             title:@"Marina Park"]];

  [_mapView.navigator setDestinations:destinations
                             callback:^(GMSRouteStatus routeStatus){
                               _mapView.navigator.guidanceActive = YES;
                               _mapView.cameraMode = GMSNavigationCameraModeFollowing;
                               [_mapView.locationSimulator simulateLocationsAlongExistingRoute];
                             }];

  [_mapView.roadSnappedLocationProvider startUpdatingLocation];
}

- (void)getTimeToNextDestination {
  NSTimeInterval time = _mapView.navigator.timeToNextDestination;
  int minutes = floor(time/60);
  int seconds = round(time - minutes * 60);
  NSLog(@"%@", [NSString stringWithFormat:@"Time to next destination: %i:%i.", minutes, seconds]);
}

- (void)getDistanceToNextDestination {
  CLLocationDistance distance = _mapView.navigator.distanceToNextDestination;
  double miles = distance * 0.00062137;
  NSLog(@"%@", [NSString stringWithFormat:@"Distance to next destination: %.2f.", miles]);
}

- (void)getCurrentRouteLeg {
  GMSRouteLeg *currentSegment = _mapView.navigator.currentRouteLeg;
  NSString *nextDestination = currentSegment.destinationWaypoint.title;
  CLLocationDegrees lat = currentSegment.destinationCoordinate.latitude;
  CLLocationDegrees lng = currentSegment.destinationCoordinate.longitude;
  NSLog(@"%@", [NSString stringWithFormat:@"%@, %f/%f", nextDestination, lat, lng]);
}

- (void)getTraveledPath {
  GMSPath *latestPath = _mapView.navigator.traveledPath;
  if (latestPath.count > 0) {
    CLLocationCoordinate2D begin = [latestPath coordinateAtIndex:0];
    CLLocationCoordinate2D current = [latestPath coordinateAtIndex:latestPath.count - 1];
    NSLog(@"Path from %f/%f to %f/%f",
          begin.latitude,
          begin.longitude,
          current.latitude,
          current.longitude);
  }
}

#pragma mark - Buttons and things

// Add some buttons to the view.
- (void)makeButtons {
  // Start navigation.
  UIButton *navButton = [UIButton buttonWithType:UIButtonTypeCustom];
  [navButton addTarget:self
                action:@selector(startNav)
      forControlEvents:UIControlEventTouchUpInside];
  [navButton setTitle:@"Start navigation" forState:UIControlStateNormal];
  [navButton setBackgroundColor:[UIColor blueColor]];
  [navButton setAlpha:0.5];
  navButton.frame = CGRectMake(5.0, 150.0, 200.0, 35.0);
  [_mapView addSubview:navButton];

  // Get the time to the next destination.
  UIButton *timeButton = [UIButton buttonWithType:UIButtonTypeCustom];
  [timeButton addTarget:self
                 action:@selector(getTimeToNextDestination)
       forControlEvents:UIControlEventTouchUpInside];
  [timeButton setTitle:@"Time to next destination" forState:UIControlStateNormal];
  [timeButton setBackgroundColor:[UIColor blueColor]];
  [timeButton setAlpha:0.5];
  timeButton.frame = CGRectMake(5.0, 190.0, 200.0, 35.0);
  [_mapView addSubview:timeButton];

  // Get the distance to the next destination.
  UIButton *distanceButton = [UIButton buttonWithType:UIButtonTypeCustom];
  [distanceButton addTarget:self
                  action:@selector(getDistanceToNextDestination)
        forControlEvents:UIControlEventTouchUpInside];
  [distanceButton setTitle:@"Distance to next destination" forState:UIControlStateNormal];
  [distanceButton setBackgroundColor:[UIColor blueColor]];
  [distanceButton setAlpha:0.5];
  distanceButton.frame = CGRectMake(5.0, 230.0, 200.0, 35.0);
  [_mapView addSubview:distanceButton];

  // Get the current route leg.
  UIButton *routeButton = [UIButton buttonWithType:UIButtonTypeCustom];
  [routeButton addTarget:self
                  action:@selector(getCurrentRouteLeg)
        forControlEvents:UIControlEventTouchUpInside];
  [routeButton setTitle:@"Get current route leg" forState:UIControlStateNormal];
  [routeButton setBackgroundColor:[UIColor blueColor]];
  [routeButton setAlpha:0.5];
  routeButton.frame = CGRectMake(5.0, 270.0, 200.0, 35.0);
  [_mapView addSubview:routeButton];

  // Get the most recently traveled path.
  UIButton *pathButton = [UIButton buttonWithType:UIButtonTypeCustom];
  [pathButton addTarget:self
                 action:@selector(getTraveledPath)
       forControlEvents:UIControlEventTouchUpInside];
  [pathButton setTitle:@"Get current route leg" forState:UIControlStateNormal];
  [pathButton setBackgroundColor:[UIColor blueColor]];
  [pathButton setAlpha:0.5];
  pathButton.frame = CGRectMake(5.0, 310.0, 200.0, 35.0);
  [_mapView addSubview:pathButton];
}


@end

다음 목적지까지 걸리는 시간 확인

다음 목적지까지의 시간을 가져오려면 timeToNextDestination()를 호출합니다. 그러면 NSTimeInterval 값이 반환됩니다. 다음 예는 다음 대상까지의 시간을 로깅하는 방법을 보여줍니다.

if let navigator = mapView.navigator {
  let time = navigator.timeToNextDestination
  let minutes = floor(time/60)
  let seconds = round(time - minutes * 60)
  NSLog("Time to next destination: %.0f:%.0f", minutes, seconds)
}

NSTimeInterval time = _mapView.navigator.timeToNextDestination;
int minutes = floor(time/60);
int seconds = round(time - minutes * 60);
NSLog(@"%@", [NSString stringWithFormat:@"Time to next destination: %i:%i.", minutes, seconds]);

다음 목적지까지의 거리 가져오기

다음 목적지까지의 거리를 가져오려면 distanceToNextDestination()를 호출합니다. 그러면 CLLocationDistance 값이 반환됩니다. 단위는 미터로 지정됩니다.

if let navigator = mapView.navigator {
  let distance = navigator.distanceToNextDestination
  let miles = distance * 0.00062137
  NSLog("Distance to next destination: %.2f miles.", miles)
}

CLLocationDistance distance = _mapView.navigator.distanceToNextDestination;
double miles = distance * 0.00062137;
NSLog(@"%@", [NSString stringWithFormat:@"Distance to next destination: %.2f.", miles]);

다음 목적지까지의 교통상황 확인

다음 대상으로의 트래픽 흐름을 나타내는 값을 가져오려면 delayCategoryToNextDestination를 호출합니다. 이 매개변수는 GMSNavigationDelayCategory를 반환합니다. 다음 예는 결과를 평가하고 트래픽 메시지를 로깅하는 방법을 보여줍니다.

if let navigator = mapView.navigator {
  // insert sample for evaluating traffic value
  let delay = navigator.delayCategoryToNextDestination
  let traffic = "unavailable"
  switch delay {
    case .noData:
      traffic = "unavailable"
    case .heavy:
      traffic = "heavy"
    case .medium:
      traffic = "moderate"
    case .light:
      traffic = "light"
    default:
      traffic = "unavailable"
  }
  print("Traffic is \(traffic).")
}

GMSNavigationDelayCategory delay = mapView.navigator.delayCategoryToNextDestination;
NSString *traffic = @"";

switch (delayCategory) {
    case GMSNavigationDelayCategoryNoData:
      traffic = @"No Data";
      break;
    case GMSNavigationDelayCategoryHeavy:
      traffic = @"Heavy";
      break;
    case GMSNavigationDelayCategoryMedium:
      traffic = @"Medium";
      break;
    case GMSNavigationDelayCategoryLight:
      traffic = @"Light";
      break;
    default:
      NSLog(@"Invalid delay category: %zd", delayCategory);
 }

NSLog(@"%@", [NSString stringWithFormat:@"Traffic is %@.", traffic]);

현재 구간 정보 가져오기

현재 경로 구간에 대한 정보를 가져오려면 currentRouteLeg를 호출합니다. 그러면 GMSRouteLeg 인스턴스가 반환되며 여기에서 다음을 가져올 수 있습니다.

  • 구간의 도착지입니다.
  • 구간의 마지막 좌표입니다.
  • 경로 구간을 구성하는 좌표가 포함된 경로입니다.

다음 예는 다음 경로 구간의 제목과 lat/lng 좌표를 로깅하는 것을 보여줍니다.

if let navigator = mapView.navigator {
  let currentLeg = navigator.currentRouteLeg
  let nextDestination = currentLeg?.destinationWaypoint?.title
  let lat = currentLeg?.destinationCoordinate.latitude.description
  let lng = currentLeg?.destinationCoordinate.longitude.description
  NSLog(nextDestination! + ", " + lat! + "/" + lng!)
}

GMSRouteLeg *currentSegment = _mapView.navigator.currentRouteLeg;
NSString *nextDestination = currentSegment.destinationWaypoint.title;
CLLocationDegrees lat = currentSegment.destinationCoordinate.latitude;
CLLocationDegrees lng = currentSegment.destinationCoordinate.longitude;
NSLog(@"%@", [NSString stringWithFormat:@"%@, %f/%f", nextDestination, lat, lng]);

가장 최근에 이동한 경로 가져오기

가장 최근에 이동한 경로를 가져오려면 traveledPath를 호출합니다. 중복된 점을 삭제하도록 간소화된 GMSPath 인스턴스를 반환합니다 (예: 연속된 직선상의 점을 단일 선분으로 변환). 이 경로는 안내가 시작될 때까지 비어 있습니다. 다음 예는 가장 최근에 이동한 경로를 가져오는 방법을 보여줍니다.

if let navigator = mapView.navigator {
  let latestPath = navigator.traveledPath
  if latestPath.count() > 0 {
    let begin: CLLocationCoordinate2D = latestPath.coordinate(at: 0)
    let current: CLLocationCoordinate2D = latestPath.coordinate(at: latestPath.count() - 1)
    print("Path from (\(begin.latitude),\(begin.longitude)) to (\(current.latitude),\(current.longitude))")
  }
}

GMSPath *latestPath = mapView.navigator.traveledPath;
if (latestPath.count > 0) {
  CLLocationCoordinate2D begin = [latestPath coordinateAtIndex:0];
  CLLocationCoordinate2D current = [latestPath coordinateAtIndex:latestPath.count - 1];
  NSLog(@"Path from %f/%f to %f/%f",
        begin.latitude,
        begin.longitude,
        current.latitude,
        current.longitude);
}