美文网首页iosiOS 常见问题汇总
ios 获取地理位置信息

ios 获取地理位置信息

作者: Arthur澪 | 来源:发表于2017-12-19 21:33 被阅读1299次

    项目中需要获取用户的地理位置信息,如经纬度。不使用相关第三方工具,其实原生的框架就提供了相关接口,并且真机测试效果还不错。(模拟器上测试位置误差极大)

    简介

    iOS中加入定位和地图功能所依赖的框架是CoreLocation。使用CLLocationManager对象,可以做很多相关的位置服务。

    CLLocation对象

    • 属性
      coordinate:当前位置所在的经、纬度数据
      altitude:海拔
      speed:当前速度
      course:航向(设备的移动方向,值域范围0.0~359.9,正北方向为0.0)
        //  获取经、纬度
        CLLocation *location = [locations lastObject];
        
        CLLocationCoordinate2D coordinate = location.coordinate;
        NSLog(@"---x:%f---y:%f",coordinate.latitude,coordinate.longitude);
    
    • 方法
      distanceFromLocation:location
      作用:计算两个位置对象之间的物理距离:单位是米。

    使用CoreLocation进行定位

    导入框架
    (Xcode5.0之后可以省略)

    导入头文件
    import <CoreLocation/CoreLocation.h>

    遵守协议
    <CLLocationManagerDelegate>

    创建CLLocationManager管理者

    @property(nonatomic,strong)CLLocationManager *locationManager;
    
    ...
        self.locationManager = [[CLLocationManager alloc] init];
        self.locationManager.delegate = self;
        self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;   //10米 精度
    

    定位精确度:desiredAccuracy
    kCLLocationAccuracyBestForNavigation:最适合导航
    kCLLocationAccuracyBest:最好精度
    kCLLocationAccuracyNearestTenMeters:附近10米
    kCLLocationAccuracyHundredMeters:附近100米
    kCLLocationAccuracyKilometer:附近1000米
    kCLLocationAccuracyThreeKilometers:附近3000米
    定位功能非常耗电,精确度越高越耗电,定位时间越长。为了省电,尽量在满足需求的情况下降低精确度。

    开始定位

    -(void)startLocating{
        
        if([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]){
            
            [self.locationManager requestWhenInUseAuthorization];
        }
        
        [self.locationManager startUpdatingLocation];   //开始定位
    }
    

    代理方法回调

    /* 定位完成后 回调 */
    -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
        
        CLLocation *location = [locations lastObject];
        
        CLLocationCoordinate2D coordinate = location.coordinate;
        //  经纬度
        NSLog(@"---x:%f---y:%f",coordinate.latitude,coordinate.longitude);
        
        [manager stopUpdatingLocation];   //停止定位
    }
    
    /* 定位失败后 回调 */
    -(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
        
        if (error.code == kCLErrorDenied) {
            // 提示用户出错
        }
    }
    

    监听用户授权状态

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

    授权状态对应的含义
    kCLAuthorizationStatusNotDetermined:用户未决定
    kCLAuthorizationStatusRestricted:定位服务访问受限 (系统预留字段)
    kCLAuthorizationStatusDenied:定位被拒绝
    kCLAuthorizationStatusAuthorizedAlways:前后台定位授权
    kCLAuthorizationStatusAuthorizedWhenInUse:前台定位授权

    设置定位权限
    Privacy - Location Always and When In Use Usage Description
    Privacy - Location When In Use Usage Description
    在info.plist中添加这两个即可

    地理编码 / 反编码

    地理编码:根据地址关键字,将其转换成对应的经纬度等信息。
    反地理编码:根据经纬度信息,将其转换成为对应的省市区街道等信息。

    • 地理编码
      导入CoreLocation框架及对应的主头文件;
      创建CLGeocoder
      根据地址关键字,进行地理编码;
      直接根据地址进行地理编码,返回结果可能有多个,因为一个地点有重名;
    [self.Geocoder geocodeAddressString:addressStr completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
    
    }];
    
    • 反地理编码
      导入CoreLocation框架及对应的主头文件;
      创建CLGeocoder
      根据经纬度信息,进行反地理编码;
    [self.Geocoder reverseGeocodeLocation:loc completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
    
    }];
    

    CLPlacemark地标对象

    • 属性

    location:CLLocation类型,位置对应信息,里面包含经纬度,海拔等信息
    region:CLRegion类型,地标对象对应的区域
    addressDictionary:NSDictionary类型,存放街道,省市等信息
    name:NSString类型,地址全称
    thoroughfare:NSString类型,街道名称
    locality:NSString类型,城市名称
    administrativeArea:NSString类型,省名称
    country:NSString类型,国家名称

    - (void)geocoder {
         
        CLGeocoder *geocoder=[[CLGeocoder alloc] init];
         
        NSString *addressStr = @"广东省深圳市宝安区";
         
        [geocoder geocodeAddressString:addressStr completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
            if (error!=nil || placemarks.count==0) {
                return ;
            }
            //创建placemark对象
            CLPlacemark *placemark=[placemarks firstObject];
            //经度
            NSString *longitude =[NSString stringWithFormat:@"%f",placemark.location.coordinate.longitude];
            //纬度
            NSString *latitude =[NSString stringWithFormat:@"%f",placemark.location.coordinate.latitude];
             
            NSLog(@"经度:%@,纬度:%@",longitude,latitude); 
        }];
    }
    
    //24.482420---y:118.087901
        CLGeocoder *der = [[CLGeocoder alloc] init];
        CLLocation *loc = [[CLLocation alloc] initWithLatitude:24.482420 longitude:118.087901];
        
        [der reverseGeocodeLocation:loc completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
            
            CLPlacemark *plk = [placemarks firstObject];
            
            NSLog(@"---城市:%@--街道:%@--全称:%@",plk.locality,plk.thoroughfare,plk.name);
        }];
    

    相关文章

      网友评论

        本文标题:ios 获取地理位置信息

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