iOS 关于定位你该注意的那些事
其实,对于苹果用户而言,定位的方案只有一种,那就苹果自己的定位服务CoreLocation,因为苹果定位不允许接入第三方,百度地图和高德地图只是对苹果定位服务的二次封装,方便我们使用。
1.定位方式和定位原理
移动端定位就是三种:基站定位、WiFi定位、GPS定位。其实无论哪种定位,都是根据已知点位置信息来定位当前位置,原理都是一样的,只是精度、定位速度和耗电的差别。第一代iPhone只支持基站定位,从iPhone3G开始支持GPS定位,准确点说是AGPS,是GPS的加强版。
基站定位的特点就是速度快,误差太大了,在几百米到几公里之间。如果手机没连WiFi,初次定位返回的位置信息基本上都是基站定位。因为每个基站都有唯一标识符,苹果手机可以收集到附近所有基站和他们的标识符,把这些信息传给苹果云端服务器,返回给手机,所以这种定位方式需要网络。另外苹果针对这个做了优化,苹果手机提前将一些重要的基站信息存储在本地,以便支持无网定位,当然精度肯定不能保证了,完全看你所在的区域苹果是否存储基站了。虽然这个很方便,但是对我们这个项目就很坑了。我们的App需要室内的定位精度非常高,使用联通、电信卡的用户有些时候信号不好(是信号不好,不是没有),苹果自动执行无网定位,定位出来的坐标误差特别大, 能达到一两公里,而且我们还没有办法自己改变定位方式,这就比较坑了。
WiFi定位和基站定位原理是相同的,苹果手机可以获得周围路由器或者AP的Mac地址,然后去苹果的后台根据Mac地址查询路由器或者AP信息,通过计算得出当前位置,返回给用户,这说明了你的路由器或者AP的信息是存储在苹果后台的,他们每天都收集这些信息。这个最早是由Skyhook公司发明的,一开始苹果也用他们的服务,后来开始自己干了。WiFi定位速度很快,耗电介于基站定位和GPS之前,定位几十米,很靠谱。而且苹果做了优化,等你连了一个WiFi热点之后,苹果会把周围的热点信息都下载下来,至于下载热点的范围就看你周围热点密集度了,如果在市内也就下载一条街的,去热点不密集的地方,范围就会大一点。这有什么用?用处大了。只要用户打开WiFi,即使不连,也会提高定位精度,但是这有一个前提,就是用户的手机在附近上过网,手机里已经存储了周围WiFi的信息。
GPS定位是苹果最后支持的,定位精度肯定是最高了,我自己测试了一下应该在5米以内,但是耗时最长,耗电最厉害,需要联网,需要在室外。苹果是先利用WiFi定位或者基站定位得出一个大概位置信息,上传苹果服务器,苹果服务器获根据这个位置反馈给手机周围卫星的信息,手机在算出自己的位置。这是苹果的优化,如果不是这样,就需要手机自己去扫描分析周围卫星信息了,可能需要10几分钟,现在只要1-2秒了。
2.高德地图的多次定位
即使执行了停止定位的方法:
- (void)stopUpdatingLocation;
高德地图仍然会继续定位,一般会定位4次。他先给返回一个大致的位置,之后再进行校正,所以后面返回的坐标精度比前面的高。如果你只想让他定位一次,可以自己做一个标记,定位过了就不要走代理方法。
- (void)amapLocationManager:(AMapLocationManager *)manager didUpdateLocation:(CLLocation *)location {
if (_isFirst) {
return;
}
_isFirst = YES;
[self.locationManager stopUpdatingLocation];
}
如果需要很高的精度就不需要管它,只需执行停止定位的方法,让高德地图进行反复校验。这四次定位时间间隔很短,就是瞬间的事情。说瞬间有点不专业了,小伙伴们可以自己去测一下,我只能保证没超过1分钟。
[CLLocationManager locationServicesEnabled]
注意:这个方法是用来判断用户是否打开了导航,或者导航否可用,检测的是硬件信息。iOS调用系统功能之前,例如照相、录音等,都会检测一下硬件信息,是否这个功能可用。
3.地图定位的原理
地图定位其实就是三边测量定位,已知三个点的坐标,和未知点到这三个点的距离,求未知点的坐标。下面的图片引用自Trilateration三边测量定位算法。
已知(x1,y1),(x2,y2),(x3,y3),和三个圆的半径,求(x0,y0)。但实际情况是三个圆往往不能相交于一个点,因为三个圆的半径有误差,所以最后得到的是一个圆,而不是点,那个圆的半径其实就是精度。为了增加精度,也就是缩小圆的半径,我们需要更多的已知点和未知点到已知点的距离,来相互校验。天上的导航卫星就是已知点,GPS有21颗,备用三颗。
现在科技非常发达, GPS精度非常高,军用GPS精度都在1m以内,,据说是0.3m,真是太恐怖了。不过室内定位的精度就一般了,现在很多项目都是受限于室内定位精度不准而发展缓慢。
iOS 关于定位你该注意的那些事的更多相关文章
- iOS地图 -- 定位初使用
iOS的定位服务用到的框架是#import <CoreLocation/CoreLocation.h> 定位中用到的类是CLLocationManager 一.iOS8.0之前的定位 向用 ...
- iOS后台定位实现
iOS后台定位实现 (2013-01-24 16:43:12) 工作中碰到一个定位的应用场景:app需要在后台运行,实时上传用户地理位置. 苹果对iOS的规范性在提升了app的品质的同时也 ...
- iOS 后台定位被拒注意事项
iOS 后台定位被拒的原因很简单就是没有达到苹果对后台定位的要求. 本地要求: 1.在plist文件中添加字段 "Privacy - Location Always Usage Descri ...
- iOS开发笔记15:地图坐标转换那些事、block引用循环/weak–strong dance、UICollectionviewLayout及瀑布流、图层混合
1.地图坐标转换那些事 (1)投影坐标系与地理坐标系 地理坐标系使用三维球面来定义地球上的位置,单位即经纬度.但经纬度无法精确测量距离戒面积,也难以在平面地图戒计算机屏幕上显示数据.通过投影的方式可以 ...
- 聊聊iOS中网络编程长连接的那些事
1.长连接在iOS开发中的应用 常见的短连接应用场景:一般的App的网络请求都是基于Http1.0进行的,使用的是NSURLConnection.NSURLSession或者是AFNetworking ...
- iOS 地图定位及大头针的基本使用
地图 Part1 - 定位及大头针的基本使用 一.MapKit 作用 : 用于地图展示 如大头针,路线,覆盖层展示等(着重界面展示) 使用步骤 导入头文件 #import <MapKit/Map ...
- 简易的IOS位置定位服务
有时一些小的需求,其实只是需要得知当前IOS APP使用的地点,有些只是想精确到城市级别,并不需要任何地图. 有了以下的简易实现: @interface MainViewController ()&l ...
- ios 客户端定位的3种方法
1.客户端通过IP地址定位 http://int.dpool.sina.com.cn/iplookup/iplookup.php 输出:城市 1 -1 -1 中国 广东 深圳 2.客户端获取经纬度,调 ...
- iOS后台定位,实时向服务器发送最新位置
第一步,开启后台模式,选中定位,选择project --> capabilities-->Backgorund Modes --> Location updates 如图: Past ...
随机推荐
- Sass使用小技巧
1.任何可以用作css属性值的赋值都可以用作sass变量值.如果变量值与属性不匹配,sass会当作普通字符串来处理. $family: "microsoft yahei", Ari ...
- Vue.js组件之同级之间的通信
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- JS入门(五)
前面提了很多JS的基础知识,像一些基本输出语句啊,JS中的关键字呐.然后是JS中的一些循环,数组之类的,在之后就是函数了.这些都是在JS中很基础的一些东西,在我刚开始学JS的时候,这些我就觉得很简单, ...
- [HDUOJ1312]Red And Black (经典的DFS)
Hot~~招聘——亚信科技,巴卡斯(杭州),壹晨仟阳(杭州),英雄互娱(杭州) (包括2016级新生)除了校赛,还有什么途径可以申请加入ACM校队? Red and Black Time Limit: ...
- Java Web(十四) 编写MyBookStore项目的总结
这几天一直没有发博文,原因是在写一个书城的小项目,作为web学习的最后沉淀,接下来就要到框架的学习了. --WH 一.项目介绍 从网上找的一个培训机构的小项目,名称叫做 书城购物网站 吧,其中就是分前 ...
- Dollar Dayz poj3181
http://poj.org/problem?id=3181 这个题目一开始就能看出来是个dp问题,但是我并没有一开始就看出来是一个完全背包为题,只是想着根据以前的方法,这个问题应该是可以找到规律的, ...
- JS停止事件冒泡
..停止事件冒泡 JavaScript代码 //如果提供了事件对象,则这是一个非IE浏览器 if ( e && e.stopPropagation ) //因此它支持W3C的stopP ...
- 【SF】开源的.NET CORE 基础管理系统 - 安装篇
[SF]开源的.NET CORE 基础管理系统 -系列导航 1.开发必备工具 IDE:VS2017 运行环境:netcoreapp1.1 数据库:SQL Server 2012+ 2.获取最新源代码 ...
- JVM中堆内存和栈内存的区别
Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间 ...
- Android中的ScrollTo和ScrollBy解析
关于Android中的ScrollBy和ScrollTo方法相信大家并不陌生,这两个方法是在View中实现的.所以在各个继承了View的类都可以使用改方法. 在View中对这两个方法的源码编写是这样的 ...