版本记录
版本号 | 时间 |
---|---|
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
类允许您在地理坐标和与该位置关联的用户友好名称之间进行转换。 您可以将纬度/经度对转换为用户友好的地名,或者反过来。
用户地点名称由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?)
}
}
后记
未完,待续~~~