Вопрос или проблема
Мне нужно добавить маршрут в NavigationMapView Storyboard!. Это должно просто показать маршрут и не активировать пошаговую навигацию.
func calculateRoute(from Origin: CLLocationCoordinate2D, to Destination: CLLocationCoordinate2D) {
let origin = Waypoint(coordinate: Origin, coordinateAccuracy: -1, name: "Старт")
let destination = Waypoint(coordinate: Destination, coordinateAccuracy: -1, name: "Финиш")
let routeOptions = NavigationRouteOptions(waypoints: [origin, destination], profileIdentifier: .automobileAvoidingTraffic)
self.showRouteLoader()
Directions.shared.calculate(routeOptions) { [weak self] result in
guard let self = self else { return }
DispatchQueue.main.async {
self.hideRouteLoader()
switch result {
case .failure(let error):
print(error.localizedDescription)
BreadcrumbsManager.sharedInstance.logcustomBreadcrumb(message: error.localizedDescription, category: "MapBoxFailed")
self.showErrorMessage(error.localizedDescription)
case .success(let response):
guard let route = response.routes?.first else { return }
self.route = route
self.routes = response.routes
self.routeOptions = routeOptions
self.NavMapView.mapView
// Показать маршрут и контрольную точку назначения, и установить камеру
var navigationRoutes: NavigationRoutes
let navigationProvider = MapboxNavigationProvider(coreConfig: CoreConfig())
let mapboxNavigationProvider = MapboxNavigationProvider(coreConfig: .init())
let mapboxNavigation = navigationProvider.mapboxNavigation
let routingProvider = mapboxNavigation.routingProvider()
let navigationRoutes = routingProvider.calculateRoutes(options: routeOptions).value {}
self.NavMapView.showcase(navigationRoutes, animated: true)
let coordinates = route.shape?.coordinates ?? []
let insets = UIEdgeInsets(top: 0, left: 50, bottom: 405, right: 50)
let camera = self.NavMapView.mapView.mapboxMap.camera(for: coordinates, padding: insets, bearing: nil, pitch: nil)
self.cameraRouteAnimation(from: Origin, to: Destination)
}
}
}
}
@IBOutlet var NavMapView: NavigationMapView!
Ответ или решение
Построение маршрута на Mapbox Maps: Руководство по реализации функционала маршрутизации
Введение
С учетом значимости высококачественной мобильной навигации в современных приложениях, интеграция маршрутизации с использованием Mapbox становится ключевым элементом для улучшения пользовательского опыта. В данной статье мы подробно рассмотрим, как добавить маршрут на NavigationMapView
на основе двух заданных точек, используя последние версии библиотеки Mapbox (v3.4.0 и Maps v11).
Цели и задачи
Основная задача заключается в том, чтобы отобразить маршрут между двумя точками на карте, без активации функции пошаговой навигации. Важно, чтобы пользователь мог визуально оценить маршрут, что актуально как для городских условий, так и для путешествий.
Реализация
Мы начнем с функции calculateRoute
, которая берет две координаты (начальную и конечную) в виде CLLocationCoordinate2D
, и создает маршрут. Важнейшими элементами кода будут:
- Создание путевых точек (
Waypoint
): Определите начальную и конечную точки маршрута. - Настройка опций маршрута: Укажите параметры маршрута, включая профиль движения (например, автомобиль без пробок).
- Запрос маршрута: Используйте
Directions.shared.calculate
, чтобы отправить запрос на сервер и получить ответ. - Обработка ответа: В зависимости от результата запроса, отобразите маршрут или обработайте ошибку.
Вот пример кода:
func calculateRoute(from Origin: CLLocationCoordinate2D, to Destination: CLLocationCoordinate2D) {
let origin = Waypoint(coordinate: Origin, coordinateAccuracy: -1, name: "Start")
let destination = Waypoint(coordinate: Destination, coordinateAccuracy: -1, name: "Finish")
let routeOptions = NavigationRouteOptions(waypoints: [origin, destination], profileIdentifier: .automobileAvoidingTraffic)
self.showRouteLoader()
Directions.shared.calculate(routeOptions) { [weak self] result in
guard let self = self else { return }
DispatchQueue.main.async {
self.hideRouteLoader()
switch result {
case .failure(let error):
print(error.localizedDescription)
BreadcrumbsManager.sharedInstance.logcustomBreadcrumb(message: error.localizedDescription, category: "MapBoxFailed")
self.showErrorMessage(error.localizedDescription)
case .success(let response):
guard let route = response.routes?.first else { return }
self.route = route
self.routes = response.routes
self.routeOptions = routeOptions
// Подготовка маршрута к отображению
let navigationProvider = MapboxNavigationProvider(coreConfig: CoreConfig())
let routingProvider = navigationProvider.mapboxNavigation.routingProvider()
routingProvider.calculateRoutes(options: routeOptions).value { result in
guard case let .success(routes) = result, let firstRoute = routes.first else { return }
self.NavMapView.showcase([firstRoute], animated: true)
}
let coordinates = route.shape?.coordinates ?? []
let insets = UIEdgeInsets(top: 0, left: 50, bottom: 405, right: 50)
let camera = self.NavMapView.mapView.mapboxMap.camera(for: coordinates, padding: insets, bearing: nil, pitch: nil)
self.NavMapView.mapView.camera.move(to: camera)
}
}
}
}
Объяснение кода
- Waypoint: Обе точки маршрута создаются с помощью объекта
Waypoint
, который включает координаты и метки. - NavigationRouteOptions: Опции маршрута устанавливаются для автомобилей с учетом избегания пробок.
- Обработка ответа: Успешный ответ обрабатывается в блоке
success
, где маршрут отображается на карте, а ошибки логируются для дальнейшего анализа.
Заключение
С использованием вышеуказанного кода, вы сможете отобразить маршрут между двумя заданными точками на NavigationMapView
, что существенно улучшит взаимодействие пользователей с вашим приложением. Mapbox предоставляет мощные инструменты для работы с маршрутизацией, что делает его отличным выбором для разработчиков стремящихся создавать интуитивные навигационные решения.
Надеюсь, это руководство поможет вам успешно интегрировать функцию маршрутизации в ваше приложение! Если у вас возникнут дополнительные вопросы или требуются уточнения, не стесняйтесь обращаться за помощью.