您的位置:首页 > 其它

关于地图:CoreLocation的使用

2015-10-19 20:45 495 查看

基本概念

地图和定位功能基于两个框架:

Map Kit:用于地图展示

Core Location:用于地理定位

2个入门专业术语:

LBS Location Based Service 基于位置的服务 (查看周边)

SoLoMo: Social Local Mobil (索罗门) 社交本地移动(微信陌陌的定位)

经纬度结构体:CLLocationCoordinate2D - CLLocationCoordinate2DMake

北京约119°,40°

1经度约是111km

一般情况下模拟器没有经纬度,需要手动设置 Debug-Location-CustomLocation

获取用户的地址

从iOS6开始,获取用户的位置需要经过用户的授权。

iOS7:开发者可以在Info.plist中设置NSLocationUsageDescription说明定位的目的(Privacy - Location Usage Description)



iOS8开始,设置比较复杂,分两种情况

总是使用用户位置:NSLocationAlwaysUsageDescription

使用应用时定位:NSLocationWhenInUseDescription

iOS8获取用户位置的具体使用

导入框架

CLLocationManager *manager = [[CLLocationManager alloc] init];


获取授权

判断用户是否已经授权:只有在未请求过的状态下才需要请求。并且需要判断版本,只有iOS8以上才需要发送请求

CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
if (status == kCLAuthorizationStatusNotDetermined) {
if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0){
[manager requsetWhenInUseAuthorization];
}
// 或者可以根据方法是否有响应来判断
// if (manager respondsToSelector:@selector(requsetWhenInUseAuthorization)) {
//     [manager requsetWhenInUseAuthorization];
// }
}


仅这些还不够,还需要在info.plist里设置字段

- 注意字段找不到,需要手动复制过去。请求的是哪种状态,就添加哪个字段



但运行还是没有请求通知出来,因为manager是个局部变量,需要保存起来。换成用懒加载的方式创建manager,运行,完成。

获取定位

设置代理self.manager.delegate = self;

告诉系统,开始定位[self.manager startUpdatingLocation];

实现代理方法

// Xcode6.3.2的iPhone6模拟器有问题,不执行这个方法
- (void)locationManager:(CLLocationManager *)manager didUpdateLocation:(NSArray *)locations{}


这个代理方法会不停调用,每获得一个位置都会执行。如果是仅仅想拿到用户的位置,可以在获取到位置之后停止定位

- (void)locationManager:(CLLocationManager *)manager didUpdateLocation:(NSArray *)locations{
// 拿到用户位置对象
CLLocation *location = [locations lastObject];
// 拿到用户当前位置的经纬度
CLLocationCoordinate2D coordinate = location.coordinate;
NSLog(@"纬度 = %.2f",coordinate.latitude);
NSLog(@"经度 = %.2f",coordinate.longitude);
// 停止定位
[manager stopUpdatingLocation];
}


把获得的位置传给服务器

具体在使用中,获得用户位置信息之后,要传给服务器,然后服务器再根据你的位置信息再给你下一步响应。

CLLocation的其它属性

altitude海拔(不是很准确)

horizontalAccuracy水平精度

verticalAccuracy垂直精度

course方向(0-360°,不准)

speed速度(不准)

timestamp定位的时间

CLLocationManager的属性

desiredAccuracy 设置定位精度,可以传任意double,但一般用系统给的几个枚举,默认kCLLocationAccuracyBest,精度越高,越耗电,越占性能。默认是

比如网易新闻,只需要不精确的定位即可

导航就需要最精确的

distanceFilter 设置当用户移动多少距离的时候重新定位,可以传任意double,单位是米

- 注意,要设置重新定位说明需要不断定位,上面那个停止定位的代码要去掉。系统就会在移动你设置的距离之后重新定位

计算距离(了解,一般交给服务器)

“`

- (void)countDistance

{

// 北京:39.6 116.39

// 广州:23.08 113.15

CLLocation *location1 = [[CLLocation alloc] initWithLatitude:39.6 longitude:116.39];

CLLocation *location2 = [[CLLocation alloc] initWithLatitude:23.08 longitude:113.15];

// 计算距离
CLLocationDistance distance = [location1 distanceFromLocation:location2];
NSLog(@"%.2f", distance);


}

“`
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: