iOS 中的 Mapbox 导航和我的 mapView 控制器

Posted

技术标签:

【中文标题】iOS 中的 Mapbox 导航和我的 mapView 控制器【英文标题】:Mapbox Navigation in iOS with in my mapView controller 【发布时间】:2019-12-10 01:32:12 【问题描述】:

我想在 ios 中集成 Mapbox 导航,我可以轻松获取两个坐标之间的方向/路线,也可以从 mapbox 中获取导航路径,我们可以使用下面的代码

let options = NavigationOptions(styles: nil)
let viewController = NavigationViewController(for: self.directionsRoute!)
viewController.delegate=self    
self.present(viewController, animated: true, completion: nil)

但问题是我想在我的地图视图中显示导航,它是另一个视图控制器的一部分,我可以通过获取方向/路线和指令来做到这一点,但我找不到任何将被调用的方法第二,以便我可以更新路线指令以及路线,以防用户更改路径。

如果我遗漏任何内容或需要任何更改,请告诉我。

-提前致谢

【问题讨论】:

【参考方案1】:

这是我的方法:

首先,我利用 MapBox api 的免费 API 调用配额仅从 MapBox api 获得方向指令,并利用其良好的性能和内存管理在 GMSMapView 或 MapKit 上绘制指令。

podfile

pod 'MapboxDirections.swift'
import MapboxDirections

这是通过以下代码完成的

拥有 MapBox 方向的属性
@IBOutlet weak var googleMapView: GMSMapView!
let locationManager = CLLocationManager()
let mapBoxirections = Directions(accessToken: osmToken)
var path: GMSMutablePath?
然后进行实际的 api 调用
private func drawRouteBetween(source: StopModel, destination: StopModel) 

        guard let name = source.name, let lat = source.latitude, let lng = source.longitude else  return 
        guard let nameDest = destination.name, let latDest = destination.latitude, let lngDest = destination.longitude else  return 

        let waypoints = [
            Waypoint(coordinate: CLLocationCoordinate2D(latitude: lat, longitude: lng), name: name),
            Waypoint(coordinate: CLLocationCoordinate2D(latitude: latDest, longitude: lngDest), name: nameDest),
            ]
        let options = RouteOptions(waypoints: waypoints, profileIdentifier: .automobile)
        options.includesSteps = true
        options.distanceMeasurementSystem = .metric

        mapBoxirections.calculate(options)  (waypoints, routes, error) in
            guard error == nil else 
                print("Error calculating directions: \(error!)")
                return
            

            if let route = routes?.first, let leg = route.legs.first 

                for step in leg.steps 
                    if let coordinates = step.coordinates 
                        for (index, point) in coordinates.enumerated() 
                            let source = point
                            if index <= coordinates.count - 2 
                                let destination = coordinates[index + 1]
                                self.drawPolyLine(source: source, destination: destination)
                            
                        
                    
                

            
        

    

请注意,StopModel 是我定制的 CLLocation,所以只要它有纬度和经度,您可以随意替换它

创建在 CLLocationManagerDelegate 上绘制折线的方法,如下所示

private func drawPolyLine(source: CLLocationCoordinate2D, destination: CLLocationCoordinate2D)
        path?.add(source)
        path?.add(destination)
        let polyLine = GMSPolyline(path: path)
        polyLine.strokeWidth = 4 // width of your choice
        polyLine.strokeColor = .red // color of your choice 
        polyLine.map = googleMapView
    
然后查看 MapBoxDirections.Route 模型并探索它的属性,您会发现其中非常有用的信息

然后利用 GMS 代表的回调函数通知您位置更新,而不是使用计时器并每秒调用一次,这是更有效的方式

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) 
        /* do your business here */
    
不要忘记让位置经理代表自己或您选择的班级

【讨论】:

【参考方案2】:

也许这会有所帮助:您可以轻松添加观察者来更改路线进度:

NotificationCenter.default.addObserver(self,
                                       selector: #selector(progressDidChange(notification:)),
                                       name: .routeControllerProgressDidChange,
                                       object: navigationService.router)

你需要一个导航服务来创建你的路线,就像

let navigationService = MapboxNavigationService(route: route)

progressDidChange 函数可以执行以下操作:

@objc func progressDidChange(notification: NSNotification) 
    guard let routeProgress = notification.userInfo?[RouteControllerNotificationUserInfoKey.routeProgressKey] as? RouteProgress,
        let location = notification.userInfo?[RouteControllerNotificationUserInfoKey.locationKey] as? CLLocation else 
        return
    

    // you have all information you probably need in routeProgress, f.E.
    let secondsRemaining = routeProgress.currentLegProgress.currentStepProgress.durationRemaining

    ...

【讨论】:

谢谢,但问题是没有调用 RouteProgress 方法

以上是关于iOS 中的 Mapbox 导航和我的 mapView 控制器的主要内容,如果未能解决你的问题,请参考以下文章

地图框中的离线轮流导航

室内导航(也许是 MapBox?)

在 Mapbox 的导航视图上添加自定义按钮

如何在 react-native 中的 mapbox 地图上绘制导航线?

mapbox 添加导航依赖

Google Maps SDK iOS - 根据缩放级别计算半径