ios - 平滑 MKPolyline 跟随道路

标签 ios xcode swift mapkit mkpolyline

我知道几年前有人问过这个问题,但所有答案都涉及使用 Google Maps API 来解决这个问题。我想知道现在 iOS8 已经出来并且它为原生 MapKit 带来了许多改进,是否有适当的方法来解决这个问题。

基本上我在路上画了一条折线,它由许多中间点组成。

    var locations = [CLLocation]()
    for item in list {
        locations.append(CLLocation(latitude: CLLocationDegrees(item["location"]["coordinate"]["x"].doubleValue), longitude: CLLocationDegrees(item["location"]["coordinate"]["y"].doubleValue)))
    }
    var coordinates = locations.map({(location: CLLocation!) -> CLLocationCoordinate2D in return location.coordinate})
    var polyline = MKPolyline(coordinates: &coordinates, count: locations.count)
    mapView.addOverlay(polyline)

map 上一次有 5 到 30 个点。当折线连接它们时,我或多或少地得到了这次旅行的公平代表。问题是:它不粘在路上。

enter image description here

所以我时不时会遇到一些“粗糙”的问题。即使我使用的是 Google Direction API,它也仅限于 8 个方向点,基本上可以为您决定如何从 A 点到达 B 点,沿途绘制平滑的多段线。此外,Directions API 限制为每 24 小时 2500 次使用。我需要做的就是将我当前的多段线调整到最近的道路

非常感谢

最佳答案

经过一番挖掘,我设法找到了这个问题的答案,尽管我不太确定它对整体性能的影响是否会让 Apple 满意,因为它发出了很多小的 MKDirectionsRequest 的。对我来说,30+ 分就很好了。

    var myRoute : MKRoute?
    var directionsRequest = MKDirectionsRequest()
    var placemarks = [MKMapItem]()
    for item in list {
        var placemark = MKPlacemark(coordinate: CLLocationCoordinate2D(latitude: CLLocationDegrees(item["location"]["coordinate"]["x"].doubleValue), longitude: CLLocationDegrees(item["location"]["coordinate"]["y"].doubleValue)), addressDictionary: nil )
        placemarks.append(MKMapItem(placemark: placemark))
    }
    directionsRequest.transportType = MKDirectionsTransportType.Automobile
    for (k, item) in enumerate(placemarks) {
        if k < (placemarks.count - 1) {
            directionsRequest.setSource(item)
            directionsRequest.setDestination(placemarks[k+1])
            var directions = MKDirections(request: directionsRequest)
            directions.calculateDirectionsWithCompletionHandler { (response:MKDirectionsResponse!, error: NSError!) -> Void in
                if error == nil {
                    self.myRoute = response.routes[0] as? MKRoute
                    self.mapView.addOverlay(self.myRoute?.polyline)
                }
            }
        }
    }

特别感谢 Anna为我指明了正确的方向。

enter image description here

关于ios - 平滑 MKPolyline 跟随道路,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29935504/

相关文章:

ios - 一种在iOS 11中实现类似Photos app的UISearchController外观的方法

xcode - FMDatabase/SQLite3 使用的 "Too many files open"问题

objective-c - 您可以将 FBSnapshottestcase 库与 Swift 一起使用吗?

ios - 在 Xcode : unknown option character `X' in: -Xlinker 中获取 CocoaPods 错误

ios - 无法在浏览器中访问 Google Plus API

ios - 为什么lldb的po命令不能在dot中打印superview?

cocoa - 如何使用 cocoa 和界面生成器创建单窗口应用程序?

ios - 如何即时更改自定义 UIButton 的图像

ios - 删除以 开头的键的 NSUserDefaults

ios - Swift - 根据多个条件搜索大数组