iOS开发超神学院iOS功能模块收录地理问题

CoreLocation(定位)

2016-06-29  本文已影响178人  IIronMan

题外话:

1.CoreLocation框架的使用

** 配置的方法:点击 requestAlwaysAuthorization **

*配置的方法*

4.开始监听(开始获取位置)

[self.locationManger startUpdatingLocation];

NSLog(@"开始定位");

5.实现代理方法

   /*
*  获取到位置信息之后就会被调用
*
*  @param manger   触发事件的对象
*
*  @param locations  获取到的位置
*/

//这步操作是很耗电的(一定要设置定位暂停)
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{

    NSLog(@"%s",__func__);

    [self.locationManger stopUpdatingLocation];

    NSLog(@"定位结束");

}

对于上面其他的一些设置

1.设置获取位置的精确度
如:self.locationManger.distanceFilter = kCLLocationAccuracyNearestTenMeters;

   kCLLocationAccuracyBestForNavigation 
   kCLLocationAccuracyBest;
   kCLLocationAccuracyNearestTenMeters;
   kCLLocationAccuracyHundredMeters;
   kCLLocationAccuracyKilometer;
   kCLLocationAccuracyThreeKilometers;

2.设置多久距离获取一次location

self.locationManger.distanceFilter = 500; //filter |ˈfɪltə(r) 过滤

3.何时开启定位?(获取权限之后)

  -(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{

/*
    //1.用户从未选择过授权
    kCLAuthorizationStatusNotDetermined = 0
    //2.无法使用定位服务,该状态用户无法改变
    kCLAuthorizationStatusRestricted
    //3.用户拒绝该应用定服务,或是定位服务总开关出于关闭状态
    kCLAuthorizationStatusDenied
    //4.已经授权(废弃)
    kCLAuthorizationStatusAuthorized
    //5.用户允许该程序无论何时都可以使用地理信息
    kCLAuthorizationStatusAuthorizedAlways
    //6.用户同意程序在可见时使用地理位置
    kCLAuthorizationStatusAuthorizedWhenInUse
 
    ****"最主要是后两个:定位成功"******
 */

    if (status == kCLAuthorizationStatusNotDetermined) {
    
          NSLog(@"等待用户授权");
    }else if (status == kCLAuthorizationStatusAuthorizedAlways || status == kCLAuthorizationStatusAuthorizedWhenInUse)
    {

          NSLog(@"授权成功");
    
         //4.开始监听(开始获取位置)
    
         [self.locationManger startUpdatingLocation];
    
         NSLog(@"开始定位");

   }else
    {
         NSLog(@"授权失败");

    }

}

2.打印定位信息

latitude |ˈlætɪtjuːd, American -tuːd| 纬度
longitude |ˈlɒndʒɪtjuːd, American ˈlɔːndʒɪtuːd| 经度
degree |dɪˈgriː| 度
coordinate |kəʊˈɔːdɪnət |noun 坐标

   //7.监听定位信息

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{

 CWLog(@"%s",__func__);

//8.获取CLLocation对象(获取用户最后一次的位置)
/*
 
 location.coordinate; 坐标,包含经纬度
 location.altitude;设置海拔高度,单位是米
 location.course;设置前进方向 0表示北 90东  180南  270西 
 location.horizontalAccuracy; 水平精准度
 location.verticalAccuracy;  垂直精准度
 location.timeatamp;定位信息返回的时间
 location.speed; 设备移动速度 单位是米/秒 ,适于行车速度而不太适于步行

 */
 /*
  可以设置模拟器的速度
  bicycle ride  骑车速度
  run 跑步
  freeway drive  告诉公路驾车
  */

CLLocation *location = [locations lastObject];

NSLog(@"经度=%f 纬度=%f  speed = %f",location.coordinate.latitude,location.coordinate.longitude,location.speed);

//如果只需要获取一次,可以获取到位置之后就停止
 //[self.locationManager stopUpdatingLocation];

 CWLog(@"关闭定位");
}

3.回顾一下CLLocationManger 的常用操作

location 参数里面装着CLLocation的对象

CLLocation的一些属性

4.有关-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations方法里面的一些操作(做一个类似导航的东西,界面自己布局)

声明

//上一次的位置
@property(nonatomic,strong)CLLocation *previousLocation;//previous |ˈpriːvɪəs| 先前的
//计算总的距离
@property(nonatomic,assign)CLLocationDistance sumDistance;
//记录总时间
@property(nonatomic,assign)NSTimeInterval sumTime;

方法的实现

 //6.定位调用

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{

CWLog(@"定位信息打印");


/*  CLLocation 属性
    
 timestap  获取到当前位置信息的时间
 
 */

/*
    获取走了多远(用这一次的位置减去上一次的时间)
    获取走这段路花了多长时间(这一次的时间减去上一次的时间)
    获取速度(走了多远 / 花了多少时间)
    获取总共走的路程 (把每次获取到走了多远累加起来)
    获取平均速度  (总路程 / 总时间)
 */

CLLocation *newlocation = [locations lastObject];

if (self.previousLocation != nil) {
    
    //计算两次的距离(单位是米)
    
   CLLocationDistance distance = [newlocation distanceFromLocation:self.previousLocation];
    
    //计算两次之间的时间(单位是秒)
    
   NSTimeInterval dTime = [newlocation.timestamp timeIntervalSinceDate:self.previousLocation.timestamp];
    
    //计算速度(米/秒)
    
    CGFloat speed = distance/dTime;
    
    CWLog(@"距离=%f 时间=%f 速度=%f ",distance,dTime,speed);
    
    //累加时间
    
    self.sumTime += dTime;
    
    //累加距离
    
    self.sumDistance += distance;
    
    //计算平均速度
    
    CGFloat averangeSpeed = self.sumDistance/self.sumTime;
    
     CWLog(@"两次之间的距离=%f 时间=%f 当前速度=%f 全程时间= %f  全程距离= %f 全程的平均速度 = %f",distance,dTime,speed,self.sumTime,self.sumDistance,averangeSpeed);

   }
   //记录上一次的位置
   self.previousLocation = newlocation;

}

提示:

CLLocationDistance distance = [newlocation distanceFromLocation:self.previousLocation];很重要获取两个位置之间的距离
上一篇 下一篇

猜你喜欢

热点阅读