Ios 如何使用Swift中的MapKit在两个位置之间绘制路线?
如何使用Swift中的MapKit在用户当前位置到特定位置之间绘制路径 我搜索了很多,但没有找到任何有用的Swift特定链接或教程Ios 如何使用Swift中的MapKit在两个位置之间绘制路线?,ios,iphone,swift,mapkit,Ios,Iphone,Swift,Mapkit,如何使用Swift中的MapKit在用户当前位置到特定位置之间绘制路径 我搜索了很多,但没有找到任何有用的Swift特定链接或教程 class MapController: UIViewController, MKMapViewDelegate { func showRouteOnMap() { let request = MKDirectionsRequest() request.source = MKMapItem(placemark: MKPlacemark(coordi
class MapController: UIViewController, MKMapViewDelegate {
func showRouteOnMap() {
let request = MKDirectionsRequest()
request.source = MKMapItem(placemark: MKPlacemark(coordinate: annotation1.coordinate, addressDictionary: nil))
request.destination = MKMapItem(placemark: MKPlacemark(coordinate: annotation2.coordinate, addressDictionary: nil))
request.requestsAlternateRoutes = true
request.transportType = .Automobile
let directions = MKDirections(request: request)
directions.calculateDirectionsWithCompletionHandler { [unowned self] response, error in
guard let unwrappedResponse = response else { return }
if (unwrappedResponse.routes.count > 0) {
self.mapView.addOverlay(unwrappedResponse.routes[0].polyline)
self.mapView.setVisibleMapRect(unwrappedResponse.routes[0].polyline.boundingMapRect, animated: true)
}
}
}
func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! {
if overlay is MKPolyline {
var polylineRenderer = MKPolylineRenderer(overlay: overlay)
polylineRenderer.strokeColor = UIColor.blueColor()
polylineRenderer.lineWidth = 5
return polylineRenderer
}
return nil
}
返回是一组可能的路线,通常我们只想显示第一条路线。注释是地图注释。Swift 4
class MapController: UIViewController, MKMapViewDelegate {
// MARK: - showRouteOnMap
func showRouteOnMap(pickupCoordinate: CLLocationCoordinate2D, destinationCoordinate: CLLocationCoordinate2D) {
let sourcePlacemark = MKPlacemark(coordinate: pickupCoordinate, addressDictionary: nil)
let destinationPlacemark = MKPlacemark(coordinate: destinationCoordinate, addressDictionary: nil)
let sourceMapItem = MKMapItem(placemark: sourcePlacemark)
let destinationMapItem = MKMapItem(placemark: destinationPlacemark)
let sourceAnnotation = MKPointAnnotation()
if let location = sourcePlacemark.location {
sourceAnnotation.coordinate = location.coordinate
}
let destinationAnnotation = MKPointAnnotation()
if let location = destinationPlacemark.location {
destinationAnnotation.coordinate = location.coordinate
}
self.mapView.showAnnotations([sourceAnnotation,destinationAnnotation], animated: true )
let directionRequest = MKDirectionsRequest()
directionRequest.source = sourceMapItem
directionRequest.destination = destinationMapItem
directionRequest.transportType = .automobile
// Calculate the direction
let directions = MKDirections(request: directionRequest)
directions.calculate {
(response, error) -> Void in
guard let response = response else {
if let error = error {
print("Error: \(error)")
}
return
}
let route = response.routes[0]
self.mapView.add((route.polyline), level: MKOverlayLevel.aboveRoads)
let rect = route.polyline.boundingMapRect
self.mapView.setRegion(MKCoordinateRegionForMapRect(rect), animated: true)
}
}
// MARK: - MKMapViewDelegate
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
let renderer = MKPolylineRenderer(overlay: overlay)
renderer.strokeColor = UIColor(red: 17.0/255.0, green: 147.0/255.0, blue: 255.0/255.0, alpha: 1)
renderer.lineWidth = 5.0
return renderer
}
基于bdelrahman Mohamed回答的Swift 5+扩展
extension MKMapView {
func showRouteOnMap(pickupCoordinate: CLLocationCoordinate2D, destinationCoordinate: CLLocationCoordinate2D) {
let sourcePlacemark = MKPlacemark(coordinate: pickupCoordinate, addressDictionary: nil)
let destinationPlacemark = MKPlacemark(coordinate: destinationCoordinate, addressDictionary: nil)
let sourceMapItem = MKMapItem(placemark: sourcePlacemark)
let destinationMapItem = MKMapItem(placemark: destinationPlacemark)
let sourceAnnotation = MKPointAnnotation()
if let location = sourcePlacemark.location {
sourceAnnotation.coordinate = location.coordinate
}
let destinationAnnotation = MKPointAnnotation()
if let location = destinationPlacemark.location {
destinationAnnotation.coordinate = location.coordinate
}
self.showAnnotations([sourceAnnotation,destinationAnnotation], animated: true )
let directionRequest = MKDirections.Request()
directionRequest.source = sourceMapItem
directionRequest.destination = destinationMapItem
directionRequest.transportType = .automobile
// Calculate the direction
let directions = MKDirections(request: directionRequest)
directions.calculate {
(response, error) -> Void in
guard let response = response else {
if let error = error {
print("Error: \(error)")
}
return
}
let route = response.routes[0]
self.addOverlay((route.polyline), level: MKOverlayLevel.aboveRoads)
let rect = route.polyline.boundingMapRect
self.setRegion(MKCoordinateRegion(rect), animated: true)
}
}}
重写func viewDidLoad(){
super.viewDidLoad()
搜索MKDirectionsRequest、addOverlay和rendererForOverlay。每个都有Swift示例。谢谢你的帮助。但我真的没有找到任何有价值的Swift结果。你有什么结果或示例可以让我从中开始吗?使用谷歌搜索-答案在这里。否则,请查看这些类的文档并方法,编写一些代码,尝试一些方法。签出这一个我将链接到一个教程,演示如何在Swift中实现这一点:这应该包括您需要的内容。由于Swift 2,您不能在RenderForOverlay中返回nil。返回MKPolylineRenderer()相反。嘿,我使用的是相同的代码,但它不会用蓝线绘制路径。请不要忘记使用此函数//MARK:-MKMapViewDelegate func-mapView(umapview:MKMapView,renderer for overlay:MKOverlay)->mkoverlayrender{let renderer=MKPolylineRenderer(overlay:overlay)renderer.strokeColor=UIColor(红色:17.0/255.0,绿色:147.0/255.0,蓝色:255.0/255.0,alpha:1)renderer.lineWidth=5.0 return renderer}必须使用MKMapViewDelegate,并与func mapView(mapView:MKMapView,renderer for overlay:MKOverlay)->mkoverlayrender一起使用,才能找到renderer.strokeColor=UIColor(红色:17.0/255.0,绿色:147.0/255.0,蓝色:255.0/255.0,alpha:1)并使renderer.lineWidth=5.0可见如果有人遵循@AbdelrahmanMohamed的步骤,但路线没有出现,可能需要添加mapView.delegate=self。顺便问一下,为什么这个答案还没有被标记为解决方案?@PoojaGupta我相信你可以缩小缩放范围
mapView.delegate = self
let sourceLocation = CLLocationCoordinate2D(latitude: 22.4649, longitude: 69.0702)
let destinationLocation = CLLocationCoordinate2D(latitude: 23.0225, longitude: 72.5714)
let span = MKCoordinateSpan(latitudeDelta: 0.1, longitudeDelta: 0.1)
let sourceRegion = MKCoordinateRegion(center: sourceLocation, span: span)
mapView.setRegion(sourceRegion, animated: true)
let destinationRegion = MKCoordinateRegion(center: destinationLocation, span: span)
mapView.setRegion(destinationRegion, animated: true)
let sourcePin = MKPointAnnotation()
sourcePin.coordinate = sourceLocation
mapView.addAnnotation(sourcePin)
let destinationPin = MKPointAnnotation()
destinationPin.coordinate = destinationLocation
mapView.addAnnotation(destinationPin)
let sourcePlacemark = MKPlacemark(coordinate: sourceLocation, addressDictionary: nil)
let destinationPlacemark = MKPlacemark(coordinate: destinationLocation, addressDictionary: nil)
let directionRequest = MKDirections.Request()
directionRequest.source = MKMapItem(placemark: sourcePlacemark)
directionRequest.destination = MKMapItem(placemark: destinationPlacemark)
directionRequest.transportType = .automobile
let directions = MKDirections(request: directionRequest)
directions.calculate { (response, error) in
guard let response = response else {
if let error = error {
print("Error: \(error)")
}
return
}
let route = response.routes[0]
self.mapView.addOverlay((route.polyline), level: MKOverlayLevel.aboveRoads)
let rect = route.polyline.boundingMapRect
self.mapView.setRegion(MKCoordinateRegion(rect), animated: true)
}
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
let renderer = MKPolylineRenderer(overlay: overlay)
renderer.strokeColor = UIColor.red
renderer.lineWidth = 4.0
return renderer
}