BX69
BX69

Reputation: 431

Polyline Overlay in Swift

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)

Upvotes: 0

Views: 5835

Answers (5)

Bharath 402
Bharath 402

Reputation: 1

    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
}

Upvotes: 0

Mehul Patel
Mehul Patel

Reputation: 23053

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
}

Upvotes: 5

Bharath 402
Bharath 402

Reputation: 1

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)

Upvotes: 0

jbg
jbg

Reputation: 1003

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

Upvotes: 1

Mundi
Mundi

Reputation: 80271

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?

Upvotes: 1

Related Questions