在mapView中为CLLocation(Swift)数组绘制路径

时间:2016-07-30 13:09:52

标签: swift routes cllocation polyline

如何在mapview中为CLLocation数组创建路径? 我创建一条折线,我想通过步行创建一条路线。 这是我的代码:

@IBAction func addPolyline(sender: AnyObject) {
    let locations = [CLLocation(latitude: annotazioni.objectAtIndex(0).coordinate.latitude, longitude:annotazioni.objectAtIndex(0).coordinate.longitude ),
                     CLLocation(latitude: annotazioni.objectAtIndex(1).coordinate.latitude, longitude:annotazioni.objectAtIndex(1).coordinate.longitude ),
                     CLLocation(latitude: annotazioni.objectAtIndex(2).coordinate.latitude, longitude:annotazioni.objectAtIndex(2).coordinate.longitude ),
                     CLLocation(latitude: annotazioni.objectAtIndex(3).coordinate.latitude, longitude:annotazioni.objectAtIndex(3).coordinate.longitude ),
                     CLLocation(latitude: annotazioni.objectAtIndex(4).coordinate.latitude, longitude:annotazioni.objectAtIndex(4).coordinate.longitude ),
                     CLLocation(latitude: annotazioni.objectAtIndex(5).coordinate.latitude, longitude:annotazioni.objectAtIndex(5).coordinate.longitude ),
                     CLLocation(latitude: annotazioni.objectAtIndex(6).coordinate.latitude, longitude:annotazioni.objectAtIndex(6).coordinate.longitude )]
    addPolyLineToMap(locations)
}
func addPolyLineToMap(locations: [CLLocation!]){
    var coordinates = locations.map({ (location: CLLocation!) -> CLLocationCoordinate2D in
        return location.coordinate
    })
    let geodesic = MKGeodesicPolyline(coordinates: &coordinates, count: locations.count)
    mapView.addOverlay(geodesic)

}
func mapView(mapView: MKMapView!, viewForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! {

    if (overlay is MKPolyline) {
        let pr = MKPolylineRenderer(overlay: overlay);
        pr.strokeColor = UIColor.blueColor().colorWithAlphaComponent(0.5);
        pr.lineWidth = 5;
        return pr;
    }

    return nil
}

抱歉我的英文不好:D

2 个答案:

答案 0 :(得分:3)

您可以使用MKDirectRequestMKDirections在每个连续的位置对之间询问方向,将路线作为折线,然后在地图上绘制。

iOS 8及更高版本中提供了

MKDirection.routes。以下是在纽约市中心散步的示例。你从蓝色针脚穿过所有绿色针脚,然后停在红色针脚处。

class MyPointAnnotation : MKPointAnnotation {
    var isStartingPoint = false
    var isEndingPoint = false
}

@IBAction func addPolyline(sender : AnyObject) {
    let locations = [
        CLLocation(latitude: 40.759011, longitude: -73.984472), // Times Square, Manhattan, NY 10036, United States
        CLLocation(latitude: 40.760920, longitude: -73.988665), // Palace Theater, 1564 7th Avenue & W 47th Street, New York, NY 10036, United States
        CLLocation(latitude: 40.761417, longitude: -73.977120), // The Museum of Modern Art, 11 West 53rd Street, New York, NY 10019, United States
        CLLocation(latitude: 40.756520, longitude: -73.973406), // Waldorf Astoria New York, 301 Park Avenue, New York, NY 10022, United States
        CLLocation(latitude: 40.748441, longitude: -73.985664), // Empire State Building, 350 5th Avenue, New York, NY 10118, USA
        CLLocation(latitude: 40.756359, longitude: -73.988873) // Madame Tussauds New York, 234 West 42nd Street, New York, NY 10036, United States
    ]

    self.mapView.region = MKCoordinateRegion(center: locations[0].coordinate, span: MKCoordinateSpan(latitudeDelta: 0.1, longitudeDelta: 0.1))

    // Pins for the locations you want to visit
    for loc in locations.enumerate() {
        let point = MyPointAnnotation()
        point.coordinate = loc.element.coordinate
        point.title = "Point \(loc.index)"

        if loc.index == 0 {
            point.subtitle = "Starting point"
            point.isStartingPoint = true
        } else if loc.index == locations.count - 1 {
            point.subtitle = "Ending point"
            point.isEndingPoint = true
        }

        self.mapView.addAnnotation(point)
    }

    // Request directions from one point to the next
    dispatch_apply(locations.count - 1, dispatch_get_global_queue(QOS_CLASS_UTILITY, 0)) { i in
        let sourcePlacemark      = MKPlacemark(coordinate: locations[i].coordinate, addressDictionary: nil)
        let destinationPlacemark = MKPlacemark(coordinate: locations[i+1].coordinate, addressDictionary: nil)

        let request = MKDirectionsRequest()
        request.source = MKMapItem(placemark: sourcePlacemark)
        request.destination = MKMapItem(placemark: destinationPlacemark)
        request.transportType = .Walking

        let directions = MKDirections(request: request)
        directions.calculateDirectionsWithCompletionHandler { response, error in
            guard error == nil else {
                print(error!)
                return
            }

            // Get the walking route as a polyline
            let polyline = response!.routes.first!.polyline
            self.mapView.addOverlay(polyline)
        }
    }
}

// MARK: -
// MARK: Map View Delegate
func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
    if let point = annotation as? MyPointAnnotation {
        let view = MKPinAnnotationView(annotation: point, reuseIdentifier: "pointAnnotationView")
        view.canShowCallout = true

        // You walk from the blue pin through all the green pins and stop at the red pin
        if point.isStartingPoint {
            view.pinTintColor = UIColor.blueColor()
        } else if point.isEndingPoint {
            view.pinTintColor = UIColor.redColor()
        } else {
            view.pinTintColor = UIColor.greenColor()
        }

        return view
    }

    return nil
}

func mapView(mapView: MKMapView!, viewForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! {
    if (overlay is MKPolyline) {
        let pr = MKPolylineRenderer(overlay: overlay)
        pr.strokeColor = UIColor.blueColor().colorWithAlphaComponent(0.5)
        pr.lineWidth = 5
        return pr
    }

    return nil
}

答案 1 :(得分:0)

对我有用。

let polyline = MKGeodesicPolyline(coordinates: coordinates, count: coordinates.count)
mapView.addOverlay(polyline)
相关问题