(七十六)CoreLocation(二)获取经纬度、速度、方向,进行区域监听
上节说明了如何在iOS7和iOS8上完成授权,并且开始获取位置,这一节介绍获取位置信息的方法。
【定位精度】
定位精度有多种选择:根据字面意思即可理解
extern const CLLocationAccuracy kCLLocationAccuracyBestForNavigation;
extern const CLLocationAccuracy kCLLocationAccuracyBest;
extern const CLLocationAccuracy kCLLocationAccuracyNearestTenMeters;
extern const CLLocationAccuracy kCLLocationAccuracyHundredMeters;
extern const CLLocationAccuracy kCLLocationAccuracyKilometer;
extern const CLLocationAccuracy kCLLocationAccuracyThreeKilometers;
进行设置:
self.manager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
【经纬度、速度、时间】
上节说到了更新位置的代理方法,这个方法传入了位置管理者自己和一个位置数组:
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
}
数组中放的每一个元素都是一个CLLocation对象,为了得到最新的位置,我们应当获取数组的最后一个元素。
CLLocation主要包含了经纬度、海拔、速度、时间等信息。
CLLocation中的经纬度存储在CLLocationCoordinate2D结构体中,其中latitude为纬度,北纬用正数表示,南纬用负数表示,范围是+90~-90,longitude为经度,范围是0~360。
CLLocation中的海拔、速度等都是double类型,但为了统一期间苹果公司通过typedef命名为CLLocationDistance、CLLocationSpeed等。
CLLocation中的时间使用NSDate,一般是用来计算时间差用的,NSDate中提供了方法timeIntervalSinceDate:能够方便的计算两个时间的差,用于计算平均速度等。
我们在得到了经纬度后,常常要计算它与某个点的距离,这时候只需要使用distanceFromLocation:方法即可得到两个CLLocationCoordinate2D点之间的距离。
下面以计算平均速度为例,说明各个属性的应用,其中self.previousLocation是为了存储上一次位置而定义的CLLocation成员变量,self.sumDistance和self.sumTime分别是CLLocationDistance和NSTimerInterval成员变量,用于存储走过的总距离和经过的总时间,用于计算平均速度。
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
CLLocation *nowLocation = [locations lastObject];
// 导航,利用timestamp和coordinate属性
if (self.previousLocation != nil) {
CLLocationDistance distance = [nowLocation distanceFromLocation:self.previousLocation];
NSTimeInterval time = [nowLocation.timestamp timeIntervalSinceDate:self.previousLocation.timestamp];
self.sumDistance += distance;
self.sumTime += time;
CGFloat speed = _sumDistance / _sumTime;
NSLog(@"dis=%fm dtime=%fs AVGSeed=%fm/s",distance,time,speed);
}
self.previousLocation = nowLocation;
}
Tip:为了模拟位置的改变,我们使用模拟器Debug菜单中的Location来模拟,最后三项分别是用来仿真骑行、跑步、驾车状态的。
【获取方向】
单单获取方向并不会触犯什么用户隐私,因此不需要授权,直接调用startUpdatingHeading方法开始获取方向,然后实现代理方法:CLHeading中的magneticHeading属性代表当前方向与磁场北极之间的夹角,顺时针为正向。
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading{
NSLog(@"设备与磁场北所对应的方向%f",newHeading.magneticHeading);
}
Tip:这个必须在真机上才能调试。
【区域监听】
所谓区域监听,就是划定一定的经纬度区域,当用户进入和离开区域时,调用两个代理方法来通知。
要进行区域监听,是需要获取用户授权的,和上一篇介绍的授权一致。
一般是指定一个圆形区域进行监听,传入圆心(CLLocationCoordinate2D结构体)和区域半径(CLLocationDistance,实质是double),还可以指定一个标志,用来区分不同区域:
CLLocationCoordinate2D center = CLLocationCoordinate2DMake(37, 122);
CLCircularRegion *circle = [[CLCircularRegion alloc] initWithCenter:center radius:10000 identifier:@"hitwh"];
[self.manager startMonitoringForRegion:circle];
代理方法:
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region{
NSLog(@"in");
}
- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region{
NSLog(@"out");
}
Tip:要知道现在的经纬度,可以借助百度地图的地图API,进入百度地图后右上侧菜单中有地图API选项,进入的页面下部有坐标拾取工具,方便获取每个地点的经纬度。
(七十六)CoreLocation(二)获取经纬度、速度、方向,进行区域监听的更多相关文章
- 第十六届“二十一世纪的计算”学术研讨会 密西根州立大学教授Anil K. Jain主题演讲
Biometrics---How Do I Know Who You Are? 密西根州立大学教授Anil K. Jain主题演讲" title="第十六届"二十一世纪的 ...
- “全栈2019”Java第七十六章:静态、非静态内部类访问权限
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 第十六届“二十一世纪的计算”学术研讨会 牛津大学肿瘤成像学教授Michael Brady主题演讲
Computing and Healthcare 牛津大学肿瘤成像学教授Michael Brady主题演讲" title="第十六届"二十一世纪的计算"学术研讨 ...
- 《手把手教你》系列基础篇(七十六)-java+ selenium自动化测试-框架设计基础-TestNG实现DDT - 下篇(详解教程)
1.简介 今天这一篇宏哥主要是结合实际工作中将遇到的测试场景和前边两篇学习的知识结合起来给大家讲解和分享一下,希望以后大家在以后遇到其他的测试场景也可以将自己的所学的知识应用到测试场景中. 2.测试场 ...
- 第三百七十六节,Django+Xadmin打造上线标准的在线教育平台—创建用户操作app,在models.py文件生成5张表,用户咨询表、课程评论表、用户收藏表、用户消息表、用户学习表
第三百七十六节,Django+Xadmin打造上线标准的在线教育平台—创建用户操作app,在models.py文件生成5张表,用户咨询表.课程评论表.用户收藏表.用户消息表.用户学习表 创建名称为ap ...
- 第十六届“二十一世纪的计算”学术研讨会 图灵奖获得者Butler W. Lampson主题演讲
Personal Control of Digital Data 图灵奖获得者Butler W. Lampson主题演讲" title="第十六届"二十一世纪的计算&qu ...
- 【iOS】7.4 定位服务->2.1.3.3 定位 - 官方框架CoreLocation 功能3:区域监听
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...
- salesforce零基础学习(七十六)顺序栈的实现以及应用
数据结构中,针对线性表包含两种结构,一种是顺序线性表,一种是链表.顺序线性表适用于查询,时间复杂度为O(1),增删的时间复杂度为O(n).链表适用于增删,时间复杂度为O(1),查询的时间复杂度为O(n ...
- Android项目实战(五十六):获取WebView加载的url的请求错误码
例如需求,我有一个WebView 加载一个url, 该url对应的网页本身自带下拉刷新 ,但是网页本身会有出现400 500 等异常请求错误码 这时候网页加载失败,页面本身的下拉是无法使用的,要求重新 ...
随机推荐
- python安装pip以及导入第三方包
python有着强大的第三方库,数量很多且功能强大. 最原始的办法是在官网上下载压缩包,解压,然后运行setup.py来进行安装. 显然这种方法很繁琐,不方便.因此有了包管理工具. pip是一个包管理 ...
- Linux必备操作vim
vim被称作为编辑器之神,那么在我们操作linux系统时,进行编辑操作有没有感觉心有余而力不足?今天我讲自己总结的一些vim的操作命令和大家进行一下分享,有不足之处还请指出. vim的三种模式大家还记 ...
- FastDFS+Nginx安装配置
下载相关包: libevent-2.0.22-stable.tar.gz => https://github.com/libevent/libevent/releases/download/re ...
- ajaxStart()和ajaxStop()
Jquery中当一个Ajax请求启动时,并且没有其他未完成的Ajax请求时,将调用ajaxStart()方法.同样,ajaxStop()方法则是在所有Ajax请求都完成时调用.这些方法的参数都是一个函 ...
- C# 制作屏保(图片位置随机变化)
最近无所事事,闲着无聊,在网上翻看资料时碰巧看到了屏保制作,根据大神的思路也理解到屏保也不是很难.因此根据我自己的理解,动手谢了一个屏保. 首先,打开VS2010创建一个Windows窗体应用程序,名 ...
- CODEVS3269混合背包+二进制优化
codevs 3296 http://codevs.cn/problem/3269/ 题目描述 Description 背包体积为V ,给出N个物品,每个物品占用体积为Vi,价值为Wi,每个物品要么至 ...
- jQuery 效果 – 隐藏和显示
在 jQuery 中可以使用 hide() 和 show() 方法来隐藏和显示 HTML 元素,以及使用 toggle() 方法能够切换 hide() 和 show() 方法. 隐藏.显示.切换,滑动 ...
- 多线程(四) 实现线程范围内模块之间共享数据及线程间数据独立(Map集合)
多个线程访问共享对象和数据的方式 1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 2.如果每个线程执行的代码 ...
- Twitter 架构优化之路--Twitter是如何做到每秒处理3000张图片的
如今,Twitter每秒可以创建并保存3000张(20GB)的图片.2015年,Twitter甚至从对媒体存储策略的优化中节省出了600万美元. 但并非一开始就是这样的,2012年Twitter还主要 ...
- Kafka系列之-Kafka监控工具KafkaOffsetMonitor配置及使用
KafkaOffsetMonitor是一个可以用于监控Kafka的Topic及Consumer消费状况的工具,其配置和使用特别的方便.源项目Github地址为:https://github.com/q ...