我们的应用中常常会用到地图和定位的相关功能,在开发中,想加入这两个功能,必须要基于2个框架进行开发。
Map Kit : 用于地图展示
Core Location : 用于地理定位
1.定位的基本使用
实现一次定位
实现持续定位
比较两个位置的距离
ios9地位的问题
2.地理编码和反地理编码
地理编码
反地理编码
3.地图的基本使用
设置地图显示类型
显示用户的位置
根据用户的位置显示对应的大头针信息(反地理编码)
设置用户所在位置为中心点(点击按钮返回用户所在的位置)
设置地图显示的范围大小
点击按钮返回用户的位置
获取地图的显示大小和中心经纬度
4.大头针的使用
添加大头针到地图上
自定义大头针/改变大头针的颜色/图像/动画掉落
5.地图导航
一、Core Location 的基本使用:
首先要导入框架 -> 导入主头文件:#import<CoreLocation/CoreLocation.h> -> 创建CLLocationManager对象做用户定位。
CLLocationManager的常用操作:
开始定位 :- (void)startUpdatingLocation;
停止用户定位:- (void) stopUpdatingLocation;
当调用了startUpdatingLocation方法后,就会开始不断地定位用户的位置,中途会频繁地调用代理的下面的方法:locations参数中装着CLLocation对象
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;
每隔多少米定位一次:
@property(assign, nonatomic) CLLocationDistance distanceFilter;
定位精准度(越准确越耗电)
@property(assign, nonatomic) CLLocationAccuracy desiredAccuracy;
CLLocation的基本属性:常用来表示某个位置的地理信息,比如经纬度海拔等
经纬度:
@property(readonly, nonatomic) CLLocationCoordinate2D coordinate;
海拔
@property(readonly, nonatomic) CLLocationDistance altitude;
路线、航向(取值范围是0.0~ 359.9,0.0代表正北方向 )
@property(readonly, nonatomic) CLLocationDirection course;
行走速度(单位m/s)
@property(readonly, nonatomic) CLLocationSpeed speed;
用- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location方法可以计算2个位置之间的距离
CLLocationCoordinate2D:
一般用CLLocationCoordinate2DMake
函数来创建
CLLocationCoordinate2D
CLLocationCoordinate2D是一个用来表示经纬度的结构体,定义如下
typedef struct {
CLLocationDegrees latitude; // 纬度
CLLocationDegrees longitude; // 经度
} CLLocationCoordinate2D;
开发者可以在Info.plist中设置NSLocationUsageDescription说明定位的目的(Privacy - Location Usage Description)
一旦用户选择了“Don’t Allow”,意味着你的应用以后就无法使用定位功能,为了严谨起见,最好在使用定位功能之前判断当前应用的定位功能是否可用
CLLocationManager有个类方法可以判断当前应用的定位功能是否可用 + (BOOL)locationServicesEnabled;
从iOS 8开始,用户定位分两种情况,需要在plist文件中配置一下:
总是使用用户位置:NSLocationAlwaysUsageDescription
使用应用时定位:NSLocationWhenInUseDescription
CLGeocoder的简单使用:
使用CLGeocoder可以完成“地理编码”和“反地理编码”
地理编码:根据给定的地名,获得具体的位置信息(比如经纬度、地址的全称等)
反地理编码:根据给定的经纬度,获得具体的位置信息
地理编码方法
- (void)geocodeAddressString:(NSString *)addressString completionHandler:(CLGeocodeCompletionHandler)completionHandler;
反地理编码方法
- (void)reverseGeocodeLocation:(CLLocation *)location completionHandler:(CLGeocodeCompletionHandler)completionHandler;
当地理\反地理编码完成时,就会调用CLGeocodeCompletionHandler
typedef void (^CLGeocodeCompletionHandler)(NSArray *placemarks, NSError *error);
这个block传递2个参数
error :当编码出错时(比如编码不出具体的信息)有值
placemarks :里面装着CLPlacemark对象
CLPlacemark的字面意思是地标,封装详细的地址位置信息
@property (nonatomic, readonly) CLLocation *location;
地理位置
@property (nonatomic, readonly) CLRegion *region;
区域
@property (nonatomic, readonly) NSDictionary *addressDictionary;
详细的地址信息
@property (nonatomic, readonly) NSString *name;
地址名称
@property (nonatomic, readonly) NSString *locality;
城市