iOS地理编码的简单实现

今天来写写地理编码 ,废话不多说,直接进入正题

地理编码有两种方式
  • 反地理编码:把经纬度转换成地名
  • 正地理编码:把地名转变成经纬度

不管是正地理编码还是反地理编码,都是由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 } // 子街道信息

地理编码的简单实现就到这里。

你可能感兴趣的:(iOS地理编码的简单实现)