2015-03-28 3 views
11

Как я могу нарисовать маршрут между текущим местоположением пользователя до определенного места с помощью MapKit в Swift?Как нарисовать маршрут между двумя точками, используя MapKit в Swift?

Я много искал, но не нашел полезных ссылок или учебных пособий по Swift.

+0

Поиск MKDirectionsRequest, addOverlay и rendererForOverlay. Есть примеры Swift для SO каждого из них. – Anna

+0

благодарит за вашу помощь. Но на самом деле я не нашел ценного результата для Swift. У вас есть какой-либо результат или пример, который я могу начать с него? – Rawan

+0

Используйте Google для поиска SO - ответы здесь. В противном случае просмотрите документацию для этих классов и методов, напишите код, попробуйте что-нибудь. – Anna

ответ

4

Я просто ссылку на учебник, который показывает, как сделать это в Swift:

Ray Wenderlich: Overlays in MapKit

Это должно охватывать то, что вам нужно.

9
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 
} 

Возвращение представляет собой массив возможных маршрутов, как правило, мы просто хотим показать первое. Аннотации - аннотации карт.

+0

С Swift 2 вы не можете вернуть ** nil ** в ** rendererForOverlay **. Верните ** MKPolylineRenderer() ** вместо этого. –

1

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 
} 

the image show the How to draw a route between two locations using MapKit in Swift?

Смежные вопросы