从解码的坐标创建MapView-Swift

问题描述

我正在使用自定义坐标设置MapView。到目前为止,这是我的代码

var coordModel: AirportModel?

struct MapView: View {
    
    
    
    @Binding private var lat: Double
    @Binding private var lon: Double

    private let initialLatitudinalMetres: Double = coordModel?.airportLat ?? 0
    private let initialLongitudinalMetres: Double = coordModel?.airportLong ?? 0

    @State private var span: MKCoordinateSpan?

    init(lat: Binding<Double>,lon: Binding<Double>) {
        _lat = lat
        _lon = lon
    }

    private var region: Binding<MKCoordinateRegion> {
        Binding {
            let centre = CLLocationCoordinate2D(latitude: lat,longitude: lon)

            if let span = span {
                return MKCoordinateRegion(center: centre,span: span)
            } else {
                return MKCoordinateRegion(center: centre,latitudinalMeters: initialLatitudinalMetres,longitudinalMeters: initialLongitudinalMetres)
            }
        } set: { region in
            lat = region.center.latitude
            lon = region.center.longitude
            span = region.span
        }
    }

    var body: some View {
        Map(coordinateRegion: region)
    }
}

在AirportModel中,有一段以Double格式解码的数据称为“纬度”和“经度”。我只是尝试将这些数据解码后传递给视图。这是我的视图正文:

var body: some View {
    
        ScrollView{
            MapView(lat: <#Binding<Double>#>,lon: <#Binding<Double>#>)
                .frame(height: 250)
                .edgesIgnoringSafeArea(/*@START_MENU_TOKEN@*/.all/*@END_MENU_TOKEN@*/)
}

我尝试将经纬度和纬度的coordModel?.latitude和coordModel?.longitude放入,以及在调用上方设置变量。我不太确定现在要去哪里。

注意:我正在解码一堆JSON数据,每个用户查询都会导致不同的经纬度拉动(超过10000个潜在响应)。再次感谢!

解决方法

使用ObservableObject的模型:

import Combine
import MapKit

class MapModel: ObservableObject {
    
    var region: MKCoordinateRegion = MKCoordinateRegion(
        center: CLLocationCoordinate2D(latitude: 48.687330584,longitude: 9.219832454),latitudinalMeters: 1000000,longitudinalMeters: 1000000
    ) {
        willSet {
            self.objectWillChange.send()
        }
    }
    
    // MARK: - test code change center evey 10 seconds
    
    init() {
        
        self.timer = Timer.scheduledTimer(withTimeInterval: 10,repeats: true) { timer in
            self.testIndex += 1
            self.testIndex %= self.testCoordinates.count
            let newCenter = self.testCoordinates[self.testIndex]
            let oldSpan = self.region.span
            
            DispatchQueue.main.async {
                self.region = MKCoordinateRegion(center: newCenter,span: oldSpan)
            }
        }
    }
    
    let testCoordinates = [
        CLLocationCoordinate2D(latitude: 48.687330584,// STR
        CLLocationCoordinate2D(latitude: 41.297445,longitude: 2.0832941),// BCN
    ]
    var testIndex: Int = 0
    
    var timer: Timer? = nil
    
    
}

然后创建一个观察模型的视图

import SwiftUI
import MapKit

struct ContentView: View {
    @ObservedObject private var mapModel = MapModel()

    var body: some View {
        Map(coordinateRegion: $mapModel.region)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

出于测试原因,我使用了一个计时器来模拟服务器中的更新数据。

如果需要注释,请将其添加到模型中,如果更改它们,请不要忘记self.objectWillChange.send()