嗨,如何使用地址解析器快速将address
转换为坐标(经度和纬度)?我希望能够固定保存在变量中的地址的位置。
let address = GlobalVariable.eventClicked.address
@IBOutlet var EventsMapView: MKMapView!
override func viewDidLoad() {
super.viewDidLoad()
self.EventsMapView.delegate = self
}
我正在使用此代码获取坐标,但是我无法将其保存在此完成块之外,因此我是新手。
let geoCoder = CLGeocoder()
geoCoder.geocodeAddressString(address) { (placemarks, err) in
guard err == nil,
let allPlacemarks = placemarks,
let place = allPlacemarks.first,
let loc = place.location else {
return
}
print("log \(loc.coordinate)")
}
所以我的问题是如何保存坐标,然后在地图上添加图钉?谢谢
您可以使用一个块,有关块编程的更多信息在这里:Blocks Programming Topics
首先是进行地理编码的方法:
func geocodeAddress(addressString: String, locationHandler: @escaping (String, CLLocation?, Error?) -> Void){
let geoCoder = CLGeocoder()
geoCoder.geocodeAddressString(addressString) { (placeMarks, error) in
if let placeMark: CLPlacemark = placeMarks?.first{
locationHandler(addressString, placeMark.location, error)
}else{
locationHandler(addressString, nil, error)
}
}
}
通常,通用地理编码器类应具有此方法。此方法接收地址字符串和完成地理编码后将被调用的块。
第二,完成地理编码时要调用的方法:
func geocodingReturned(_ addressStr: String, _ loc: CLLocation?, _ err: Error?){
if nil != loc{
print("Address geocoded: \(addressStr): \(loc!.coordinate.latitude)--\(loc!.coordinate.longitude)")
}else{
if nil != err{
// handle error
print(err!.localizedDescription)
}
}
}
您绘制地图图钉的类将具有此方法。此方法将接收地址字符串,成功进行地址解析的位置以及错误(如果可用)。地理编码完成后,会自动调用此方法。
现在实现上述方法:
geocodeAddress(addressString: "123 front street, new york", locationHandler: geocodingReturned(_:_:_:))