【问题标题】:Convert adress input in annotation on the map - SwiftUI在地图上的注释中转换地址输入 - SwiftUI
【发布时间】:2021-06-20 15:27:17
【问题描述】:

我是初学者,很抱歉我的问题。

我在数据文件中有地图和注释。

现在我希望用户能够使用表单注册地址。

我如何从普通地址转到一个

location: CLLocationCoordinate2D(latitude: 48.8566, longitude: 2.3522)

感谢您的帮助

【问题讨论】:

    标签: swiftui mapkit mapkitannotation


    【解决方案1】:

    Core Location 有一个“地理编码器”,它将获取街道地址并将其转换为 CLLocationCoordinate2D

    这是来自 Apple 官方文档 (https://developer.apple.com/documentation/corelocation/converting_between_coordinates_and_user-friendly_place_names):

    func getCoordinate( addressString : String, 
            completionHandler: @escaping(CLLocationCoordinate2D, NSError?) -> Void ) {
        let geocoder = CLGeocoder()
        geocoder.geocodeAddressString(addressString) { (placemarks, error) in
            if error == nil {
                if let placemark = placemarks?[0] {
                    let location = placemark.location!
                        
                    completionHandler(location.coordinate, nil)
                    return
                }
            }
                
            completionHandler(kCLLocationCoordinate2DInvalid, error as NSError?)
        }
    }
    

    注意,前面的函数使用回调函数,是一个异步函数。这意味着它不会立即返回 - 相反,它会在未来不确定的时间结束,并在结束时调用回调函数。


    由于您标记了问题 SwiftUI,以下是 SwiftUI 的一个简单示例:

    import SwiftUI
    import MapKit
    
    class LocationManager : ObservableObject {
        @Published var location : CLLocationCoordinate2D?
        
        func convertAddress(address: String) {
            getCoordinate(addressString: address) { (location, error) in
                if error != nil {
                    //handle error
                    return
                }
                DispatchQueue.main.async {
                    self.location = location
                }
            }
        }
        
        private func getCoordinate(addressString : String,
                completionHandler: @escaping(CLLocationCoordinate2D, NSError?) -> Void ) {
            let geocoder = CLGeocoder()
            geocoder.geocodeAddressString(addressString) { (placemarks, error) in
                if error == nil {
                    if let placemark = placemarks?[0] {
                        let location = placemark.location!
                            
                        completionHandler(location.coordinate, nil)
                        return
                    }
                }
                    
                completionHandler(kCLLocationCoordinate2DInvalid, error as NSError?)
            }
        }
    }
    
    struct ContentView: View {
        @State var addressString = "1600 Pennsylvania Ave, Washington D.C."
        @StateObject private var locationManager = LocationManager()
        
        var body: some View {
            VStack {
                Text("Address: \(addressString)")
                if let location = locationManager.location {
                    Text("Lat: \(location.latitude) Long: \(location.longitude)")
                }
            }.onAppear {
                locationManager.convertAddress(address: addressString)
            }
        }
    }
    

    【讨论】:

    • 感谢@jnpdx 的帮助!我开始掌握它的窍门。我将通过尝试为地址创建一个输入表单来了解这些基础知识,并了解如何在将出现在地图上的对象中返回值。
    • 太棒了。您可以通过单击绿色复选标记将答案标记为已接受。
    • 实现这一点对我来说真是一场噩梦。我花了2天时间。终于得到了一些帮助,他们帮助我重构。最终结果有点不同。也许只是我对它的特殊使用很奇怪。至少它最终把我带到了那里。感谢您的解决方案,因为我从它开始。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多