Polyline Overlay in Swift

5.8k Views Asked by At

I have my MKMapViewDelegate in place. Also, MapView.delegate = self

let c1 = myCLLocationCoodinate
let c2 = myCLLocationCoodinate2
var a = [c1, c2]
var polyline = MKPolyline(coordinates: &a, count: a.count)
self.MapView.addOverlay(polyline)

With this Delegate Method:

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

    if overlay is MKPolyline {
        var polylineRenderer = MKPolylineRenderer(overlay: overlay)
        polylineRenderer.strokeColor = UIColor.whiteColor()
        polylineRenderer.lineWidth = 2 
        return polylineRenderer
    }
    return nil
}

I get this: EXC BAD ACCESS Thread 8 on

self.MapView.addOverlay(polyline)
5

There are 5 best solutions below

0
Mehul Patel On BEST ANSWER

I think issue here is with the line:

var a = [c1, c2]

Here you directly created array without specifying its type.

See below reference code to create Polyline overlay and related delegate method:

let c1 = myCLLocationCoodinate
let c2 = myCLLocationCoodinate2

var points: [CLLocationCoordinate2D]
points = [c1, c2]

var geodesic = MKGeodesicPolyline(coordinates: &points[0], count: 2)
mapView.add(geodesic)

UIView.animate(withDuration: 1.5, animations: { () -> Void in
    let span = MKCoordinateSpanMake(20, 20)
    let region1 = MKCoordinateRegion(center: c1, span: span)
    mapView.setRegion(region1, animated: true)
})

A delegate method to render overlay:

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

   if overlay is MKPolyline {
       var polylineRenderer = MKPolylineRenderer(overlay: overlay)
       polylineRenderer.strokeColor = UIColor.whiteColor()
       polylineRenderer.lineWidth = 2 
       return polylineRenderer
   } 
   return nil
}
3
Mundi On

It seems that your map view has been deallocated. The polyline construction is OK.

Normally, variables start with lowercase. Have you subclassed the map view and are trying to access the class?

0
jbg On

I spent WAAAAAAAAYYYY too much time on this so I thought I would add the solution to a similar issue. I was getting a EXC BAD ACCESS on addOverlay w/ a MKPolygon. Turns out I was just on the wrong thread the whole time. Fixed it with:

var points = [MKMapPoint]()
for var i = 0; i < area.coordinates.count; i+=2 {
  let c = CLLocationCoordinate2DMake(area.coordinates[i], area.coordinates[i+1])
  points.append(MKMapPointForCoordinate(c))
}
let polygon = MKPolygon(points: &points, count: points.count)
dispatch_async(dispatch_get_main_queue(), {
  self.mapView.addOverlay(polygon)
})
0
Bharath 402 On
let firstlat : string = "12.9166"
let firstlon : string = "77.6101"

let secondlat : string = "12.9610"
let secondLon : string = "77.6387"

    let point1 = CLLocationCoordinate2DMake(Double(firstlat)!, Double(firstlon)!)
    let point2 = CLLocationCoordinate2DMake(Double(secondlat as String)!, Double(secondLon)!)

    let pickAnnotation : MKPointAnnotation = MKPointAnnotation()
    pickAnnotation.coordinate = point1
    pickAnnotation.title = "pick"
    displayMapView.addAnnotation(pickAnnotation)

    let dropAnnotation : MKPointAnnotation = MKPointAnnotation()
    dropAnnotation.coordinate = point2
    dropAnnotation.title = "drop"
    displayMapView.addAnnotation(dropAnnotation)
    displayMapView.showAnnotations(displayMapView.annotations, animated: true)

    var points: [CLLocationCoordinate2D]
    points = [point1, point2]
   routeLine = MKPolyline(coordinates: &points[0] , count: 2)
    displayMapView.add(routeLine)
1
Bharath 402 On
    func showRouteOnMap(_ pickCoordinate: CLLocationCoordinate2D, _ destinationCoordinate: CLLocationCoordinate2D) {

    let request = MKDirections.Request()

    let sourcePlacemark = MKPlacemark(coordinate: pickCoordinate)
    let sourceMapItem = MKMapItem(placemark: sourcePlacemark)

    request.source = sourceMapItem

    let myPlacemark = MKPlacemark(coordinate: destinationCoordinate)
    let destinationMapItem = MKMapItem(placemark: myPlacemark)
    request.destination = destinationMapItem

    request.requestsAlternateRoutes = false

    let directions = MKDirections(request: request)

    directions.calculate(completionHandler: {(response, error) in

        if let error = error {
            print(error.localizedDescription)
        } else {
            if let response = response {
                self.showRoute(response)
            }
        }
    })

}

func showRoute(_ response: MKDirections.Response) {

    for route in response.routes {
        routeMap.addOverlay(route.polyline,
                     level: MKOverlayLevel.aboveRoads)
        self.routeMap.setVisibleMapRect(route.polyline.boundingMapRect, 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
}