- 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);
}];
}
网友评论