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 控制器的主要内容,如果未能解决你的问题,请参考以下文章