Skip to content

Instantly share code, notes, and snippets.

@benyou1969
Last active April 8, 2024 22:07
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save benyou1969/c4406a408efd1e142b0bb8ec6aa1b222 to your computer and use it in GitHub Desktop.
Save benyou1969/c4406a408efd1e142b0bb8ec6aa1b222 to your computer and use it in GitHub Desktop.
Country map Swift
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