Last active
April 8, 2024 22:07
-
-
Save benyou1969/c4406a408efd1e142b0bb8ec6aa1b222 to your computer and use it in GitHub Desktop.
Country map Swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import SwiftUI | |
import MapKit | |
import Foundation | |
// MARK: - Welcome | |
struct DataSet: Codable { | |
let nhits: Int | |
let parameters: Parameters | |
let records: [Record] | |
} | |
// MARK: - Parameters | |
struct Parameters: Codable { | |
let dataset, q: String | |
let rows, start: Int | |
let format, timezone: String | |
} | |
// MARK: - Record | |
struct Record: Codable { | |
let datasetid, recordid: String | |
let fields: Fields | |
let geometry: Geometry | |
let recordTimestamp: String | |
enum CodingKeys: String, CodingKey { | |
case datasetid, recordid, fields, geometry | |
case recordTimestamp = "record_timestamp" | |
} | |
} | |
// MARK: - Fields | |
struct Fields: Codable { | |
let labelSP, onuCode, isIlomember: String | |
let geoPoint2D: [Double] | |
let iso2Code, iso3Code, labelFr, officialLangCode: String | |
let labelEn, isReceivingQuest: String | |
let geoShape: GeoShape | |
enum CodingKeys: String, CodingKey { | |
case labelSP = "label_sp" | |
case onuCode = "onu_code" | |
case isIlomember = "is_ilomember" | |
case geoPoint2D = "geo_point_2d" | |
case iso2Code = "iso2_code" | |
case iso3Code = "iso3_code" | |
case labelFr = "label_fr" | |
case officialLangCode = "official_lang_code" | |
case labelEn = "label_en" | |
case isReceivingQuest = "is_receiving_quest" | |
case geoShape = "geo_shape" | |
} | |
} | |
// MARK: - GeoShape | |
struct GeoShape: Codable { | |
let coordinates: [[[Double]]] | |
let type: String | |
} | |
// MARK: - Geometry | |
struct Geometry: Codable { | |
let type: String | |
let coordinates: [Double] | |
} | |
// MARK: - VIEW MODEL | |
class MapViewModel: ObservableObject { | |
@Published var mapRegion = MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: 48.864716, longitude: 2.349014), span: MKCoordinateSpan(latitudeDelta: 0.2, longitudeDelta: 0.2)) | |
@Published var dataSet: DataSet? | |
func fetch(countryName: String) { | |
guard let url = URL(string: "https://public.opendatasoft.com/api/records/1.0/search/?dataset=countries-codes&q=\(countryName)") else { | |
return print("API Error") | |
} | |
let task = URLSession.shared.dataTask(with: url) { [weak self] data, _, error in | |
guard let data = data, error == nil else { return } | |
do { | |
let dataSet = try JSONDecoder().decode(DataSet.self, from: data) | |
print("dataSet: \(dataSet)") | |
DispatchQueue.main.async { | |
self?.dataSet = dataSet | |
self?.mapRegion = MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: dataSet.records[0].geometry.coordinates[1], | |
longitude: dataSet.records[0].geometry.coordinates[0]), | |
span: MKCoordinateSpan(latitudeDelta: 20, longitudeDelta: 20)) | |
} | |
} catch { | |
print(error) | |
} | |
} | |
task.resume() | |
} | |
} | |
// MARK: - View | |
struct CountryMapView: View { | |
@StateObject var mapViewModel = MapViewModel() | |
let countryName: String | |
var body: some View { | |
NavigationView { | |
VStack{ | |
Map(coordinateRegion: $mapViewModel.mapRegion) | |
.navigationTitle(mapViewModel.dataSet?.records[0].fields.labelEn ?? "") | |
} | |
} | |
.onAppear { | |
print(countryName) | |
mapViewModel.fetch(countryName: countryName) | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment