Estoy tratando de crear una aplicación que muestre algunas áreas (polígonos/superposiciones) en el mapa y cuando se toca un polígono, me gustaría imprimir en la impresión de la consola ("Se ha tocado el polígono \(zone_id)"). Los polígonos se representan desde un archivo GeoJSON donde también podemos encontrar zone_id en la función de propiedades. Hasta ahora, he renderizado las superposiciones en el mapa, pero estoy atascado y agradezco alguna orientación sobre dónde ir desde aquí.
Pegaré mi código que tengo hasta ahora y también un fragmento del archivo GeoJSON.
import SwiftUI import CoreLocation struct Home: View { @StateObject var mapData = MapViewModel() var body: some View { ZStack{ MapView() .environmentObject(mapData) .ignoresSafeArea(.all, edges: .all) } } } struct Home_Previews: PreviewProvider { static var previews: some View { Home() } } import SwiftUI import MapKit struct MapView: UIViewRepresentable { @EnvironmentObject var mapData: MapViewModel @State var restrictions: [MKOverlay] = [] func makeCoordinator() -> Coordinator { return MapView.Coordinator() } func makeUIView(context: Context) -> MKMapView { let view = mapData.mapView view.showsUserLocation = true view.delegate = context.coordinator mapData.showRestrictedZones { (restrictions) in self.restrictions = restrictions view.addOverlays(self.restrictions) } return view } func updateUIView(_ uiView: MKMapView, context: Context) { } class Coordinator: NSObject, MKMapViewDelegate { func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer { if let polygon = overlay as? MKPolygon { let renderer = MKPolygonRenderer(polygon: polygon) renderer.fillColor = UIColor.purple.withAlphaComponent(0.2) renderer.strokeColor = .purple.withAlphaComponent(0.7) return renderer } return MKOverlayRenderer(overlay: overlay) } } } import SwiftUI import MapKit // All Map Data Goes here... class MapViewModel: NSObject, ObservableObject { @Published var mapView = MKMapView() // Decode GeoJSON from the server func showRestrictedZones(completion: @escaping ([MKOverlay]) -> ()) { guard let url = URL(string: "https://flightplan.romatsa.ro/init/static/zone_restrictionate_uav.json") else { fatalError("Unable to get geoJSON") } downloadData(fromURL: url) { (returnedData) in if let data = returnedData { var geoJson = [MKGeoJSONObject]() do { geoJson = try MKGeoJSONDecoder().decode(data) } catch { fatalError("Unable to decode GeoJSON") } var overlays = [MKOverlay]() for item in geoJson { if let feature = item as? MKGeoJSONFeature { for geo in feature.geometry { if let polygon = geo as? MKPolygon { overlays.append(polygon) } } } } DispatchQueue.main.async { completion(overlays) } } } } func downloadData( fromURL url: URL, completion: @escaping (_ data: Data?) -> ()) { URLSession.shared.dataTask(with: url) { (data, response, error) in guard let data = data, error == nil, let response = response as? HTTPURLResponse, response.statusCode >= 200 && response.statusCode < 300 else { print("Error downloading data.") completion(nil) return } completion(data) } .resume() } }Y aquí hay un fragmento de la estructura GeoJSON
{ "type": "FeatureCollection", "features": [ { "type": "Feature", "id": "zone_restrictionate_uav.2120", "geometry": { "type": "Polygon", "coordinates": [ [ [ 24.98812963, 44.10877275 ], [ 24.98806588, 44.1070722 ], [ 24.98537796, 44.10717296 ], [ 24.9854417, 44.10887351 ], [ 24.98812963, 44.10877275 ] ] ] }, "geometry_name": "the_geom", "properties": { "zone_id": "RZ 2120", "human_readable_definition": "POLYGON: 440631.5819N 0245917.2667E- 440625.4599N 0245917.0372E- 440625.8227N 0245907.3606E- 440631.9446N 0245907.5901E- 440631.5819N 0245917.2667E", "wkt": "POLYGON((24.9881296281 44.1087727458,24.9880658794 44.1070721972,24.9853779561 44.1071729596,24.9854417047 44.1088735083,24.9881296281 44.1087727458))", "lower_lim": "GND", "upper_lim": "120m AGL", "contact": "mailto: aerofoto@mapn.ro", "status": "RESTRICTED" } }, { "type": "Feature", "id": "zone_restrictionate_uav.2121", "geometry": { "type": "Polygon", "coordinates": [ [ [ 26.44760265, 44.13453494 ], [ 26.43440247, 44.11089351 ], [ 26.38955244, 44.1359355 ], [ 26.40275262, 44.15957693 ], [ 26.44760265, 44.13453494 ] ] ] }, "geometry_name": "the_geom", "properties": { "zone_id": "RZ 2121", "human_readable_definition": "POLYGON: 440804.3258N 0262651.3695E- 440639.2166N 0262603.8489E- 440809.3678N 0262322.3888E- 440934.4769N 0262409.9094E- 440804.3258N 0262651.3695E", "wkt": "POLYGON((26.4476026463 44.1345349397,26.4344024672 44.1108935127,26.3895524427 44.1359355018,26.4027526218 44.1595769288,26.4476026463 44.1345349397))", "lower_lim": "GND", "upper_lim": "120m AGL", "contact": "mailto: aerofoto@mapn.ro", "status": "RESTRICTED" } } ], "totalFeatures": 339, "numberMatched": 339, "numberReturned": 339, "timeStamp": "2021-08-15T11:39:26.055Z" }