上节说明了如何在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(二)获取经纬度、速度、方向,进行区域监听的更多相关文章

  1. 第十六届“二十一世纪的计算”学术研讨会 密西根州立大学教授Anil K. Jain主题演讲

    Biometrics---How Do I Know Who You Are? 密西根州立大学教授Anil K. Jain主题演讲" title="第十六届"二十一世纪的 ...

  2. “全栈2019”Java第七十六章:静态、非静态内部类访问权限

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  3. 第十六届“二十一世纪的计算”学术研讨会 牛津大学肿瘤成像学教授Michael Brady主题演讲

    Computing and Healthcare 牛津大学肿瘤成像学教授Michael Brady主题演讲" title="第十六届"二十一世纪的计算"学术研讨 ...

  4. 《手把手教你》系列基础篇(七十六)-java+ selenium自动化测试-框架设计基础-TestNG实现DDT - 下篇(详解教程)

    1.简介 今天这一篇宏哥主要是结合实际工作中将遇到的测试场景和前边两篇学习的知识结合起来给大家讲解和分享一下,希望以后大家在以后遇到其他的测试场景也可以将自己的所学的知识应用到测试场景中. 2.测试场 ...

  5. 第三百七十六节,Django+Xadmin打造上线标准的在线教育平台—创建用户操作app,在models.py文件生成5张表,用户咨询表、课程评论表、用户收藏表、用户消息表、用户学习表

    第三百七十六节,Django+Xadmin打造上线标准的在线教育平台—创建用户操作app,在models.py文件生成5张表,用户咨询表.课程评论表.用户收藏表.用户消息表.用户学习表 创建名称为ap ...

  6. 第十六届“二十一世纪的计算”学术研讨会 图灵奖获得者Butler W. Lampson主题演讲

    Personal Control of Digital Data 图灵奖获得者Butler W. Lampson主题演讲" title="第十六届"二十一世纪的计算&qu ...

  7. 【iOS】7.4 定位服务->2.1.3.3 定位 - 官方框架CoreLocation 功能3:区域监听

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  8. salesforce零基础学习(七十六)顺序栈的实现以及应用

    数据结构中,针对线性表包含两种结构,一种是顺序线性表,一种是链表.顺序线性表适用于查询,时间复杂度为O(1),增删的时间复杂度为O(n).链表适用于增删,时间复杂度为O(1),查询的时间复杂度为O(n ...

  9. Android项目实战(五十六):获取WebView加载的url的请求错误码

    例如需求,我有一个WebView 加载一个url, 该url对应的网页本身自带下拉刷新 ,但是网页本身会有出现400 500 等异常请求错误码 这时候网页加载失败,页面本身的下拉是无法使用的,要求重新 ...

随机推荐

  1. TensorFlow-Bitcoin-Robot:一个基于 TensorFlow LSTM 模型的 Bitcoin 价格预测机器人

    简介 TensorFlow-Bitcoin-Robot:一个基于 TensorFlow LSTM 模型的 Bitcoin 价格预测机器人. 文章包括一下几个部分: 1.为什么要尝试做这个项目? 2.为 ...

  2. python3全栈开发-并发编程的多进程理论

    一. 什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行): duoduo在一个时间段内有很多任务要做:python备课的任务,写 ...

  3. C语言关闭日志文件时忘了将日志文件全局变量指针置为NULL

    C语言写了一个write_log函数以写日志,写了一个close_log_file函数以关闭日志,声明了一个日志文件全局变量文件指针plogFile. write_log中首先判断plogFile是否 ...

  4. seaborn使用(绘图函数)

    seaborn使用(绘图函数) 数据集分布的可视化 分类数据的绘图 线性关系可视化 一.数据集分布的可视化 distplot kdeplot rugplot 1.distplot() 灵活的绘制单变量 ...

  5. 全新 Kali Linux 系统安装指南

    Kali Linux 系统可以说是在安全测试方面最好的开箱即用的 Linux 发行版.Kali 下的很多工具软件都可以安装在大多数的 Linux 发行版中,Offensive Security 团队在 ...

  6. Docker其它安全特性

    除了能力机制之外,还可以利用一些现有的安全机制来增强使用 Docker 的安全性,例如 TOMOYO, AppArmor, SELinux, GRSEC 等. Docker 当前默认只启用了能力机制. ...

  7. Java课程设计常见技术问题(程序部署、数据库、JSP)

    1. 部署方法 Eclipse下打包 右键点击项目-Export-Runnable JAR file,选择正确的Launch configuration,接下来根据提示可以将项目中用到的jar打入包中 ...

  8. javaweb异常提示信息统一处理(使用springmvc,附源码)

    一.前言 后台出现异常如何友好而又高效地回显到前端呢?直接将一堆的错误信息抛给用户界面,显然不合适. 先不考虑代码实现,我们希望是这样的: (1)如果是页面跳转的请求,出现异常了,我们希望跳转到一个异 ...

  9. Android源码浅析(五)——关于定制系统,如何给你的Android应用系统签名

    Android源码浅析(五)--关于定制系统,如何给你的Android应用系统签名 今天来点简单的我相信很多定制系统的同学都会有一些特定功能的需求,比如 修改系统时间 静默安装 执行某shell命令 ...

  10. springMVC源码分析--异常处理机制HandlerExceptionResolver执行原理(二)

    上一篇博客springMVC源码分析--异常处理机制HandlerExceptionResolver简单示例(一)中我们简单地实现了一个异常处理实例,接下来我们要介绍一下HandlerExceptio ...