今天来写写地理编码 ,废话不多说,直接进入正题
地理编码有两种方式
- 反地理编码:把经纬度转换成地名
- 正地理编码:把地名转变成经纬度
不管是正地理编码还是反地理编码,都是由CLGeocoder对象调用相应的实例方法实现
反地理编码代码:
/// 反地理编码
func reverseCeocode() {
let geocoder = CLGeocoder()
//CLLocation对象: 纬度40,经度116
let location = CLLocation(latitude: 40, longitude: 116)
// CLGeocoder对象的反地理编码方法
// 参数一:一个CLLocation对象
// 参数二:完成回调,回调传来两个参数,一个是CLPlacemark地标对象组成的数组, 一个是编码失败的Error
geocoder.reverseGeocodeLocation(location) { (placemarks: [CLPlacemark]?, error: Error?) in
if error != nil {
print("编码失败")
return
}
/// 获取数组最后一个
let placemark = placemarks!.last!
print("经纬度:", placemark.location!.coordinate)
print("城市:" + placemark.locality!)
print("具体位置:" + placemark.name!)
}
}
输出结果:
经纬度: CLLocationCoordinate2D(latitude: 40.0, longitude: 116.0)
城市:北京市
具体位置:妙峰山镇
如果对CLLocation对象不熟悉,可以参考这篇文章浅谈iOS定位
正地理编码代码:
/// 正地理编码
func geocode() {
let geocoder = CLGeocoder()
// CLGeocoder对象的正地理方法
// 参数一:地名
// 参数二:完成回调,回调传来两个参数,一个是CLPlacemark地标对象组成的数组, 一个是编码失败的Error
geocoder.geocodeAddressString("白云") { (placemarks: [CLPlacemark]?, error: Error?) in
if error != nil {
print("编码失败")
}
// 正向编码要遍历地标数组, 因为中国可能有多个有'白云'两个字的地方
// 反向编码一般不要,一个经纬度一般只对应一个地方
for placemark in placemarks ?? [] {
print("经纬度:", placemark.location!.coordinate)
print("城市:" + placemark.locality!)
print("具体位置:" + placemark.name!)
}
}
}
输出结果:
经纬度: CLLocationCoordinate2D(latitude: 26.676849000000001, longitude: 106.633037)
城市:贵阳市
具体位置:白云区
经纬度: CLLocationCoordinate2D(latitude: 23.162281, longitude: 113.26283100000001)
城市:广州市
具体位置:白云区
输出结果表明,贵阳市有个白云区
广州市也有一个白云区。地名重名。
下面看一下CLPlacemark地标类的属性
CLPlacemark类的属性
open var location: CLLocation? { get }
open var country: String? { get } // 国家
open var administrativeArea: String? { get } // 省
open var locality: String? { get } // 城市
open var subLocality: String? { get } // 区
open var name: String? { get } // 具体位置
open var thoroughfare: String? { get } // 街道信息
open var subThoroughfare: String? { get } // 子街道信息
地理编码的简单实现就到这里。
网友评论