iOS开发 - 地理编码与反地理编码

在获取用户位置时候,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)")
        })
    }

你可能感兴趣的:(iOS开发 - 地理编码与反地理编码)