用mapkit绘制折线Swift 3

Draw polyline with mapkit Swift 3

我想绘制一条从当前用户位置到注释点的折线,但它似乎没有绘制任何东西:

@IBAction func myButtonGo(_ sender: Any) {
    showRouteOnMap()
}

func showRouteOnMap() {
    let request = MKDirectionsRequest()

    request.source = MKMapItem(placemark: MKPlacemark(coordinate: CLLocationCoordinate2D.init(), addressDictionary: nil))
    request.destination = MKMapItem(placemark: MKPlacemark(coordinate: (annotationCoordinatePin?.coordinate)!, addressDictionary: nil))
    request.requestsAlternateRoutes = true
    request.transportType = .automobile

    let directions = MKDirections(request: request)

    directions.calculate { [unowned self] response, error in guard let unwrappedResponse = response else { return }

        if (unwrappedResponse.routes.count > 0) {
            self.mapView.add(unwrappedResponse.routes[0].polyline)
            self.mapView.setVisibleMapRect(unwrappedResponse.routes[0].polyline.boundingMapRect, animated: true)
        }
    }
}

func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
    let renderer = MKPolylineRenderer(polyline: overlay as! MKPolyline)
    renderer.strokeColor = UIColor.black
    return renderer
}

我尝试在调试模式下 运行,它在以下行的断点处停止:

directions.calculate { [unowned self] response, error in guard let unwrappedResponse = response else { return }

这个错误的原因是什么?

如果它停在那里,请确保那里没有断点:

左边的深蓝色指示器表示那里有一个断点。如果您有断点,只需单击它以禁用它(将其更改为浅蓝色)或将其拖出以将其删除。

如果这不是问题所在(即它真的崩溃了),那么我们需要知道它是哪种崩溃,控制台中显示了什么,等等。

如果它没有崩溃,只是没有绘制路线,请确保您已指定地图视图的 delegate(在 viewDidLoad 中或在 IB 中)。


话虽如此,但还有一些其他观察结果:

  1. 您的起始坐标是CLLocationCoordinate2D()(即纬度和经度0、0,即在太平洋)。这不会导致它崩溃,但是如果您检查 error 对象,它的本地化描述会说:

    Directions Not Available

    您应该将 coordinate 更正为 source

  2. 您应该警惕使用异步方法的 unowned self,因为返回方向时 self 总是有可能被释放,它会崩溃。使用 [weak self] 更安全。

因此:

let request = MKDirectionsRequest()
request.source = MKMapItem(placemark: MKPlacemark(coordinate: sourceCoordinate))
request.destination = MKMapItem(placemark: MKPlacemark(coordinate: destinationCoordinate))
request.requestsAlternateRoutes = true
request.transportType = .automobile

let directions = MKDirections(request: request)
directions.calculate { [weak self] response, error in
    guard let response = response, error == nil, let route = response.routes.first else {
        print(error?.localizedDescription ?? "Unknown error")
        return
    }

    self?.mapView.add(route.polyline)
}