繁体   English   中英

从解码的坐标创建 MapView - swift

[英]Creating MapView from decoded coordinates - 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 放入 lat 和 lon,并在调用上方设置变量。 我现在不太确定要去哪里。

注意:我正在解码一堆 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, longitude: 9.219832454), // 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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM