美文网首页
定位CoreLocation

定位CoreLocation

作者: 董立权 | 来源:发表于2017-07-16 14:14 被阅读0次
  • CoreLocation用于获取设备的地理位置信息和方向

定位

//用于定位的框架
#import <CoreLocation/CoreLocation.h>
//CoreLocation框架中所有数据类型的前缀都是CL
//CoreLocation中使用CLLocationManager对象来做用户定位
//位置管理者
@property (nonatomic,strong) CLLocationManager *locationManager;
//--------------------------------------------------------------------
//1.创建位置管理者
    CLLocationManager *manager = [[CLLocationManager alloc] init];
    //记录成员变量
    self.locationManager = manager;
//在iOS8之前,只需要导入CoreLocation 会自动申请权限
    //在iOS8之后需要程序员手写
    //2.请求用户授权  必须要配置info.plist文件
    //请求app始终授权 无论程序在前台还是在后台运行 都可以定位
//    [manager requestAlwaysAuthorization];
    //请求app在使用期间授权 在前台使用时才可以使用定位
    [manager requestWhenInUseAuthorization];
    
    if([UIDevice currentDevice].systemVersion.floatValue >= 9.0) {
        //临时开启后台定位 配置info.plist文件 不配置直接崩溃
        manager.allowsBackgroundLocationUpdates = YES;
    }

<key>NSLocationWhenInUseUsageDescription</key>
    <string></string>
 //设置定位属性
    //每隔多远定位一次
    manager.distanceFilter = 100;
    /*
      kCLLocationAccuracyBestForNavigation //最适合导航
      kCLLocationAccuracyBest;//最好的
      kCLLocationAccuracyNearestTenMeters;//10米
      kCLLocationAccuracyHundredMeters;//100米
      kCLLocationAccuracyKilometer;//1000米
      kCLLocationAccuracyThreeKilometers;//3000米
     */
    //精确度越高,越耗电,定位时间越长
    manager.desiredAccuracy = kCLLocationAccuracyBest;
//设置代理
    manager.delegate = self;
//开启定位
    [manager startUpdatingLocation];
#pragma mark - CLLocationManagerDelegate
/*
 更新位置之后调用
 参数1:位置管理者
 参数2:位置数组
 */
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
    //获取数据
    NSLog(@"%@",locations);
    //停止定位 省电
    [manager stopUpdatingLocation];
}

比较两点之间的直线距离

//比较两个位置之间的距离
-(void)compareDistance {
    //根据精度生成位置信息
    CLLocation *location1 = [[CLLocation alloc] initWithLatitude:39 longitude:115];
    
    CLLocation *location2 = [[CLLocation alloc] initWithLatitude:30 longitude:120];
    
    //计算距离
    CLLocationDistance distance = [location1 distanceFromLocation:location2];
    
    NSLog(@"%.2fKm",distance/1000);
}

地理编码 反地理编码

    name                    地名
    thoroughfare            街道
    subThoroughfare         街道相关信息,例如门牌等
    locality                城市
    subLocality             城市相关信息,例如标志性建筑
    administrativeArea      直辖市
    subAdministrativeArea   其他行政区域信息(自治区等)
    postalCode              邮编
    ISOcountryCode          国家编码
    country                 国家
    inlandWater             水源,湖泊
    ocean                   海洋
//地理编码
- (IBAction)geocoder:(id)sender {
    //地理编码:将具体地址转换成经纬度
    
    //1.创建地理编码对象
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    //2.地理编码
    if(self.addressTextField.text.length == 0) return;
    //异步 向苹果请求数据
    [geocoder geocodeAddressString:self.addressTextField.text completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        //防错处理
        if(error){
            NSLog(@"%@",error);
            return ;
        }
        //placemarks:所有的地标 一个CLPlacemark代表一个地标
        for (CLPlacemark *placemark in placemarks) {
            NSLog(@"%@",placemark);
            //精度
            self.longitudeLabel.text = [NSString stringWithFormat:@"%f",placemark.location.coordinate.longitude];
            //纬度
            self.latitudeLabel.text = [NSString stringWithFormat:@"%f",placemark.location.coordinate.latitude];
            
        }
    }];
}
//反地理编码
- (IBAction)revGeocoder:(id)sender {
    //反地理编码: 将经纬度转换成具体地址
    
    //1.创建地理编码对象
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    //2.反地理编码
    //2.1创建位置信息
    CLLocation *location = [[CLLocation alloc] initWithLatitude:[self.longitudeTextField.text floatValue] longitude:[self.latitudeTextField.text floatValue]];
    //2.2向苹果请求数据
    [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        //2.3防错处理
        if(error){
            NSLog(@"%@",error);
            return ;
        }
        //2.4获取地标 在公司开发中给一个列表供用户选择
        CLPlacemark *placemark = placemarks[0];
        //2.5赋值
        self.addressLabel.text = placemark.name;
        NSLog(@"%@",placemark.locality);
    }];
}

相关文章

网友评论

      本文标题:定位CoreLocation

      本文链接:https://www.haomeiwen.com/subject/xfltkxtx.html