iOS定位,地图详解
2015-10-04 09:02
411 查看
定位
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鸟瞰
设置是否允许地图滚动
设置是否有3D效果myMapView.pitchEnabled
= YES;
设置是否显⽰示⽤用户的位置
使⽤用地图 需要导⼊入MapKit同样也需要
请求⽤用户授权
CoreLocation是数据类,定位信息 ,地理编码 ,翻地编码mapKit控件
显⽰示在屏幕上的视图
MK开头
地图:MKMapView
MKMapTypeStandard = 0,默认MKMapTypeSatellite,卫星MKMapTypeHybrid鸟瞰
设置是否允许地图滚动
设置是否有3D效果myMapView.pitchEnabled
= YES;
设置是否显⽰示⽤用户的位置
设置⽤用户 移动地图的样式
MKUserTrackingModeNone = 0,不跟踪⽤用户的轨迹
MKUserTrackingModeFollow,跟踪⽤用户轨迹 地图移动
MKUserTrackingModeFollowWithHeading,跟踪⽤用户轨迹,地图移动,并且航向也跟随变化
是否允许使⽤用兴趣点 必须在 普通样式 鸟瞰 样式 有效
/*
坐标转点
点转坐标
区域范围转CGRect
- (CGRect)convertRegion:(MKCoordinateRegion)region toRectToView:(UIView *)view;CGRect转 区域范围
经纬度变化的⽐比例范围
// 区域范围
// 以center为中⼼心span为⽐比例typedef
struct {CLLocationCoordinate2D center;MKCoordinateSpan span;
⾃自定义⼤大头针:
// annotation⼤大头针数据self.annotation
= annotation;
// canShowCallout是否可以显⽰示 ⼤大头针上⾯面的标题 副标题
。。。
self.canShowCallout = YES;
// 设置⼤大头针上⾯面显⽰示详情的左侧视图
UIImageView *iamgeView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 100,
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;
相关文章推荐
- 用CocoaPods做iOS程序的依赖管理
- iOS模拟器把键盘叫回去
- IOS开发-属性动画和关键帧动画的使用
- IOS开发-属性动画和关键帧动画的使用
- iOS 检测有没有安装其它应用 和ios9下要注意的地方
- 定制iOS 7中的导航栏和状态栏
- 封装button
- ios软件开发 解决删除cell视图遮挡删除按钮的问题
- iOS开发多线程篇—线程安全
- iOS多线程学习
- IOS项目中常见的文件
- IOS中获取各种文件的目录路径的方法
- iOS的文件分类、存放路径及文件属性
- ios发电子邮件
- 用KVO监听实现collectionView滚动一致,完整项目movie
- iOS分辨率的那些事儿 ---旧工程里使用,现在被自动布局取代了
- iOS基础-播放暂停按钮
- IOS 获取系统图库与打开拍照
- IOS 系统常用功能
- iOS8数字键盘加左下角完成button