关于地图: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);
}
“`
相关文章推荐
- 一个不错的涉及基础比较多的博客
- 数组的一些基本知识
- java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
- QML范例详解
- Hibernate中inverse的用法
- struts2环境搭建和第一个程序
- First Scrum Meeting (2015/10/18)
- mysql 优化:使用show status查看MySQL服务器状态信息
- js解析XMl文件,兼容IE、Firefox、谷歌
- Android之开发者应该收藏的优秀博客和技术网站
- NOI2008 志愿者招募
- 刚把ios 环境做好 截个图庆祝一下
- template模板
- 日常总结(三)火狐控制台使用技巧
- UI23_基类
- 【Java基础】继承的一些总结
- Chapter5-标准I/O库(下)-「APUE读书笔记」
- 特征向量的几何含义
- python 判断学期与学年
- JSONP的原理