我有这些方法可以在MKMapView之间添加路由CLLocation。我都有有效的pickUpDistanceLocation和dropOffDistanceLocation
CLLocation
func addRoutesOverLayForMapView(){ var source:MKMapItem? var destination:MKMapItem? println("\(pickUpDistanceLocation)") println("\(dropOffDistanceLocation)") //i also tested with these locations //let sourcelocation = CLLocation(latitude: 40.7141667, longitude: -74.0063889) //let destinationLocation = CLLocation(latitude: 38.89, longitude: 77.03) CLGeocoder().reverseGeocodeLocation(pickUpDistanceLocation, completionHandler: {(placemarks,error)-> Void in if (error != nil) { println("Reverse geocoder failed with error" + error.localizedDescription) return } if placemarks.count > 0 { if let placemark: MKPlacemark = placemarks![0] as? MKPlacemark { source = MKMapItem(placemark: placemark) println("\(source)") } } else { println("Problem with the data received from geocoder") } }) CLGeocoder().reverseGeocodeLocation(dropOffDistanceLocation, completionHandler: {(placemarks,error)-> Void in if (error != nil) { println("Reverse geocoder failed with error" + error.localizedDescription) return } if placemarks.count > 0 { if let placemark: MKPlacemark = placemarks![0] as? MKPlacemark { destination = MKMapItem(placemark: placemark) println("\(destination)") } } else { println("Problem with the data received from geocoder") } }) let request:MKDirectionsRequest = MKDirectionsRequest() request.setSource(source) request.setDestination(destination) request.transportType = MKDirectionsTransportType.Automobile request.requestsAlternateRoutes = false let directions = MKDirections(request: request) directions.calculateDirectionsWithCompletionHandler ({ (response: MKDirectionsResponse?, error: NSError?) in if error == nil { self.showRoute(response!) } }) }
这是在地图中添加路线叠加层的方法
func showRoute(response:MKDirectionsResponse){ for route in response.routes as! [MKRoute]{ mapView.addOverlay(route.polyline, level: MKOverlayLevel.AboveRoads) } }
我收到此错误,因为响应返回错误:400
打印错误时显示为
可选(“操作无法完成。(NSURLErrorDomain错误-1011。)”)
实际上,源变量和目标变量都为nil。因此,我从server。如果收到错误响应,请尝试以下代码
func addRoutesOverLayForMapView(){ var source:MKMapItem? var destination:MKMapItem? var sourcePlacemark = MKPlacemark(coordinate: pickUpDistanceLocation!.coordinate, addressDictionary: nil) source = MKMapItem(placemark: sourcePlacemark) var desitnationPlacemark = MKPlacemark(coordinate: dropOffDistanceLocation!.coordinate, addressDictionary: nil) destination = MKMapItem(placemark: desitnationPlacemark) let request:MKDirectionsRequest = MKDirectionsRequest() request.setSource(source) request.setDestination(destination) request.transportType = MKDirectionsTransportType.Walking let directions = MKDirections(request: request) directions.calculateDirectionsWithCompletionHandler ({ (response: MKDirectionsResponse?, error: NSError?) in if error == nil { self.showRoute(response!) } else{ println("trace the error \(error?.localizedDescription)") } }) } func showRoute(response:MKDirectionsResponse){ for route in response.routes as! [MKRoute]{ mapView.addOverlay(route.polyline, level: MKOverlayLevel.AboveRoads) var routeSeconds = route.expectedTravelTime let routeDistance = route.distance println("distance between two points is \(routeSeconds) and \(routeDistance)") } }
而且您应该实现此委托方法,不要忘记设置mapview委托
func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! { if overlay is MKPolyline { var polylineRenderer = MKPolylineRenderer(overlay: overlay) polylineRenderer.lineDashPattern = [14,10,6,10,4,10] polylineRenderer.strokeColor = UIColor(red: 0.012, green: 0.012, blue: 0.012, alpha: 1.00) polylineRenderer.lineWidth = 2.5 return polylineRenderer } return nil }