定位
LBS: location Based Service (基于定位服务)位置服务
要实现地图、导航功能,首先要熟悉定位功能,苹果提供给咱们 CoreLocation 框架进行定位CoreLocation 可以独立使用
Core Location 中主要包含了 定位、地理编码、地理反编码 功能
CoreLocation 框架中的所有数据类型都是以 CL开头
CoreLocation 这个类里面 封装了位置 和 高度信息
1,地理编码与反地理编码
(1)地理编码
地理位置(通过地理位置的字符串)得到这个指定位置的物理位置(物理位置即经纬度、海拔等)
(2)反地理编码
与地理编码相反,通过 经纬度 得到具体的字符串的位置(具体位置名,地名)
2,经纬度
本初子午线:穿过英国伦敦格林文治天文台
往东,东经(E)
往西,西经(W)
东西经各 180度,共360°
赤道:(0°纬度)
往北,北纬(N)
往南,南纬(S)
南北纬各90°,共180°
在iOS代码中使用 CoreLocationCoordinate2D来表示 经纬度
typedef struct {
CLLocationDegrees latitude;纬度
CLLocationDegrees longitude;经度
}CLLocationCoordinate2D;
3,定位
(1)使用定位之前,需要先判断用户是否打开了定位服务
locationServicesEnabled
(2)向用户说明为是什么要使用定位服务,(苹果会自动弹出一个窗口,提示用户,需要使用定位服务)
由于位置信息 是用户的隐私,需要用户去授权 ,这里系统也会自动弹出一个对话框 让用户授权
在Info.plist中设置NSLocationUsageDescription说明定位的目的(Privacy - Location Usage Description)key 值 写为什么让用户打开定位
判断用户是否开启了定位功能
在使用定位服务的时候,我们需要获取用户是否在手机里开启了定位功能
使用定位服务前,要先导入
#import <CoreLocation/CoreLocation.h>
1,用户是否打开了定位服务
BOOL isOpen = [CLLocationaManagerlocationServicesEnabled];
if (!isOpen) {
UIAlertView *alert = [[UIAlertViewalloc]initWithTitle:nilmessage:@"请在设置中打开定位服务"delegate:selfcancelButtonTitle:@"OK"otherButtonTitles:nil,nil];
[alert show];
return;
}
2,初始化定位服务的对象
manager = [[CLLocationManager alloc]init];
在info.plist里面设置 key value的时候,一定要和代理里面相对应
当使用的时候 用户允许咱们使用定位
[manager requestWhenInUseAuthorization];
// 一直使用定位功能
// [manager requestAlwaysAuthorization];
// 使用定位服务非常耗电
// 所以 当在使用完定位服务后 ,需要把定位服务关闭(节省电量)
让系统帮助管理定位的开关
manager.pausesLocationUpdatesAutomatically = YES;
//设置定位精准度,(注意越精准越耗电,这里我设置为最精确)
manager.desiredAccuracy = kCLLocationAccuracyBest;
// 设置多少米更新一次(处理设置的范围Location) 位置 Location
// distanceFilter当获取到位置 或者更新位置的时候 会调⽤用代理⽅方法
manager.distanceFilter = 500;
//当获取到位置 或者 更新新位置的时候 会调用代理方法 -(void)locationManager:(CLLocationManager *)manager
didUpdateLocations:(NSArray *)locations;
manager.delegate = self;
获取最新的位置
CLLocation *curLocation = [locations lastObject];
通过location获得到 当前位置的经纬度
CLLocationCoordinate2D curCoordinate2D = curLocation.coordinate;
获得当前的⾼高度verticalAccuracy (负数的时候 是不能获取到 海拔的精准度)
CLLocationAccuracy curAccuracy = curLocation.verticalAccuracy;
通过location 更新位置的时间 (nsdate)可以通过更新时间计算出 行驶的速度
NSDate *updateTime = curLocation.timestamp;
获得当前的行驶速度
double speed = curLocation.speed;
如果在室内可以检测到用户在几楼<8.0之后>
CLFloor *curFloor = curLocation.floor;
获得航向航向是double 类型的
// course当前设备前进的方向。该值为0°表示向北,90°表示向东,180°表示向南,270°表示向西
CLLocationDirection curDirection = curLocation.course;
// 获得当前的高度 verticalAccuracy (负数的时候是不能获取到 海拔的精准度)
CLLocationAccuracy curAccuracy = curLocation.verticalAccuracy;
获得海拔的高度
double aititude = curLocation.altitude;
开启更新定位
[manager startUpdatingLocation];
关闭定位
[manager stopUpdatingLocation];
地图
MKMapTypeStandard = 0,默认MKMapTypeSatellite,卫星MKMapTypeHybrid鸟瞰
*/
myMapView.mapType = MKMapTypeStandard;
设置是否允许⽤用户旋转地图
myMapView.rotateEnabled = YES;
设置是否允许放⼤大或者缩⼩小地图
myMapView.zoomEnabled = YES;
设置是否允许地图滚动
myMapView.scrollEnabled = YES;
设置是否有3D效果myMapView.pitchEnabled = YES;
设置是否显⽰示⽤用户的位置
使⽤用地图 需要导⼊入MapKit同样也需要 请求⽤用户授权
CoreLocation是数据类,定位信息 ,地理编码 ,翻地编码mapKit控件 显⽰示在屏幕上的视图
MK开头
地图:MKMapView
MKMapTypeStandard = 0,默认MKMapTypeSatellite,卫星MKMapTypeHybrid鸟瞰
*/
myMapView.mapType = MKMapTypeStandard;
设置是否允许⽤用户旋转地图
myMapView.rotateEnabled = YES;
设置是否允许放⼤大或者缩⼩小地图
myMapView.zoomEnabled = YES;
设置是否允许地图滚动
myMapView.scrollEnabled = YES;
设置是否有3D效果myMapView.pitchEnabled = YES;
设置是否显⽰示⽤用户的位置
myMapView.showsUserLocation = YES;
设置⽤用户 移动地图的样式
MKUserTrackingModeNone = 0,不跟踪⽤用户的轨迹
MKUserTrackingModeFollow,跟踪⽤用户轨迹 地图移动
MKUserTrackingModeFollowWithHeading,跟踪⽤用户轨迹,地图移动,并且航向也跟随变化
*/
myMapView.userTrackingMode = MKUserTrackingModeFollow;
设置是否显⽰示附近的建筑物(必须在普通样式,鸟瞰样式有效)
myMapView.showsBuildings = YES;
是否允许使⽤用兴趣点 必须在 普通样式 鸟瞰 样式 有效
/*
坐标转点
- (CGPoint)convertCoordinate:(CLLocationCoordinate2D)coordinate toPointToView:
(UIView *)view;
点转坐标
- (CLLocationCoordinate2D)convertPoint:(CGPoint)point toCoordinateFromView:(UIView
*)view;
区域范围转CGRect
- (CGRect)convertRegion:(MKCoordinateRegion)region toRectToView:(UIView *)view;CGRect转 区域范围
- (MKCoordinateRegion)convertRect:(CGRect)rect toRegionFromView:(UIView *)view;
经纬度变化的⽐比例范围
typedef struct {
CLLocationDegrees latitudeDelta;
CLLocationDegrees longitudeDelta;
} MKCoordinateSpan;
-
// 区域范围
-
// 以center为中⼼心span为⽐比例typedef struct {CLLocationCoordinate2D center;MKCoordinateSpan span;
} MKCoordinateRegion;
⾃自定义⼤大头针:
- (instancetype)initWithAnnotation:(id<MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier]; if (self) {
self.image = [UIImage imageNamed:@"{)}4%0JTT7}4720(`AFJ1HD.jpg"];
// annotation⼤大头针数据self.annotation = annotation;
// canShowCallout是否可以显⽰示 ⼤大头针上⾯面的标题 副标题 。。。
self.canShowCallout = YES;
// 设置⼤大头针上⾯面显⽰示详情的左侧视图
UIImageView *iamgeView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 100,
50)];
iamgeView.image = [UIImage imageNamed:@"BR3}A`NYWPET~UV%}~KME01.jpg"];
self.leftCalloutAccessoryView = iamgeView;
self.draggable = NO;
}
return self;