微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

转换地图上注释中的地址输入 - SwiftUI

如何解决转换地图上注释中的地址输入 - SwiftUI

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

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

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

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

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

感谢您的帮助

解决方法

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,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)
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?