V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
quietjosen
V2EX  ›  程序员

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

  •  3
     
  •   quietjosen ·
    atjason · 2018-12-14 21:33:15 +08:00 · 8990 次点击
    这是一个创建于 2170 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    第 1 条附言  ·  2018-12-15 09:23:02 +08:00
    习惯成自然。「貌似」自己有解决办法、成了专业人士后,就觉得这是自然的、正常的、没什么的。门外汉反而会觉得奇葩。
    44 条回复    2018-12-16 15:33:10 +08:00
    feverzsj
        1
    feverzsj  
       2018-12-14 21:36:42 +08:00   ❤️ 1
    用天地图,没有加密的
    misaka19000
        2
    misaka19000  
       2018-12-14 21:38:45 +08:00 via Android
    做一下经纬度修正不就行了
    yingfengi
        3
    yingfengi  
       2018-12-14 22:34:02 +08:00 via Android
    各家地图有纠偏参数吧。
    zwh2698
        4
    zwh2698  
       2018-12-14 22:49:31 +08:00 via Android
    来,我给你科普一下,你要去搜索一个叫火星坐标的。了解一下。 那种地图都有真实,GPS 的修正方法,我们首先假定你获取的 gps 是真实的,那么点在地图那个位置,这个不同的地图不同的修正方法,因为国家加了一次,厂商又加一次,例如百度。
    zwh2698
        5
    zwh2698  
       2018-12-14 22:52:39 +08:00 via Android   ❤️ 1
    修正国家的,有差值的,有模拟拟合公式的,因为地图是按照分区投影的,每个区是不同的随机偏移。反正不买地图的,都能弄出自己的方式。
    580a388da131
        6
    580a388da131  
       2018-12-14 22:58:27 +08:00
    我怎么感觉是你考虑的太多了?
    opengps
        7
    opengps  
       2018-12-15 00:22:36 +08:00 via Android
    用谷歌地图国内版都需要纠偏你知道不
    weipt
        8
    weipt  
       2018-12-15 00:41:59 +08:00
    你说的问题不确切。GPS 定位还是比较精确的(室外),但是要把他显示到地图上就有问题,不是不能获取准确的坐标,而是国际要求加密,故意做了偏移(前面有人说了,业内戏称为“火星坐标”),不是线性的,如果你用地图文件配上 gps 坐标是没问题的,但是如果要用目前市面的 web 地图,就需要用各个厂家自带的换算函数来算。
    annoy1309
        9
    annoy1309  
       2018-12-15 01:03:24 +08:00   ❤️ 7
    中国法规要求地图提供商使用一种称为 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
        10
    also24  
       2018-12-15 01:17:51 +08:00   ❤️ 4
    好奇楼上上来就说火星坐标的朋友,你们是否有仔细看楼主的帖


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

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

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


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

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

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

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

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

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

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

    watzds
        19
    watzds  
       2018-12-15 09:17:11 +08:00 via Android
    杭州实时公交,这个 App 不错啊
    况且需要这么准吗?
    Eugene1024
        20
    Eugene1024  
       2018-12-15 09:20:26 +08:00
    有什么难,滴滴都可以实现,我们这个十八线小城市公交查询都实现了
    quietjosen
        21
    quietjosen  
    OP
       2018-12-15 09:23:22 +08:00
    @580a388da131 @watzds 用户查看附近站点时,显示的是附近偏远的站点,这就是不得不考虑的了。
    quietjosen
        22
    quietjosen  
    OP
       2018-12-15 09:23:34 +08:00
    @SNOOPY963 哈哈,刚离开,未来几个月都不在杭州;回去约吧。
    quietjosen
        23
    quietjosen  
    OP
       2018-12-15 09:24:16 +08:00
    @hem 你幽默了,肯定是司机按按钮啊。也许有技术能实现,但肯定不止 gps,还有加速度计之类的。
    quietjosen
        24
    quietjosen  
    OP
       2018-12-15 09:24:31 +08:00   ❤️ 2
    @maemolee 任何让用户多一步的操作,我都是深恶痛绝的。
    tygm
        25
    tygm  
       2018-12-15 09:34:34 +08:00 via Android
    @zwh2698 好像就百度加了,腾讯高德都直接用的郭嘉加密后的?
    tygm
        26
    tygm  
       2018-12-15 09:41:33 +08:00 via Android
    @quietjosen 很多时候站在这样的角度做东西都难以得到客户的理解😓
    quietjosen
        27
    quietjosen  
    OP
       2018-12-15 09:54:05 +08:00
    @tygm 庆幸我现在为「用户」服务,不是「客户」
    wleexi
        28
    wleexi  
       2018-12-15 10:05:43 +08:00
    @SNOOPY963 闻到了交易的味道
    jijifly
        29
    jijifly  
       2018-12-15 11:43:20 +08:00
    好奇如何解决定位漂移的问题,之前做项目也遇到过,一直没解决。如果楼主有方案,可否指导下~
    quietjosen
        30
    quietjosen  
    OP
       2018-12-15 12:20:22 +08:00
    @jijifly 你看我像是已经找到方案的人吗?😂
    deef
        31
    deef  
       2018-12-15 12:39:57 +08:00
    @hem 比如很多城市都在用的海信的报站机是可以设定即将转弯的那个点的位置,然后播报的。帝都旧版天路报站机全部是手动操作的。
    isCyan
        32
    isCyan  
       2018-12-15 12:43:24 +08:00
    让用户多一步操作,甚至是多说一句话,也比对着犯傻的机器好
    lynan
        33
    lynan  
       2018-12-15 15:54:10 +08:00
    掌上公交不准吗,我觉得挺好用的呀
    icaca
        34
    icaca  
       2018-12-15 16:15:15 +08:00
    楼主才入行 大家不要怪他
    wtdd
        35
    wtdd  
       2018-12-15 16:46:17 +08:00
    好奇国外怎么解决的,只有中国怕泄密么?
    FaiChou
        36
    FaiChou  
       2018-12-15 18:56:48 +08:00 via iPhone
    @maemolee 青岛人
    iAcn
        37
    iAcn  
       2018-12-15 19:17:22 +08:00 via Android
    请问楼主是如何拿到的公交 GPS 信息?我之前拿过济南公交的实时数据,被他们的外包公司警告了,他们好像挺在意这个的,提醒楼主小心。
    quietjosen
        38
    quietjosen  
    OP
       2018-12-15 21:46:26 +08:00
    @iAcn 另个帖子里说了,这里不重复了,怕被警告 😂
    maemolee
        39
    maemolee  
       2018-12-15 22:10:00 +08:00
    @FaiChou 你也是?🤝
    Telegram
        40
    Telegram  
       2018-12-15 22:22:38 +08:00   ❤️ 1
    @hem #14 作为一个原来在公交公司负责采集站点 GPS 数据的人,我告诉你,因为线路是固定的,所以,车辆到了哪个点,接下来就要转弯了,都是事先把踩好坐标点的,都存在报站器的 GPS 坐标文件里。

    当然,车上也有手动按钮,驾驶员可以自己按一下,比如提醒别人让座,提醒乘客保管好财务
    FaiChou
        41
    FaiChou  
       2018-12-15 22:40:19 +08:00
    @maemolee 嗯, 在麦岛住(租)过一段时间
    quietjosen
        42
    quietjosen  
    OP
       2018-12-15 23:11:30 +08:00
    @Telegram 专业,涨姿势了。
    iAcn
        43
    iAcn  
       2018-12-16 15:32:43 +08:00 via Android
    @Telegram 对,有的司机可能赶时间的,会把报站器往后调一站😂
    iAcn
        44
    iAcn  
       2018-12-16 15:33:10 +08:00 via Android
    这样就不会有超速提示了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1030 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 19:36 · PVG 03:36 · LAX 11:36 · JFK 14:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.