地图定位 -
需要导入头文件
#import <CoreLocation/CoreLocation.h>
1.定位
2.持续定位设置
3.比较两个位置的距离
#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>
@interface ViewController ()<CLLocationManagerDelegate>
@property (nonatomic,strong)CLLocationManager *locationManager;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
/************定位***************/
self.locationManager = [[CLLocationManager alloc]init];
// 请求用户授权(iOS8以后才有) 需要配置 plist 列表
// 在 information Property List 中添加 键值对
// key: NSLocationWhenInUseUsageDescription
// value: 自定义授权说明
// 用户使用期间授权
if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
[self.locationManager requestWhenInUseAuthorization];
}
// 授权
// if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
// [self.locationManager requestAlwaysAuthorization];
// }
//使用代理获得定位数据
self.locationManager.delegate = self;
// 开始定位
[self.locationManager startUpdatingLocation];
// 结束定位
// [self.locationManager stopUpdatingLocation];
/************持续定位设置***************/
//设置距离筛选器
self.locationManager.distanceFilter = 10 ;
//设置精度
/**
kCLLocationAccuracyBest; 默认
kCLLocationAccuracyNearestTenMeters;
kCLLocationAccuracyHundredMeters;
kCLLocationAccuracyKilometer;
kCLLocationAccuracyThreeKilometers;
*/
self.locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
/************比较两个位置的距离***************/
CLLocation *location1 = [[CLLocation alloc]initWithLatitude:40 longitude:70];
CLLocation *location2 = [[CLLocation alloc]initWithLatitude:50 longitude:80];
CGFloat distance = [location2 distanceFromLocation:location1];
NSLog(@"distance:%f",distance/1000);
}
/**
当用户更新位置的时候调用此方法 频繁调用, 非常耗电
*/
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
//CLLocation 位置对象 --> 经纬度
//CLLocationCoordinate2D coordinate 经纬度
//CLLocationDegrees latitude 纬度
//CLLocationDegrees longitude 经度
CLLocation *location = locations.firstObject;
NSLog(@"latitude: %f,longitude: %f",location.coordinate.latitude, location.coordinate.longitude);
}
@end
地理编码
地址坐标 -> 地理坐标
- 创建地理编码对象: CLGeocoder
- 调用方法进行地理编码: geocodeAddressString
-
在block中获取地标对象: CLPlacemark
需要导入头文件
#import <CoreLocation/CoreLocation.h>
CLGeocoder *geocoder = [[CLGeocoder alloc]init];
[geocoder geocodeAddressString:@"北京" completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
if (placemarks.count == 0 || error){
NSLog(@"没有这个地址");
return ;
}
for (CLPlacemark *placemark in placemarks) {
CGFloat latitudeFloat = placemark.location.coordinate.latitude;
CGFloat longitudeFloat = placemark.location.coordinate.longitude;
NSString *detailAddressStr = placemark.name;
NSLog(@"纬度 = %.2f,经度 = %.2f,详细地址 = %@",latitudeFloat,longitudeFloat,detailAddressStr);
}
}];
反地理编码
地理坐标 -> 地址坐标
- 创建地理编码对象: CLGeocoder
- 调用方法进行地理编码:reverseGeocodeLocation
- 在block中获取地标对象: CLPlacemark
需要导入头文件
#import <CoreLocation/CoreLocation.h>
CLGeocoder *geocoder = [[CLGeocoder alloc]init];
//2. 创建 CLLocation对象
CLLocation *location = [[CLLocation alloc] initWithLatitude:31.23 longitude:121.47];
[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
if (placemarks.count == 0 || error) {
NSLog(@"没有数据或数据解析出错");
return;
}
for (CLPlacemark *pm in placemarks) {
// 获取城市信息, 如果有城市信息就显示, 否则可以显示行政区域
if (pm.locality) {
//locality : 城市
NSString *cityStr = pm.locality;
NSLog(@"城市:%@",cityStr);
} else {
//administrativeArea : 行政区域
NSString *administrativeAreaStr = pm.administrativeArea;
NSLog(@" 行政区域: %@",administrativeAreaStr);
}
}
}];