zoukankan      html  css  js  c++  java
  • (七十六)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;

    【经纬度、速度、时间】

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

    - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
    
    }

    数组中放的每一个元素都是一个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成员变量,用于存储走过的总距离和经过的总时间,用于计算平均速度。

    - (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;
    }


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


    【获取方向】

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

    - (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading{
        
        NSLog(@"设备与磁场北所对应的方向%f",newHeading.magneticHeading);
    
    }


    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选项,进入的页面下部有坐标拾取工具,方便获取每个地点的经纬度。





  • 相关阅读:
    PAT (Advanced Level) Practice 1100 Mars Numbers (20分)
    PAT (Advanced Level) Practice 1107 Social Clusters (30分) (并查集)
    PAT (Advanced Level) Practice 1105 Spiral Matrix (25分)
    PAT (Advanced Level) Practice 1104 Sum of Number Segments (20分)
    PAT (Advanced Level) Practice 1111 Online Map (30分) (两次迪杰斯特拉混合)
    PAT (Advanced Level) Practice 1110 Complete Binary Tree (25分) (完全二叉树的判断+分享致命婴幼儿错误)
    PAT (Advanced Level) Practice 1109 Group Photo (25分)
    PAT (Advanced Level) Practice 1108 Finding Average (20分)
    P6225 [eJOI2019]异或橙子 树状数组 异或 位运算
    P4124 [CQOI2016]手机号码 数位DP
  • 原文地址:https://www.cnblogs.com/aiwz/p/6154128.html
Copyright © 2011-2022 走看看