ios 获取地理位置信息

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

简介

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

遵守协议

创建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 *)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 * _Nullable placemarks, NSError * _Nullable error) {

}];
  • 反地理编码
    导入CoreLocation框架及对应的主头文件;
    创建CLGeocoder
    根据经纬度信息,进行反地理编码;
[self.Geocoder reverseGeocodeLocation:loc completionHandler:^(NSArray * _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 * _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 * _Nullable placemarks, NSError * _Nullable error) {
        
        CLPlacemark *plk = [placemarks firstObject];
        
        NSLog(@"---城市:%@--街道:%@--全称:%@",plk.locality,plk.thoroughfare,plk.name);
    }];

你可能感兴趣的:(ios 获取地理位置信息)