CoreLocation框架详细解析 —— 在坐标和用户友好的地名之间转换(九)

版本记录

版本号 时间
V1.0 2017.11.26

前言

很多的app都有定位功能,比如说滴滴,美团等,他们都需要获取客户所在的位置,并且根据位置推送不同的模块数据以及服务,可以说,定位方便了我们的生活,接下来这几篇我们就说一下定位框架CoreLocation。感兴趣的可以看我写的上面几篇。
1. CoreLocation框架详细解析 —— 基本概览(一)
2. CoreLocation框架详细解析 —— 选择定位服务的授权级别(二)
3. CoreLocation框架详细解析 —— 确定定位服务的可用性(三)
4. CoreLocation框架详细解析 —— 获取用户位置(四)
5. CoreLocation框架详细解析 —— 监控用户与地理区域的距离(五)
6. CoreLocation框架详细解析 —— 确定接近iBeacon(六)
7. CoreLocation框架详细解析 —— 将iOS设备转换为iBeacon(七)
8. CoreLocation框架详细解析 —— 获取指向和路线信息(八)

Overview

在纬度/经度对和该位置的更方便用户的描述之间进行转换。

CLLocationManager对象将位置报告为纬度/经度对。 虽然这些值独特地代表了地球上的任何位置,但它们并不是用户立即与该位置相关联的值。 用户更熟悉描述位置的名称,例如街道名称或城市名称。 CLGeocoder类允许您在地理坐标和与该位置关联的用户友好名称之间进行转换。 您可以将纬度/经度对转换为用户友好的地名,或者反过来。

Figure 1 Converting between coordinates and user-friendly descriptions

用户地点名称由CLPlacemark对象表示,其中包含用于指定街道名称,城市名称,国家/地区名称,邮政编码等的属性。 地标还包含描述该地点的相关地理特征或兴趣点的属性,诸如山脉,河流,商业或地标的名称。

地理编码器Geocoder对象是一次性对象 - 即,您使用每个对象进行一次转换。 您可以创建多个地理编码器对象并执行多次转换,但苹果公司的频率限制了您可以执行的转换次数。 在很短的时间内提出太多的请求可能会导致部分请求失败。


Convert a Coordinate into a Placemark - 将坐标转换为地标

如果您有CLLocation对象,请调用geocoder对象的reverseGeocodeLocation:completionHandler:方法来检索该位置的CLPlacemark对象。 通常情况下,如果要向用户显示有关位置的信息,则需要将坐标转换为地标。 例如,如果用户选择地图上的某个位置,则可能需要在该位置显示该地址。

Listing 1显示了如何获取由CLLocationManager对象报告的最后一个位置的地标信息。 由于对地理编码器geocoder对象的调用是异步的,因此此方法的调用者将传入一个完成处理程序,该处理程序将与结果一起执行。

// Listing 1 Reverse geocoding a coordinate

func lookUpCurrentLocation(completionHandler: @escaping (CLPlacemark?)
                -> Void ) {
    // Use the last reported location.
    if let lastLocation = self.locationManager.location {
        let geocoder = CLGeocoder()
            
        // Look up the location and pass it to the completion handler
        geocoder.reverseGeocodeLocation(lastLocation, 
                    completionHandler: { (placemarks, error) in
            if error == nil {
                let firstLocation = placemarks?[0]
                completionHandler(firstLocation)
            }
            else {
             // An error occurred during geocoding.
                completionHandler(nil)
            }
        })
    }
    else {
        // No location was available.
        completionHandler(nil)
    }
}

Convert a Placemark into a Coordinate - 将地标转换为坐标

如果您有用户提供的地址信息,请调用CLGeocoder的方法获取相应的位置数据。 CLGeocoder类提供了转换用户键入的字符串或转换地址相关信息字典的选项。这些信息被转发给苹果服务器,苹果服务器解释信息并返回结果。

根据用户提供的信息的精度,您可能会收到一个结果或多个结果。例如,传递一串“100 Main St.,USA”的字符串可能会返回许多结果,除非您还指定了搜索区域或其他详细信息。为了帮助您决定哪个结果是正确的,地理编码器实际上会返回CLPlacemark对象,它包含您提供的坐标和原始信息。

Listing 2展示了如何从用户提供的字符串中获取坐标值。该示例仅调用第一个结果提供的完成处理程序。如果字符串不对应任何位置,则该方法将调用带有错误和无效坐标的完成处理程序。

// Listing 2  Getting a coordinate from an address string

func getCoordinate( addressString : String, 
        completionHandler: @escaping(CLLocationCoordinate2D, NSError?) -> Void ) {
    let geocoder = CLGeocoder()
    geocoder.geocodeAddressString(addressString) { (placemarks, error) in
        if error == nil {
            if let placemark = placemarks?[0] {
                let location = placemark.location!
                    
                completionHandler(location.coordinate, nil)
                return
            }
        }
            
        completionHandler(kCLLocationCoordinate2DInvalid, error as NSError?)
    }
}

后记

未完,待续~~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容

  • 简介 在移动互联网时代,移动app能解决用户的很多生活琐事,比如 周边:找餐馆、找KTV、找电影院等等 导航:根据...
    JonesCxy阅读 1,202评论 1 1
  • 版本记录 前言 很多的app都有定位功能,比如说滴滴,美团等,他们都需要获取客户所在的位置,并且根据位置推送不同的...
    刀客传奇阅读 900评论 1 0
  • 国内疫情基本稳定,企业正式复工复产,一切都将恢复原样。 虽然家里还有没开学的娃儿,也顾不得许多了,提前买好食材把冰...
    林妮linni阅读 1,040评论 0 1
  • 七律.步韵雷老师花甲添五生日感吟 年少轻狂别故乡,经风沐雨结清霜。 也曾立下凌云志,怎奈难描锦绣章。 解甲杏林涂字...
    惠芝兰心阅读 407评论 0 0
  • 每次看到你们群聊信息更新,每次看到你们空间变化,每次听到电话那头小心翼翼的问候时,心里的暖流便涌上心头,感谢你们还...
    小一代阅读 999评论 0 4