import UIKit
import CoreLocation
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
func geocode(latitude: Double, longitude: Double, completion: @escaping (_ placemark: [CLPlacemark]?, _ error: Error?) -> Void) {
CLGeocoder().reverseGeocodeLocation(CLLocation(latitude: latitude, longitude: longitude)) { placemark, error in
guard let placemark = placemark, error == nil else {
completion(nil, error)
return
}
completion(placemark, nil)
}
}
或者简单地说:
func geocode(latitude: Double, longitude: Double, completion: @escaping (_ placemark: [CLPlacemark]?, _ error: Error?) -> Void) {
CLGeocoder().reverseGeocodeLocation(CLLocation(latitude: latitude, longitude: longitude), completionHandler: completion)
}
或扩展 CLLocation:
extension CLLocation {
func geocode(completion: @escaping (_ placemark: [CLPlacemark]?, _ error: Error?) -> Void) {
CLGeocoder().reverseGeocodeLocation(self, completionHandler: completion)
}
}
要将您的地标格式化为邮寄地址,您可以使用联系人框架CNPostalAddressFormatter:
import Contacts
extension Formatter {
static let mailingAddress: CNPostalAddressFormatter = {
let formatter = CNPostalAddressFormatter()
formatter.style = .mailingAddress
return formatter
}()
}
extension CLPlacemark {
var mailingAddress: String? {
postalAddress?.mailingAddress
}
}
extension CNPostalAddress {
var mailingAddress: String {
Formatter.mailingAddress.string(from: self)
}
}
地标
包含一个 CLPlacemark 对象数组。对于大多数地理编码请求,
这个数组应该只包含一个条目。然而,前向地理编码
在以下情况下,请求可能会返回多个地标对象
指定的地址无法解析到单个位置。如果
请求被取消或获取地标时出错
信息,此参数为nil。
有关 CLPlacemark 属性的更多信息,您可以查看此CLPlacemark
用法:
let location = CLLocation(latitude: -22.963451, longitude: -43.198242)
location.geocode { placemark, error in
if let error = error as? CLError {
print("CLError:", error)
return
} else if let placemark = placemark?.first {
// you should always update your UI in the main thread
DispatchQueue.main.async {
// update UI here
print("name:", placemark.name ?? "unknown")
print("address1:", placemark.thoroughfare ?? "unknown")
print("address2:", placemark.subThoroughfare ?? "unknown")
print("neighborhood:", placemark.subLocality ?? "unknown")
print("city:", placemark.locality ?? "unknown")
print("state:", placemark.administrativeArea ?? "unknown")
print("subAdministrativeArea:", placemark.subAdministrativeArea ?? "unknown")
print("zip code:", placemark.postalCode ?? "unknown")
print("country:", placemark.country ?? "unknown", terminator: "\n\n")
print("isoCountryCode:", placemark.isoCountryCode ?? "unknown")
print("region identifier:", placemark.region?.identifier ?? "unknown")
print("timezone:", placemark.timeZone ?? "unknown", terminator:"\n\n")
// Mailind Address
print(placemark.mailingAddress ?? "unknown")
}
}
}
这将打印出来
名称:Morro da Saudade
地址1:木麻黄街
地址2:597
邻里:拉戈阿
城市:里约热内卢
状态:RJ
subAdministrativeArea:未知
邮编:22011-040
国家:巴西
isoCountryCode: BR
区域标识符: 半径 141.83
时区:America/Sao_Paulo(当前)
木麻黄街,597
拉戈阿
里约热内卢 RJ
22011-040
巴西