用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 中)。
话虽如此,但还有一些其他观察结果:
您的起始坐标是CLLocationCoordinate2D()
(即纬度和经度0、0,即在太平洋)。这不会导致它崩溃,但是如果您检查 error
对象,它的本地化描述会说:
Directions Not Available
您应该将 coordinate
更正为 source
。
您应该警惕使用异步方法的 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)
}
我想绘制一条从当前用户位置到注释点的折线,但它似乎没有绘制任何东西:
@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 中)。
话虽如此,但还有一些其他观察结果:
您的起始坐标是
CLLocationCoordinate2D()
(即纬度和经度0、0,即在太平洋)。这不会导致它崩溃,但是如果您检查error
对象,它的本地化描述会说:Directions Not Available
您应该将
coordinate
更正为source
。您应该警惕使用异步方法的
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)
}