Следуйте этому руководству, чтобы настроить приложение для получения времени, расстояний и участков текущего маршрута.
Обзор
Чтобы получить информацию о текущем маршруте, получите соответствующее свойство из экземпляра navigator
:
-
GMSNavigator.timeToNextDestination
, чтобы получить прогнозируемое время до следующего пункта назначения на текущем маршруте в секундах. -
GMSNavigator.distanceToNextDestination
, чтобы получить расстояние до следующего пункта назначения на текущем маршруте в метрах. -
GMSNavigationDelayCategory
, чтобы получить категорию задержки для потока трафика. -
GMSNavigator.currentRouteLeg
для получения информации о текущем участке маршрута. -
GMSNavigator.traveledPath
, чтобы получить последний пройденный путь.
Посмотреть код
Показать/скрыть код Swift, чтобы получить информацию о маршруте.
/* * 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) } }
Показать/скрыть код Objective-C, чтобы получить информацию о маршруте.
/* * 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
, из которого вы можете получить:
- Место назначения ноги.
- Конечная координата в ноге.
- Путь, содержащий координаты, составляющие участок маршрута.
В следующем примере показана регистрация названия и координат широты и долготы для следующего участка маршрута:
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);
}
Следуйте этому руководству, чтобы настроить приложение для получения времени, расстояний и участков текущего маршрута.
Обзор
Чтобы получить информацию о текущем маршруте, получите соответствующее свойство из экземпляра navigator
:
-
GMSNavigator.timeToNextDestination
, чтобы получить прогнозируемое время до следующего пункта назначения на текущем маршруте в секундах. -
GMSNavigator.distanceToNextDestination
, чтобы получить расстояние до следующего пункта назначения на текущем маршруте в метрах. -
GMSNavigationDelayCategory
, чтобы получить категорию задержки для потока трафика. -
GMSNavigator.currentRouteLeg
для получения информации о текущем участке маршрута. -
GMSNavigator.traveledPath
, чтобы получить последний пройденный путь.
Посмотреть код
Показать/скрыть код Swift, чтобы получить информацию о маршруте.
/* * 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) } }
Показать/скрыть код Objective-C, чтобы получить информацию о маршруте.
/* * 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
, из которого вы можете получить:
- Место назначения ноги.
- Конечная координата в ноге.
- Путь, содержащий координаты, составляющие участок маршрута.
В следующем примере показана регистрация названия и координат широты и долготы для следующего участка маршрута:
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);
}