在获取用户位置时候,Core Location 会返回一对经纬度。我们人类看不出什么东东,但是存在就是合理,交给机器吧。
地理编码 : 地址 -> 坐标
反地理编码: 坐标 (经纬度) -> 地址
Core Location 提供了转换工具,但需要联网(;′⌒`)
Core Location 通过 CLGeocoder 类来实现正向和反向地理编码,因为是通过服务器来实现转换的,所以得联网。
在进行反地理编码时候,会返回一个数组。其中包含很多 CLPlacemark 对象。为啥是数组呢,因为反地理编码解析时候,可能会反回许多可能的值。
可以访问的属性有:
• 位置的名字
• 街道名称
• 地区
• 子地区
• 行政区域
• 子行政区域
• 邮政编码
• 国家代码
• 国家名字
-有些地方,可能还包含其他相关信息
我们可以利用上面需要的信息,生成用户需要的字符串。
//1 import CoreLocation 2 CLLocationManagerDelegate
//反地理编码
func reverseGeocode(latitude:Double, longitude: Double){
let geocoder = CLGeocoder()
let currentLocation = CLLocation(latitude: latitude, longitude: longitude)
geocoder.reverseGeocodeLocation(currentLocation, completionHandler: {
(placemarks:[CLPlacemark]?, error:NSError?) -> Void in
guard error == nil else {
return print(error!.localizedDescription)
}
guard let p = placemarks?[0] else {
return print("没有找到一个地址")
}
print(p.name) // 中国广东省广州市XX区XX街道几号
/*
name // eg. Apple Inc.
thoroughfare // street name, eg. Infinite Loop
subThoroughfare // eg. 1
locality // city, eg. Cupertino
subLocality // neighborhood, common name, eg. Mission District
administrativeArea // state, eg. CA
subAdministrativeArea // county, eg. Santa Clara
postalCode // zip code, eg. 95014
ISOcountryCode // eg. US
country // eg. United States
inlandWater // eg. Lake Tahoe
ocean // eg. Pacific Ocean
areasOfInterest // eg. Golden Gate Park
*/
})
}
//地理编码
func locationEncode() {
let geocoder = CLGeocoder()
geocoder.geocodeAddressString("广州塔", completionHandler: {
(placemarks:[CLPlacemark]?, error:NSError?) -> Void in
guard error == nil else {
return print(error!.localizedDescription)
}
guard let p = placemarks?[0] else {
return print("没有找到一个地址")
}
let longitude = p.location?.coordinate.longitude
let latitude = p.location?.coordinate.latitude
print("经度:\(longitude),维度:\(latitude)")
})
}