Is there a way to take a screenshot of mapView and include the polyline? I believe I need to draw CGPoint's on the image that the MKSnapShotter returns, but I am unsure on how to do so.
Current code
      func takeSnapshot(mapView: MKMapView, withCallback: (UIImage?, NSError?) -> ()) {
    let options = MKMapSnapshotOptions()
    options.region = mapView.region
    options.size = mapView.frame.size
    options.scale = UIScreen.main().scale
    let snapshotter = MKMapSnapshotter(options: options)
    snapshotter.start() { snapshot, error in
        guard snapshot != nil else {
            withCallback(nil, error)
            return
        }
        if let image = snapshot?.image{
            withCallback(image, nil)
            for coordinate in self.area {
                image.draw(at:snapshot!.point(for: coordinate))
            }
        }
    }
}
I had the same problem today. After several hours of research, here is how I solve it.
The following codes are in Swift 3.
// initial this array with your polyline coordinates
var yourCoordinates = [CLLocationCoordinate2D]() 
yourCoorinates.append( coordinate 1 )
yourCoorinates.append( coordinate 2 )
...
// you can use any data structure you like
func takeSnapShot() {
    let mapSnapshotOptions = MKMapSnapshotOptions()
    // Set the region of the map that is rendered. (by polyline)
    let polyLine = MKPolyline(coordinates: &yourCoordinates, count: yourCoordinates.count)
    let region = MKCoordinateRegionForMapRect(polyLine.boundingMapRect)
    mapSnapshotOptions.region = region
    // Set the scale of the image. We'll just use the scale of the current device, which is 2x scale on Retina screens.
    mapSnapshotOptions.scale = UIScreen.main.scale
    // Set the size of the image output.
    mapSnapshotOptions.size = CGSize(width: IMAGE_VIEW_WIDTH, height: IMAGE_VIEW_HEIGHT)
    // Show buildings and Points of Interest on the snapshot
    mapSnapshotOptions.showsBuildings = true
    mapSnapshotOptions.showsPointsOfInterest = true
    let snapShotter = MKMapSnapshotter(options: mapSnapshotOptions)
    snapShotter.start() { snapshot, error in
        guard let snapshot = snapshot else {
            return
        }
        // Don't just pass snapshot.image, pass snapshot itself!
        self.imageView.image = self.drawLineOnImage(snapshot: snapshot)
    }
}
func drawLineOnImage(snapshot: MKMapSnapshot) -> UIImage {
    let image = snapshot.image
    // for Retina screen
    UIGraphicsBeginImageContextWithOptions(self.imageView.frame.size, true, 0)
    // draw original image into the context
    image.draw(at: CGPoint.zero)
    // get the context for CoreGraphics
    let context = UIGraphicsGetCurrentContext()
    // set stroking width and color of the context
    context!.setLineWidth(2.0)
    context!.setStrokeColor(UIColor.orange.cgColor)
    // Here is the trick :
    // We use addLine() and move() to draw the line, this should be easy to understand.
    // The diificult part is that they both take CGPoint as parameters, and it would be way too complex for us to calculate by ourselves
    // Thus we use snapshot.point() to save the pain.
    context!.move(to: snapshot.point(for: yourCoordinates[0]))
    for i in 0...yourCoordinates.count-1 {
      context!.addLine(to: snapshot.point(for: yourCoordinates[i]))
      context!.move(to: snapshot.point(for: yourCoordinates[i]))
    }
    // apply the stroke to the context
    context!.strokePath()
    // get the image from the graphics context
    let resultImage = UIGraphicsGetImageFromCurrentImageContext()
    // end the graphics context 
    UIGraphicsEndImageContext()
    return resultImage!
}
That's it, hope this helps someone.
How do I draw on an image in Swift?
MKTileOverlay,MKMapSnapshotter & MKDirections
Creating an MKMapSnapshotter with an MKPolylineRenderer
Render a Map as an Image using MapKit
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With