Проведите маршрут на картах Mapbox от двух точек. (Последняя версия Mapbox v3.4.0 и Mapbox Maps v11)

Вопрос или проблема

Мне нужно добавить маршрут в 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!

Код, где я пытаюсь показать сгенерированный маршрут на Mapview, пытаюсь использовать последнюю версию spm (Последняя версия Mapbox v3.4.0 и Mapbox Mapsv 11)

Ответ или решение

Построение маршрута на Mapbox Maps: Руководство по реализации функционала маршрутизации

Введение

С учетом значимости высококачественной мобильной навигации в современных приложениях, интеграция маршрутизации с использованием Mapbox становится ключевым элементом для улучшения пользовательского опыта. В данной статье мы подробно рассмотрим, как добавить маршрут на NavigationMapView на основе двух заданных точек, используя последние версии библиотеки Mapbox (v3.4.0 и Maps v11).

Цели и задачи

Основная задача заключается в том, чтобы отобразить маршрут между двумя точками на карте, без активации функции пошаговой навигации. Важно, чтобы пользователь мог визуально оценить маршрут, что актуально как для городских условий, так и для путешествий.

Реализация

Мы начнем с функции calculateRoute, которая берет две координаты (начальную и конечную) в виде CLLocationCoordinate2D, и создает маршрут. Важнейшими элементами кода будут:

  1. Создание путевых точек (Waypoint): Определите начальную и конечную точки маршрута.
  2. Настройка опций маршрута: Укажите параметры маршрута, включая профиль движения (например, автомобиль без пробок).
  3. Запрос маршрута: Используйте Directions.shared.calculate, чтобы отправить запрос на сервер и получить ответ.
  4. Обработка ответа: В зависимости от результата запроса, отобразите маршрут или обработайте ошибку.

Вот пример кода:

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)
            }
        }
    }
}

Объяснение кода

  1. Waypoint: Обе точки маршрута создаются с помощью объекта Waypoint, который включает координаты и метки.
  2. NavigationRouteOptions: Опции маршрута устанавливаются для автомобилей с учетом избегания пробок.
  3. Обработка ответа: Успешный ответ обрабатывается в блоке success, где маршрут отображается на карте, а ошибки логируются для дальнейшего анализа.

Заключение

С использованием вышеуказанного кода, вы сможете отобразить маршрут между двумя заданными точками на NavigationMapView, что существенно улучшит взаимодействие пользователей с вашим приложением. Mapbox предоставляет мощные инструменты для работы с маршрутизацией, что делает его отличным выбором для разработчиков стремящихся создавать интуитивные навигационные решения.

Надеюсь, это руководство поможет вам успешно интегрировать функцию маршрутизации в ваше приложение! Если у вас возникнут дополнительные вопросы или требуются уточнения, не стесняйтесь обращаться за помощью.

Оцените материал
Добавить комментарий

Капча загружается...