Touchable and data driven overlays (polygons) in a MKMapView with data from geoJson

411 Views Asked by At

I am trying to draw overlays with MKOverlay (polygon) on a MKMapView from a given geoJson file.

My code works fine. The polygons are displayed. I use the MKGeoJSONDecoder. I would like to use the user's current location to display data from the current overlay. This data is also in the geoJson file as property. Is that possible?

Is it also possible to make the overlays touchable in order to display the data of the current overlay by touch?

import UIKit
import MapKit

class ViewController: UIViewController, MKMapViewDelegate {

    @IBOutlet weak var mapView: MKMapView!

    override func viewDidLoad() {

        super.viewDidLoad()

        mapView.delegate = self

        if let path = Bundle.main.path(forResource: "directions", ofType: "geojson") {
            do {
                let url = URL(fileURLWithPath: path)
                let data = try Data(contentsOf: url)

                if let features = try? MKGeoJSONDecoder().decode(data) as? [MKGeoJSONFeature] {

                    for feature in features {

                        if let poly = feature.geometry[0] as? MKPolygon {
                            mapView.addOverlay(poly)
                        }

                        if let multiPoly = feature.geometry[0] as? MKMultiPolygon {
                            mapView.addOverlay(multiPoly)
                        }
                    }
                }
            } catch {
                // print errors
            }
        }
    }

    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {

        switch overlay {
        case is MKPolygon:
            let renderer = MKPolygonRenderer(polygon: overlay as! MKPolygon)
            renderer.fillColor = UIColor.blue.withAlphaComponent(0.25)
            renderer.strokeColor = UIColor.blue
            renderer.lineWidth = 1
            return renderer
        case is MKMultiPolygon:
            let renderer = MKMultiPolygonRenderer(multiPolygon: overlay as! MKMultiPolygon)
            renderer.fillColor = UIColor.blue.withAlphaComponent(0.25)
            renderer.strokeColor = UIColor.blue
            renderer.lineWidth = 1
            return renderer
        default:
            return MKOverlayRenderer()
        }
    }
}
0

There are 0 best solutions below