Навигационный SDK в настоящее время доступен только избранным клиентам. Свяжитесь с отделом продаж , чтобы узнать больше.
Скоро на платформе Google Maps появится новый стиль карт. Это обновление стиля карты включает новую цветовую палитру по умолчанию и улучшения интерфейса и удобства использования карты. Все стили карт будут автоматически обновлены в марте 2025 г. Дополнительную информацию о доступности и о том, как принять участие раньше, см. в разделе «Новый стиль карты для платформы Google Maps ».
Оптимизируйте свои подборки
Сохраняйте и классифицируйте контент в соответствии со своими настройками.
Используйте это руководство, чтобы ваше приложение могло прослушивать и реагировать на различные события, которые изменяются по мере того, как пользователь перемещается по маршруту. В этом руководстве не рассматривается определение маршрута, а только реагирование на события на маршруте.
Обзор
Навигационный SDK для iOS предоставляет вам прослушиватели, связанные с местоположением пользователя и условиями на маршруте, а также важные данные о времени и расстоянии. В контроллере представления карты ваше приложение должно принять протоколы для этих прослушивателей: GMSRoadSnappedLocationProviderListener и GMSNavigatorListener .
В этом списке показаны методы прослушивателя, доступные для событий навигации:
GMSNavigatorListener.didChangeSuggestedLightingMode , срабатывает при обновлении предполагаемых условий освещения. Например, когда в текущем местоположении пользователя наступает ночь, освещение меняется.
Показать/скрыть код Swift для прослушивателя событий.
/*
* Copyright 2020 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,
GMSNavigatorListener,
GMSRoadSnappedLocationProviderListener
{
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)
// Add listeners for GMSNavigator and GMSRoadSnappedLocationProvider.
mapView.navigator?.add(self)
mapView.roadSnappedLocationProvider?.add(self)
// Set the time update threshold (seconds) and distance update threshold (meters).
mapView.navigator?.timeUpdateThreshold = 10
mapView.navigator?.distanceUpdateThreshold = 100
// Show the terms and conditions.
let companyName = "Ride Sharing Co."
GMSNavigationServices.showTermsAndConditionsDialogIfNeeded(
withCompanyName: companyName
) { termsAccepted in
if termsAccepted {
// Enable navigation if the user accepts the terms.
self.mapView.isNavigationEnabled = true
// Request authorization to use location services.
self.locationManager.requestAlwaysAuthorization()
// Request authorization for alert notifications which deliver guidance instructions
// in the background.
UNUserNotificationCenter.current().requestAuthorization(options: [.alert]) {
granted, error in
// Handle denied authorization to display notifications.
if !granted || error != nil {
print("Authorization to deliver notifications was rejected.")
}
}
} else {
// Handle the case when the user rejects the terms and conditions.
}
}
view = mapView
makeButton()
}
// Create a route and start guidance.
@objc 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()
}
// Listener to handle continuous location updates.
func locationProvider(
_ locationProvider: GMSRoadSnappedLocationProvider,
didUpdate location: CLLocation
) {
print("Location: \(location.description)")
}
// Listener to handle speeding events.
func navigator(
_ navigator: GMSNavigator, didUpdateSpeedingPercentage percentageAboveLimit: CGFloat
) {
print("Speed is \(percentageAboveLimit) above the limit.")
}
// Listener to handle arrival events.
func navigator(_ navigator: GMSNavigator, didArriveAt waypoint: GMSNavigationWaypoint) {
print("You have arrived at: \(waypoint.title)")
mapView.navigator?.continueToNextDestination()
mapView.navigator?.isGuidanceActive = true
}
// Listener for route change events.
func navigatorDidChangeRoute(_ navigator: GMSNavigator) {
print("The route has changed.")
}
// Listener for time to next destination.
func navigator(_ navigator: GMSNavigator, didUpdateRemainingTime time: TimeInterval) {
print("Time to next destination: \(time)")
}
// Delegate for distance to next destination.
func navigator(
_ navigator: GMSNavigator,
didUpdateRemainingDistance distance: CLLocationDistance
) {
let miles = distance * 0.00062137
print("Distance to next destination: \(miles) miles.")
}
// Delegate for traffic updates to next destination
func navigator(
_ navigator: GMSNavigator,
didUpdate delayCategory: GMSNavigationDelayCategory
) {
print("Delay category to next destination: \(String(describing: delayCategory)).")
}
// Delegate for suggested lighting mode changes.
func navigator(
_ navigator: GMSNavigator,
didChangeSuggestedLightingMode lightingMode: GMSNavigationLightingMode
) {
print("Suggested lighting mode has changed: \(String(describing: lightingMode))")
// Change to the suggested lighting mode.
mapView.lightingMode = lightingMode
}
// Add a button to the view.
func makeButton() {
// 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)
}
}
Показать/скрыть код Objective-C для прослушивателя событий.
/*
* Copyright 2020 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 () <GMSNavigatorListener, GMSRoadSnappedLocationProviderListener>
@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];
// Add listeners for GMSNavigator and GMSRoadSnappedLocationProvider.
[_mapView.navigator addListener:self];
[_mapView.roadSnappedLocationProvider addListener:self];
// Set the time update threshold (seconds) and distance update threshold (meters).
_mapView.navigator.timeUpdateThreshold = 10;
_mapView.navigator.distanceUpdateThreshold = 100;
// 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 makeButton];
}
// Create a route and initiate navigation.
- (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.navigator.sendsBackgroundNotifications = YES;
_mapView.cameraMode = GMSNavigationCameraModeFollowing;
[_mapView.locationSimulator simulateLocationsAlongExistingRoute];
}];
[_mapView.roadSnappedLocationProvider startUpdatingLocation];
}
#pragma mark - GMSNavigatorListener
// Listener for continuous location updates.
- (void)locationProvider:(GMSRoadSnappedLocationProvider *)locationProvider
didUpdateLocation:(CLLocation *)location {
NSLog(@"Location: %@", location.description);
}
// Listener to handle speeding events.
- (void)navigator:(GMSNavigator *)navigator
didUpdateSpeedingPercentage:(CGFloat)percentageAboveLimit {
NSLog(@"Speed is %f percent above the limit.", percentageAboveLimit);
}
// Listener to handle arrival events.
- (void)navigator:(GMSNavigator *)navigator didArriveAtWaypoint:(GMSNavigationWaypoint *)waypoint {
NSLog(@"You have arrived at: %@", waypoint.title);
[_mapView.navigator continueToNextDestination];
_mapView.navigator.guidanceActive = YES;
}
// Listener for route change events.
- (void)navigatorDidChangeRoute:(GMSNavigator *)navigator {
NSLog(@"The route has changed.");
}
// Listener for time to next destination.
- (void)navigator:(GMSNavigator *)navigator didUpdateRemainingTime:(NSTimeInterval)time {
NSLog(@"Time to next destination: %f", time);
}
// Listener for distance to next destination.
- (void)navigator:(GMSNavigator *)navigator
didUpdateRemainingDistance:(CLLocationDistance)distance {
double miles = distance * 0.00062137;
NSLog(@"%@", [NSString stringWithFormat:@"Distance to next destination: %.2f.", miles]);
}
// Listener for traffic updates for next destination
- (void)navigator:(GMSNavigator *)navigator
didUpdateDelayCategory:(GMSNavigationDelayCategory)delayCategory {
NSLog(@"Delay category to next destination: %ld.", delayCategory);
}
// Listener for suggested lighting mode changes.
-(void)navigator:(GMSNavigator *)navigator
didChangeSuggestedLightingMode:(GMSNavigationLightingMode)lightingMode {
NSLog(@"Suggested lighting mode has changed: %ld", (long)lightingMode);
// Change to the suggested lighting mode.
_mapView.lightingMode = lightingMode;
}
#pragma mark - Programmatic UI elements
// Add a button to the view.
- (void)makeButton {
// Start navigation.
UIButton *navButton = [UIButton buttonWithType:UIButtonTypeCustom];
[navButton addTarget:self
action:@selector(startNav)
forControlEvents:UIControlEventTouchUpInside];
[navButton setTitle:@"Navigate" forState:UIControlStateNormal];
[navButton setBackgroundColor:[UIColor blueColor]];
[navButton setAlpha:0.5];
navButton.frame = CGRectMake(5.0, 150.0, 100.0, 35.0);
[_mapView addSubview:navButton];
}
@end
Декларирование соответствия требуемым протоколам
Перед реализацией методов навигации контроллер представления должен принять протоколы:
Быстрый
класс ViewController: UIViewController, GMSNavigatorListener, GMSRoadSnappedLocationProviderListener {
Цель-C
@interface ViewController ()
@конец
После принятия протоколов навигации установите прослушиватели на контроллер представления. Например, вы можете добавить следующий код в метод viewDidLoad() .
Обновления местоположения необходимы для отображения прогресса пользователя на карте.
Экземпляр location предоставляет следующие свойства:
Местоположение объекта
Описание
высота
Текущая высота.
координата.широта
Текущая координата широты, привязанная к дороге.
координата.долгота
Текущая координата долготы, привязанная к дороге.
курс
Текущий подшипник в градусах.
скорость
Текущая скорость.
временная метка
Дата/время текущего чтения.
Чтобы получать постоянные обновления местоположения, вызовите mapView.roadSnappedLocationProvider.startUpdatingLocation и используйте GMSRoadSnappedLocationProviderListener для обработки события didUpdateLocation .
В следующем примере показан вызов startUpdatingLocation :
Ваше приложение использует событие didArriveAtWaypoint чтобы определить, когда пункт назначения был достигнут. Вы можете возобновить наведение и перейти к следующей путевой точке, вызвав continueToNextDestination() , а затем повторно включив наведение. Ваше приложение должно повторно включить руководство после вызова continueToNextDestination() .
После того, как приложение вызывает continueToNextDestination , у навигатора больше нет данных о предыдущем пункте назначения. Если вы хотите проанализировать информацию об участке маршрута, вы должны получить ее от навигатора до вызова continueToNextDestination() .
В следующем примере кода показан метод обработки события didArriveAtWaypoint :
Чтобы получать уведомление при каждом изменении маршрута, создайте метод для обработки события navigatorDidChangeRoute . Вы можете получить доступ к новому маршруту, используя свойства routeLegs и currentRouteLegGMSNavigator .
Получение обновлений о времени до места назначения
Чтобы получать непрерывные обновления времени до места назначения, создайте метод для обработки события didUpdateRemainingTime . Параметр time предоставляет расчетное время в секундах до достижения следующего пункта назначения.
Быстрый
func navigator(_ navigator: GMSNavigator, DidUpdateRemainingTime time: TimeInterval) { print("Время до следующего пункта назначения: (время)") }
Цель-C
(void)navigator:(GMSNavigator *)navigator DidUpdateRemainingTime:(NSTimeInterval)time {NSLog(@"Время до следующего пункта назначения: %f", time); }
Чтобы установить минимальное изменение расчетного времени до следующего пункта назначения, установите свойство timeUpdateThreshold в GMSNavigator . Значение указывается в секундах. Если это свойство не установлено, службы используют значение по умолчанию, равное одной секунде.
Быстрый
навигатор?.timeUpdateThreshold = 10
Цель-C
navigator.timeUpdateThreshold = 10;
Получение обновлений о расстоянии до пункта назначения
Чтобы получать непрерывные обновления расстояния до места назначения, создайте метод для обработки события didUpdateRemainingDistance . Параметр distance предоставляет расчетное расстояние в метрах до следующего пункта назначения.
Быстрый
func navigator(_ navigator: GMSNavigator, DidUpdateRemainingDistance distance: CLLocationDistance) { letmiles = distance * 0.00062137 print("Расстояние до следующего пункта назначения: (мили) миль.") }
Цель-C
(void) navigator: (GMSNavigator *) navigator DidUpdateRemainingDistance: (CLLocationDistance) расстояние {двойные мили = расстояние * 0,00062137; NSLog(@"%@", [NSString stringWithFormat:@"Расстояние до следующего пункта назначения: %.2f.", миль]); }
Чтобы установить минимальное изменение расчетного расстояния до следующего пункта назначения, установите свойство distanceUpdateThreshold в GMSNavigator (значение указывается в метрах). Если это свойство не установлено, службы используют значение по умолчанию, равное одному счетчику.
Быстрый
навигатор?.distanceUpdateThreshold = 100
Цель-C
navigator.distanceUpdateThreshold = 100;
Получение обновлений о пробках
Чтобы получать постоянные обновления потока трафика для оставшегося маршрута, создайте метод для обработки события didUpdateDelayCategory . Вызов delayCategoryToNextDestination возвращает GMSNavigationDelayCategory , который предоставляет значение от 0 до 3. Обновления категории основаны на текущем положении пользователя приложения. Если данные о трафике недоступны, GMSNavigationDelayCategory возвращает 0. Числа от 1 до 3 указывают на увеличение потока от легкого до интенсивного.
Быстрый
func navigator(_ navigator: GMSNavigator, DidUpdatelayCategory: GMSNavigationDelayCategory) { print("Поток трафика к следующему пункту назначения: (delayCategory)") }
Цель-C
(void)navigator:(GMSNavigator *)navigator DidUpdateDelayCategory:(GMSNavigationDelayCategory)delayCategory {NSLog(@"Поток трафика к следующему пункту назначения: %ld", (long)delayCategory); }
Свойство GMSNavigationDelayCategory предоставляет следующие уровни задержки:
Категория задержки
Описание
GMSNavigationDelayCategoryNoData
0 - Недоступно, нет данных о трафике или:
маршрут.
GMSNavigationDelayCategoryHeavy
1 - Тяжелый.
GMSNavigationDelayCategoryMedium
2 – Средний.
GMSNavigationDelayCategoryLight
3 - Свет.
Получение обновлений о превышении скорости
Чтобы получать обновления, когда водитель превышает ограничение скорости, создайте метод для обработки события didUpdateSpeedingPercentage .
Быстрый
// Прослушиватель для обработки событий превышения скорости. func navigator( _ navigator: GMSNavigator, DidUpdateSpeedingPercentage процентAboveLimit: CGFloat ) { print("Скорость (percentageAboveLimit) превышает предел.") }
Цель-C
// Прослушиватель для обработки событий превышения скорости. - (void)navigator:(GMSNavigator *)navigator DidUpdateSpeedingPercentage:(CGFloat)percentageAboveLimit { NSLog(@"Скорость на %f процентов превышает предел.", процентAboveLimit); }
Изменение предлагаемого режима освещения
Чтобы получать обновления предполагаемых изменений освещения, создайте метод для обработки события didChangeSuggestedLightingMode .
Быстрый
// Определить прослушиватель предлагаемых изменений режима освещения. func navigator(_ navigator: GMSNavigator, DidChangeSuggestedLightingMode LightingMode: GMSNavigationLightingMode) { print("Предлагаемый режим освещения изменился: (String(описание: LightingMode))")
// Вносим предложенное изменение. mapView.lightingMode = режим освещения }
Цель-C
// Определить прослушиватель предлагаемых изменений режима освещения. -(void)navigator:(GMSNavigator *)navigator DidChangeSuggestedLightingMode: (GMSNavigationLightingMode)lightingMode { NSLog(@"Предлагаемый режим освещения изменился: %ld", (long)lightingMode);
// Вносим предложенное изменение. _mapView.lightingMode = режим освещения; }