2015-05-12 2 views
0

Я хочу добавить путь наложения между несколькими координатами в mapview. Я пробовал как ниже код, но он показывает ошибку «не может вызывать« карту »с помощью списка аргументов типа ((CLLocation) -> CLLocationCoordinate2D)». Пожалуйста, дайте мне знать, как я могу это исправить?Как добавить путь наложения в MKMapView swift

Мой ViewController.swift файл

import UIKit 
import MapKit 

class ViewController: UIViewController, MKMapViewDelegate{ 
    @IBOutlet weak var mapView: MKMapView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     //For Location 1 
     let location1 = CLLocationCoordinate2D(
      latitude: 51.481188400000010000, 
      longitude: -0.190209099999947280 
     ) 

     let annotation1 = MKPointAnnotation() 
     annotation1.coordinate = location1; 
     annotation1.title = "Chelsea" 
     annotation1.subtitle = "Chelsea" 

     let span = MKCoordinateSpanMake(0.15, 0.15) 

     let region1 = MKCoordinateRegion(center: location1, span: span) 
     mapView.setRegion(region1, animated: true) 
     mapView.addAnnotation(annotation1) 

     //For Location 2 
     let location2 = CLLocationCoordinate2D(
      latitude: 51.554947700000010000, 
      longitude: -0.108558899999934510 
     ) 

     let annotation2 = MKPointAnnotation() 
     annotation2.coordinate = location2; 
     annotation2.title = "Arsenal" 
     annotation2.subtitle = "Arsenal" 

     let region2 = MKCoordinateRegion(center: location1, span: span) 
     mapView.setRegion(region2, animated: true) 
     mapView.addAnnotation(annotation2) 

     var locations = [CLLocation(latitude: 51.481188400000010000, longitude: -0.190209099999947280), CLLocation(latitude: 51.554947700000010000,longitude: -0.108558899999934510)] 

     //This line shows error 
     var coordinates = locations.map({(location: CLLocation) -> CLLocationCoordinate2D in return location.coordinate}) 

     var polyline = MKPolyline(coordinates: &coordinates, count: locations.count) 

     mapView.addOverlay(polyline) 
    } 

    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 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 
} 
+1

Ответ полезен, но обратите внимание, что вам даже не нужно сначала создать массив CLLocations, а затем сопоставить их с массивом CLLocationCoordinate2Ds. Вы можете создать массив CLLocationCoordinate2Ds напрямую: 'var coord = = [location1, location2]'. Также не нужно повторять значения координат - используйте переменные, которые уже имеют значения (location1, location2). – Anna

+0

Незначительная деталь стороны: region2 центр использует location1 вместо location2. Однако вам не нужно делать setRegion для добавления аннотации в месте. Здесь на дисплей влияет только второй вызов setRegion. – Anna

ответ

2

Это должно работать:

var coordinates = locations.map { 
    location in 
    return location.coordinate 
} 

Однострочник:

var coordinates = locations.map { $0.coordinate } 

Проблема с кодом, что locations является переменной тип [CLLocation!] (обратите внимание на восклицательный знак здесь), но вы объявляете его Менты как CLLocation (без!) в замыкании:

(location: CLLocation) -> CLLocationCoordinate2D