如何解决转换地图上注释中的地址输入 - 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 举报,一经查实,本站将立刻删除。