刚接触定位功能的时候,我一直有个非常朴素的认知:
手机定位 = GPS。
直到后来做顺风车、地理围栏、门店推荐这些业务,我才发现这个理解只对了一半。
甚至很多时候,GPS根本没有参与定位。
那次事故让我开始怀疑GPS
事情发生在一个很普通的需求上。
产品希望用户打开小程序后,自动显示:
您当前距离XX门店 300 米
逻辑并不复杂:
获取坐标 → 计算距离 → 返回最近门店。
上线第一周,就收到用户反馈:
我明明站在门店门口,为什么推荐的是另一家店?
最开始我怀疑算法。
然后怀疑坐标转换。
最后把用户的原始定位日志拉出来看。
发现用户定位精度显示:
accuracy: 860m
860米。
这已经不是误差了。
这属于猜。
后来进一步排查发现:
用户当时在地下停车场。
而地下停车场最大的特点就是:
GPS基本失效。
GPS其实很脆弱
很多人以为GPS是万能的。
实际上它工作条件非常苛刻。
GPS本质上是在接收天上的卫星信号。
手机需要同时收到多颗卫星的数据,才能计算自己的位置。
所以:
- 室外开阔地 → 精度通常5~10米
- 高楼林立的街道 → 精度20~50米
- 商场内部 → 精度100~500米
- 地下停车场 → 基本失效
这也是为什么很多导航软件进入地下车库之后会突然漂移。
不是软件坏了。
而是GPS信号真的进不来。
那手机为什么还能知道你在哪?
这是我后来研究位置服务时最惊讶的一件事。
因为手机定位其实是一套融合系统。
GPS只是其中一个数据源。
现代手机真正使用的是:
第一层:GPS
最准确。
但也是最脆弱的。
有遮挡就容易失效。
第二层:基站定位
你的手机永远在和附近基站通信。
运营商天然知道:
你当前连接的是哪些基站。
以及这些基站的大概位置。
通过多个基站的信号强度和覆盖范围,可以反推出一个大概位置。
精度通常几十米到几百米。
地下停车场里,大多数手机其实就是靠它在工作。
第三层:WiFi定位
很多人不知道。
你家路由器的位置,很可能早就被记录进数据库了。
当手机扫描到附近WiFi时:
WiFi A WiFi B WiFi C
定位系统会发现:
这些WiFi过去经常一起出现。
并且对应某个固定区域。
于是即使没有GPS,也能大概知道手机在哪里。
很多商场里的定位,本质上依赖的就是WiFi指纹库。
第四层:蓝牙定位
商场导航经常会用到。
停车场找车也会用到。
蓝牙信标覆盖后,精度甚至可以进入10米以内。
很多室内导航方案其实都在使用这种技术。
真正工作的,是融合定位
后来我才意识到一个问题:
开发者拿到的只是一个经纬度。
但这个经纬度背后,可能经历了非常复杂的计算。
比如:
- GPS坐标
- 基站信息
- WiFi列表
- 传感器数据
- 历史轨迹
全部融合之后,才得到最终结果。
很多地图厂商对外暴露的只是:
latitude longitude
但内部已经跑完了一整套定位引擎。
为什么同一个地方,不同APP定位结果不一样?
这个问题以前也困扰过我。
后来才明白。
因为不同平台拥有的数据资产完全不同。
有的平台:
- WiFi数据库更大
有的平台:
- 基站样本更多
有的平台:
- 融合算法更激进
所以即使站在同一个地方:
高德、百度、腾讯、苹果地图
得到的位置也可能不同。
做位置业务之后,我们开始关注另一件事
以前接地图SDK。
只关注地图展示。
后来发现:
真正消耗调用量的根本不是地图。
而是各种位置数据服务。
比如:
- 地理编码
- 逆地理编码
- 坐标转换
- IP定位
- 行政区划查询
- WiFi定位
- 融合定位
这些能力很多业务都需要。
但未必需要完整地图SDK。
后来我们把这部分能力单独拆出来。
测试过几家位置服务方案之后,最终接入了迈云LTS的位置数据服务。
原因很简单:
我们要的是位置能力,不是地图页面。
对于顺风车、门店推荐、围栏触发这类业务来说,稳定的数据接口反而更重要。
最后
现在如果有人问我:
手机是怎么知道你在哪里的?
我不会再回答:
靠GPS。
更准确的答案应该是:
GPS只是参与者之一。
真正让定位工作起来的,是背后那套融合了卫星、基站、WiFi、蓝牙和海量历史数据的位置服务系统。
而大多数时候,我们看到的那个蓝点,只是最终结果而已。
评论区聊聊:
你第一次发现GPS并不是万能的时候,是在什么场景?