综述
Android 系统使用 GPS 和 网络定位(包括了基站信号和Wi-Fi信号)。通常来讲,GPS更精确,但是只适用于户外,同时耗电吓人,而且需要搜索卫星,因此不能及时返回定位信息。
系统定位面临的问题
会有以下原因导致定位不准:
* 多个位置来源
* GPS,基站,Wi-Fi 每一个都可以提供位置信息。决定使用哪一个,需要作出精度、返回速度和电量消耗,三者之间的权衡。
* 用户移动
* 因为用户一直在移动,因此需要考量用户每次移动时,位置信息的重新估算。
* 变化的精度
* 每一次位置信息,它的精度都是不同的。一个10秒钟前获得的位置,它的精度可能比最新一次获得的还要高(更可信)。
GPS定位原理
一个完全冷启动的GPS定位需要12分钟,热启动也需要几分钟。
GPS依赖两个因素来得到准确地位置:时间和空间。一颗GPS卫星向地球广播它的系统时间和自身精确的轨道数据(星历),他们还会广播其他卫星的近似轨道信息(历书,主要用于更快地找到其他卫星)。GPS一共有24颗卫星,这是为了保证全球任一地方任何时刻至少能看见4颗卫星,通过4个方程可以解出空间三维坐标和时间4个变量。而一颗卫星每30秒才广播一次,因此一个定位获得至少小30 * 4 = 2分钟。而要获得最精确的定位数据,则至少需要24个卫星的定位信息,一共就是12分钟。
A-GPS定位原理
A-GPS,Assisted GPS, 在原来的GPS定位上加上了辅助信息,以提高GPS定位速度(将达到秒级)。目前手机都是使用的该定位系统。
1. 设备将本身的基站地址通过网络传输到位置服务器(运营商的服务器)
2. 位置服务器根据该手机的大概位置传输与该位置相关的GPS辅助信息(包含了星历等)到手机,这样手机就不用等待卫星的广播星历了。
3. 该手机的AGPS模块根据辅助信息接收GPS原始信号。
4. 手机在接收到GPS原始信号后解调信号,算出定位。
5. 手机回传定位信息给位置服务器,以方便位置服务器更新数据用于其他定位请求。
AGPS只是提升了GPS定位的效率,但是仍然无法解决GPS定位的缺点。
GPS定位有如下缺点:
* 只适用于户外,切跟天气有关
* 定位时间长。GPS模块一般支持冷启动和热启动两种模式。一般冷启动比热启动时间要长很多,信号如果足够好,使用 SiRF III 定位芯片,热启动需要15秒以内,冷启动需要42秒以内。在信号弱的情况下,更长。而满足热启动的条件如下:
* 上次关机前的实时位置信息(经纬度、高度)已知
* 当前时间、年历、星历已知
* 距离上次关机时间不超过4小时(时间过长则星历变化)
* 特别耗电。原因是,GPS 收集定位信息时的通信信道带宽只有50 bits per second(50 bps)。搜一颗卫星需要12-30秒,GPS芯片至少需要搜出4-5颗卫星后才能给出定位信息,如果所有卫星都搜完,则需要大概12分钟。还有个更主要的原因就是,如果 GPS 处于打开状态,则手机系统不能进入睡眠模式。https://www.quora.com/Battery-Life/Why-does-GPS-use-so-much-more-battery-than-any-other-antenna-or-sensor-in-a-smartphone
* 安卓系统运行时间太长,会有一些系统因素造成的bug。
基站定位原理:
1. 利用手机附近的三个基站进行三角定位:
2. 第二种则是利用获取最近的基站信息,其中包括了基站id,location area code,mobile country code, mobile network code 和信号强度,将这些数据发送到响应服务商,在服务商的定位数据库中查询。谷歌查询地址:https://developers.google.com/maps/documentation/geolocation/intro,这些数据的主要来源:a. 主动采集,Google的街景拍摄车还有一个重要功能,就是采集沿途的无线信号,并打上通过GPS定位出的坐标回传至服务器。b. 用户提交,Android手机用户在开启 “使用无线网络定位” 时会提示是否允许Google的定位服务手机你梦地点数据
Wi-Fi定位原理:
同 “基站定位原理” 的第二点差不多,只是通过 Wi-Fi 的 MAC 地址去查询。
Wi-Fi定位比基站定位更准,原因在于基站信号覆盖范围广,数目少,而Wi-Fi信号范围只有几十米,而且热点多。但是目前随身Wi-Fi也越来愈多,因此服务器需要更好的算法来筛出无效数据。
我们为什么需要高德、谷歌等第三方位置服务
通过查看Android系统的定位api和相关文档,我们可以知道,Android系统定位提供两种 provider:GPS_PROVIDER和NETWORK_PROVIDER。GPS_PROVIDER 只使用 GPS,NETWORK_PROVIDER 只是用网络。缺点如下:
纯GPS定位十分地慢,而网络定位其实就是A-GPS,同样存在卫星信号很差的情况下,难以准确定位。
同时Android系统本身对收到的定位结果不做任何筛选和优化。
而且在实践中还发现不同手机使用的GPS芯片还不一样,导致Android定位api中的一些配置参数,芯片并不支持,因此应用层的行为变得不确定,例如即使设置了onLoacationChanged()回调频率,但是系统会忽略,回调频率依然很高。
而第三方位置服务,则通过提供位置数据库查询解决了问题1。通过本地的定位sdk中的各种融合算法解决了问题2和3。
Q: 既然谷歌定位服务那么好,为什么谷歌不把它集成到Android系统中?
A: Android系统应该是一个纯粹的系统,不应与任何服务绑定。同时集成到系统中就意味着开源,谷歌并不想开源这套定位算法。
什么是LOST定位?
LOST定位是Mapzen公司(已垮掉)开发的开源定位服务。它是完全基于Android系统定位api的,因此不存在隐私问题。源码我还没有看,但是可以确定应该就是在本地使用了一些优化策略。一些基本的策略可以在谷歌的官方定位策略指导中找到:https://developer.android.com/guide/topics/location/strategies。LOST定位无非就是策略上更优化一些。但是LOST定位并不提供服务器端的位置服务,因此准确性和快速性都无法与第三方位置服务相比。
网友评论