(七十六)CoreLocation(二)获取经纬度、速度、方向,进行区域

上节说明了如何在iOS7和iOS8上完成授权,并且开始获取位置,这一节介绍获取位置信息的方法。

【定位精度】

定位精度有多种选择:根据字面意思即可理解

extern const CLLocationAccuracy kCLLocationAccuracyBestForNavigation;extern const CLLocationAccuracy kCLLocationAccuracyBest;extern const CLLocationAccuracy kCLLocationAccuracyNearestTenMeters;extern const CLLocationAccuracy kCLLocationAccuracyHundredMeters;extern const CLLocationAccuracy kCLLocationAccuracyKilometer;extern const CLLocationAccuracy kCLLocationAccuracyThreeKilometers;进行设置:

self.manager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;

【经纬度、速度、时间】

上节说到了更新位置的代理方法,这个方法传入了位置管理者自己和一个位置数组:

<span style="font-size:18px;">- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{}</span>数组中放的每一个元素都是一个CLLocation对象,为了得到最新的位置,我们应当获取数组的最后一个元素。

CLLocation主要包含了经纬度、海拔、速度、时间等信息。

CLLocation中的经纬度存储在CLLocationCoordinate2D结构体中,其中latitude为纬度,北纬用正数表示,南纬用负数表示,范围是+90~-90,longitude为经度,范围是0~360。

CLLocation中的海拔、速度等都是double类型,但为了统一期间苹果公司通过typedef命名为CLLocationDistance、CLLocationSpeed等。

CLLocation中的时间使用NSDate,一般是用来计算时间差用的,,NSDate中提供了方法timeIntervalSinceDate:能够方便的计算两个时间的差,用于计算平均速度等。

我们在得到了经纬度后,常常要计算它与某个点的距离,这时候只需要使用distanceFromLocation:方法即可得到两个CLLocationCoordinate2D点之间的距离。

下面以计算平均速度为例,说明各个属性的应用,其中self.previousLocation是为了存储上一次位置而定义的CLLocation成员变量,self.sumDistance和self.sumTime分别是CLLocationDistance和NSTimerInterval成员变量,用于存储走过的总距离和经过的总时间,用于计算平均速度。

<span style="font-size:18px;">- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{CLLocation *nowLocation = [locations lastObject];// 导航,利用timestamp和coordinate属性if (self.previousLocation != nil) {CLLocationDistance distance = [nowLocation distanceFromLocation:self.previousLocation];NSTimeInterval time = [nowLocation.timestamp timeIntervalSinceDate:self.previousLocation.timestamp];self.sumDistance += distance;self.sumTime += time;CGFloat speed = _sumDistance / _sumTime;NSLog(@"dis=%fm dtime=%fs AVGSeed=%fm/s",distance,time,speed);}self.previousLocation = nowLocation;}</span>

Tip:为了模拟位置的改变,我们使用模拟器Debug菜单中的Location来模拟,最后三项分别是用来仿真骑行、跑步、驾车状态的。

【获取方向】

单单获取方向并不会触犯什么用户隐私,因此不需要授权,直接调用startUpdatingHeading方法开始获取方向,然后实现代理方法:CLHeading中的magneticHeading属性代表当前方向与磁场北极之间的夹角,顺时针为正向。

<span style="font-size:18px;">- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading{NSLog(@"设备与磁场北所对应的方向%f",newHeading.magneticHeading);}</span>

Tip:这个必须在真机上才能调试。

【区域监听】

所谓区域监听,就是划定一定的经纬度区域,当用户进入和离开区域时,调用两个代理方法来通知。

要进行区域监听,是需要获取用户授权的,和上一篇介绍的授权一致。

一般是指定一个圆形区域进行监听,传入圆心(CLLocationCoordinate2D结构体)和区域半径(CLLocationDistance,实质是double),还可以指定一个标志,用来区分不同区域:

CLLocationCoordinate2D center = CLLocationCoordinate2DMake(37, 122);CLCircularRegion *circle = [[CLCircularRegion alloc] initWithCenter:center radius:10000 identifier:@"hitwh"];[self.manager startMonitoringForRegion:circle];代理方法:

– (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region{NSLog(@"in");}- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region{NSLog(@"out");}Tip:要知道现在的经纬度,可以借助百度地图的地图API,进入百度地图后右上侧菜单中有地图API选项,进入的页面下部有坐标拾取工具,方便获取每个地点的经纬度。

版权声明:本文为博主原创文章,未经博主允许不得转载。

他们比任何人都分毫较量,又比任何人都口是心非。他们比任何人都依赖彼此,

(七十六)CoreLocation(二)获取经纬度、速度、方向,进行区域

相关文章:

你感兴趣的文章:

标签云: