做了公交查询才发现,想定位准确,怎么这么难?

2018-12-14 21:33:15 +08:00
 quietjosen

最近做了公交查询的小程序,不同城市的朋友有反馈定位有偏移。研究了一下才发现,想定位准确,真不是件容易的事。

本来 GPS 就有精度问题,祖国要求初步加密,各家又二次加密;安全性没怎么提高,倒是给做产品的找了不少麻烦,哎。

8807 次点击
所在节点    程序员
44 条回复
feverzsj
2018-12-14 21:36:42 +08:00
用天地图,没有加密的
misaka19000
2018-12-14 21:38:45 +08:00
做一下经纬度修正不就行了
yingfengi
2018-12-14 22:34:02 +08:00
各家地图有纠偏参数吧。
zwh2698
2018-12-14 22:49:31 +08:00
来,我给你科普一下,你要去搜索一个叫火星坐标的。了解一下。 那种地图都有真实,GPS 的修正方法,我们首先假定你获取的 gps 是真实的,那么点在地图那个位置,这个不同的地图不同的修正方法,因为国家加了一次,厂商又加一次,例如百度。
zwh2698
2018-12-14 22:52:39 +08:00
修正国家的,有差值的,有模拟拟合公式的,因为地图是按照分区投影的,每个区是不同的随机偏移。反正不买地图的,都能弄出自己的方式。
580a388da131
2018-12-14 22:58:27 +08:00
我怎么感觉是你考虑的太多了?
opengps
2018-12-15 00:22:36 +08:00
用谷歌地图国内版都需要纠偏你知道不
weipt
2018-12-15 00:41:59 +08:00
你说的问题不确切。GPS 定位还是比较精确的(室外),但是要把他显示到地图上就有问题,不是不能获取准确的坐标,而是国际要求加密,故意做了偏移(前面有人说了,业内戏称为“火星坐标”),不是线性的,如果你用地图文件配上 gps 坐标是没问题的,但是如果要用目前市面的 web 地图,就需要用各个厂家自带的换算函数来算。
annoy1309
2018-12-15 01:03:24 +08:00
中国法规要求地图提供商使用一种称为 GCJ-02 的坐标系统。百度地图另外使用一种 BD-09 坐标系,似乎也是基于 GCJ-02。
GCJ-02 (官方称地形图非线性保密处理算法,俗称火星坐标系、国测局坐标)是一种基于 WGS-84 制定的大地测量系统 ,由中国国家测绘地理信息局制定,此坐标系所采用的混淆算法会在经纬度中加入看似随机的偏移,号称可以促进国家安全。

使用 GCJ-02 记录下的地点在 GCJ-02 的地图中会显示在正确的位置,然而换成 WGS-84 的地图或地点记录就可能造成 100 - 700 米不等的偏移。据测量,Google.com 的地图与真实坐标相差约 50 - 500 米

虽然 GCJ-02 坐标系统本身保密,但是目前已有 C#、C、Go、Java、等多种语言的开源转换实现。这些实现似乎都基于某份泄露出的 WGS 到 GCJ 加偏代码实现。根据泄露代码注释,GCJ-02 在加偏时使用的是 SK-42 参考系统的椭球体参数。这些参数用于计算一根经 /纬线上一度的弧长,由此将之前算出的偏移从米数转换为度数,与输入值相加。

BD-09 是百度地图使用的地理坐标系,其在 GCJ-02 上多增加了一次变换,号称“有助保护用户隐私”。百度提供从 WGS 和 GCJ 坐标系转换到 BD-09 坐标系的 API。和 GCJ-02 的情况类似,虽然没有反向转换的官方 API,但却存在 R 等多种语言写成的开源版本。

数学上,BD-09 变换将 GCJ 坐标当作直角坐标转成极坐标后加噪音,在变回直角坐标之后再加入一个度数恒定的偏移量。

由于 GCJ-02 大量使用正弦函数制造高频噪音,形成了一个超越方程,导致基本不可能获得解析解。不过由于 GCJ 加偏前后的坐标相差并不太大,且其单调性和局部线性特性也较好,大部分开源实现都通过类似这样的算法实现反向纠偏:
also24
2018-12-15 01:17:51 +08:00
好奇楼上上来就说火星坐标的朋友,你们是否有仔细看楼主的帖


楼主明明是知道 “火星坐标” 这件事儿的,让楼主难受的是:每一次 “加解密”,都在丢失精度。

按道理来说,地图坐标虽然改来改去,但是大体上是三种:
(引用自 https://tool.lu/coordinate/
WGS84 坐标系 地球坐标系,国际通用坐标系
GCJ02 坐标系 火星坐标系,WGS84 坐标系加密后的坐标系; Google 国内地图、高德、QQ 地图 使用
BD09 坐标系 百度坐标系,GCJ02 坐标系加密后的坐标系

但是你们注意楼主贴的图里,给出的居然是五套不同的坐标。
这里的 “谷歌地图” “腾讯高德” “图吧地图” 按道理来说,应该使用的都是 GCJ02 火星坐标才对,然而他们的火星居然还不是同一个火星。(根据谷歌地球坐标不一致可以推断此处谷歌地图为国内版)
这就给楼主带来了一些困扰,即使想尽办法,都使用火星坐标,也无法确保位置都精确性,给楼主做地图相关的产品带来了很大困扰。


BTW:楼主使用的查询页面是这个:
http://www.gpsspg.com/maps.htm
also24
2018-12-15 01:48:32 +08:00
忘了正题了,这里实际牵扯到的问题,印象中之前看到过文章是这样讲的(来源已经记不清了,不确保细节正确):

GCJ02 的加解密资质和相关设备,是需要相关资质、需要花钱买的,而且买回来就是个整体,对外黑箱状态,你输入进去参数,它输出结果给你,还限制频次和使用规模,完全就是一个贼难用的东西。

这么难用,实际中真正完全使用它的人就很少了,即使自身有资质的大厂,用着也觉得难受啊。
那大家都怎么用呢?用破解版呗~~
没错,就是游戏玩家喜闻乐见的买了正版以后下盗版玩儿的状态~~

于是各家就根据自己的手头数据,搞起了逼近算法,网络上也开始出现了各种公式和 API 服务,但是别忘了,这些都是 “盗版” 啊,都是 “逼近” 啊,也就是说,都不精确啊。

而如果你作为 APP,取到了地球坐标,那更闹心了,因为加密也是 “逼近” 公式啊,于是乎,一个坐标,从取出来,到被展示在地图上,经历了 N 次 “逼近”,总算是偏离了原始坐标了。

获取坐标 --(转成火星)--> 发给地图 SDK --(转回地球)--> 展示在地图
地球坐标 1 --(逼近算法 A)--> 火星坐标 2 --(逼近算法 B)--> 地球坐标 3

注意,A B 都是猜的逼近算法,并不配套,这样一来一回,坐标已经偏了不少了。
于是,一万种逼近算法,就产生了一万个火星,和一万种火星坐标~~
SNOOPY963
2018-12-15 03:15:34 +08:00
来啊,在杭州敢不敢约饭!
coolmenu
2018-12-15 08:12:42 +08:00
能不能搞个加权平均
hem
2018-12-15 08:50:53 +08:00
所以我一直有一个疑问,公交车提示“车辆转弯,请站稳扶好”是根据车辆位置发出来的提示还是根据司机操作发出来的提示? GPS 应该做不到这个精确程度吧
imnpc
2018-12-15 09:05:16 +08:00
@hem 公交车司机手动按的 有一些功能按钮 例如提醒保管好自己的随身物品 就说明司机发现惯偷上车了
wql
2018-12-15 09:08:51 +08:00
@hem 有的确实是定位,按键还是留着的。
jdgui
2018-12-15 09:11:14 +08:00
@hem 高德这些很精确的啊。开车导航转弯什么的
maemolee
2018-12-15 09:11:56 +08:00
定位之后找到离用户最近的几个公交站,弹窗让用户手动选一下(不仅显示该公交站是什么,还要显示该公交站的下一站,因为两个站名可以确定一个站)。

watzds
2018-12-15 09:17:11 +08:00
杭州实时公交,这个 App 不错啊
况且需要这么准吗?
Eugene1024
2018-12-15 09:20:26 +08:00
有什么难,滴滴都可以实现,我们这个十八线小城市公交查询都实现了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/517697

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX