Does the route not appear in MKMapView?

I have this method that adds routes for MKMapView between two CLLocation . I have both a valid pickUpDistanceLocation and dropOffDistanceLocation function

  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!) } }) } 

This is a method that adds route overlay to a map.

  func showRoute(response:MKDirectionsResponse){ for route in response.routes as! [MKRoute]{ mapView.addOverlay(route.polyline, level: MKOverlayLevel.AboveRoads) } } 

I get this error as the response returned an error: 400

If printing fails, it appears as

Optional ("The operation could not be completed. (NSURLErrorDomain error -1011.)")

0
source share
2 answers

In fact, both the source and destination variables were nil .. So I got a bad reaction from the server. If you just need to try the code below

 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)") } } 

And you have to implement this delegate method, don't forget to set the mapview delegate

  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 } 
+4
source

For Swift 2.1:

 func addRoutesOverLayForMapView(){ var source:MKMapItem? var destination:MKMapItem? let Scoordinate = CLLocationCoordinate2D(latitude: passLat, longitude: passLong) var sourcePlacemark = MKPlacemark(coordinate: CLLocationCoordinate2D(latitude: passLat, longitude: passLong), addressDictionary: nil) source = MKMapItem(placemark: sourcePlacemark) let DCoordinate = CLLocationCoordinate2D(latitude: lati, longitude: longi) var desitnationPlacemark = MKPlacemark(coordinate: DCoordinate, addressDictionary: nil) destination = MKMapItem(placemark: desitnationPlacemark) let request:MKDirectionsRequest = MKDirectionsRequest() request.source = source request.destination = destination request.transportType = MKDirectionsTransportType.Walking let directions = MKDirections(request: request) directions.calculateDirectionsWithCompletionHandler ({ (response: MKDirectionsResponse?, error: NSError?) in if error == nil { self.showRoute(response!) } else{ print("some error") } }) } func showRoute(response:MKDirectionsResponse){ for route in response.routes { mapView.addOverlay(route.polyline, level: MKOverlayLevel.AboveRoads) let routeSeconds = route.expectedTravelTime let routeDistance = route.distance print("distance between two points is \(routeSeconds) and \(routeDistance)") } } func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer { let polylineRenderer = MKPolylineRenderer(overlay: overlay) if overlay is MKPolyline { 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 polylineRenderer } 
+2
source

Source: https://habr.com/ru/post/1214183/


All Articles