本文相关: CLLocation
CLGeocoder
上一篇说到如何获取相关坐标值,这篇主要来说说根据坐标值来获取其位置的详细信息。
之前我们讲到在当成功授权后,便可以通过- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
这个Delegate来获取位置数据
#pragma mark - CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
CLLocation *newLocation = [locations lastObject];
NSLog(@"newLocation lat:%f", newLocation.coordinate.latitude);
NSLog(@"newLocation lng:%f", newLocation.coordinate.longitude);
}
这里要注意的是,(NSArray *)locations
是数组参数传过来,官方的解释这个参数是
An array of CLLocation
objects containing the location data. This array always contains at least one object representing the current location. If updates were deferred or if multiple locations arrived before they could be delivered, the array may contain additional entries. The objects in the array are organized in the order in which they occurred. Therefore, the most recent location update is at the end of the array.
这里的意思是locations
主要至少包含了一组当前的位置数据,如果更新有延迟或者几个数据同时传过来的话,那locations
便会包含几条位置信息,但最后更新的(最新的)位置信息是放在最后那个元素。
CLLocation
所以我们只需要读取locations
最后一个元素便能获得一个CLLocation
对象数据。
CLLocation *newLocation = [locations lastObject];
CLLocation不仅包含了地理位置信息,还包含了方向,速度等信息,当然这些信息都是由硬件提供,然后通过CLLocation获取到这些信息。
基本属性
其中CLLocation有以下一些属性
- coordinate (坐标组)
- altitude (垂直高度——基于海平面,单位为米)
- floor (iOS 8.0之后的属性)
- horizontalAccuracy (该属性表明定位信息的水平精确度。将返回的坐标作为圆心,并将水平精确度视为半径。真正的设备位置落在此圆内的某处。此圆越小,位置就越精确;此圆越大,则位置越不精确。如果精确度为负值,则表明测量精确度失败。)
- verticalAccuracy (该属性表明定位信息的垂直精确度。也就是说,iOS设备的实际高度在该定位信息的高度加或减该属性值的范围内。)
- timestamp (这个时间是GMT 格林威治时间,北京时间是 GMT +8,所以加上8小时后才是北京时间)
- description (信息描述)
计算两点间的距离
如果要计算两点之间的距离的话,可以使用- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location
这个函数
double distance = [newLocation distanceFromLocation:secondLocation];
计算当前行驶速度
CLLocation其中一个属性值speed,是用来计算出当前行驶速度,单位是 米/秒
如果需要换算出时速公里的话,则可以通过计算获得
//乘以3600秒为1小时,然后除以1000为1公里
double kmPreHour = location.speed * 3600 / 1000;
获取当前方向
该属性表示当前设备前进的方向。该值为0°表示向北,90°表示向东,180°表示向南,270°表示向西。
double currentCourse = location.course;