利用FME进行火星、百度坐标反算及误差分析
阅读原文时间:2021年04月21日阅读:1

作者:杨忠智

原文链接请点击

写在开篇之前…

  出来混,总是要还的!

       一直以来,通过博客、论坛来汲取各路GIS达人的知识和经验,让自己的技术能力得到了快速的提升。如今,静下心来,也想把近年来关于GIS软件使用和WebGIS开发的一些心得体会总结并分享出来,以供广大的GIS爱好者参考,避开我所走过的一些弯路。

前言

  在做WebGIS开发和数据处理过程中,经常会使用到火星坐标(GCJ02)、百度坐标(BD09)以及国际通用的地球坐标(WGS84)[1~5]。而这几种坐标之间是存在偏差的,不可避免的就需要进行不同坐标之间的相互转换:WGS84⇋GCJ02、WGS84⇋BD09、GCJ02⇋BD09。

本文把WGS84→GCJ02、WGS84→BD09、GCJ02→BD09称为正算,目前已经有公开的算法,误差也较小,不作探讨。而把GCJ02→WGS84、BD09→GCJ02、BD09→WGS84称为反算,是本文分析的主要内容。

关于火星、百度坐标反算,已知的方法有很多,如:API法[6]、查表法[7~11]、插值法[12]、配准法[13]、公式法[*]、二分法[14]等。这几种方法各有优缺点,基本上能满足一般的学习、研究以及地图数据处理和发布使用。但是,我却想是否有一种算法,能同时满足依赖性(限制)低、操作少、计算量(迭代次数)小、精度高(误差低)等条件。机缘巧合之下,在知乎上看到了Artoria2e5的回答[15],意识到这就是我想要的算法,并对其进行了验证分析。

算法思想

该算法在数值分析上叫不动点迭代法Fixed Point Iteration[19~22],思想简明,这里不多做介绍,具体可查看文后参考文献。

本文在此基础上,做了一些细微的调整,即由do-while调整为while,调整后的算法流程如下:

图1:算法流程图

其中Δr即为,θ为设定阈值,||Δr||∞为∞-范数,即

这里的∞-范数也可以用2-范数来替换,即

迭代次数和计算精度基本不变。

验证模型

  验证的基本思路是:初始坐标→坐标正算→坐标反算→计算误差(反算后坐标 — 初始坐标)。

依此,在FME上建立如下模型:

图2:验证模型图

模型中,分别对全国(以73.36° E,3.85° N为起点,0.1°为间隔),深圳(以113.766° E,22.45° N为起点,0.001°为间隔)建立网格,并取其中心点,共得全国坐标点数:306649个,深圳坐标点数:354450个。然后依次按0.01、0.001、……、0.000000001设定阈值,并计算转换前后坐标误差,最后输出统计结果。

在全国和深圳不同尺度下来验证,主要是想看看全国范围和局部地区计算结果有什么不一样。

误差分析

  以下为各项指标统计结果(各图标中的第一项为利用公式法直接反算结果):

表1:GCJ02→WGS84(全国范围)统计表

2:GCJ02→WGS84(深圳地区)统计表

3:BD09→GCJ02(全国范围)统计表

4:BD09→GCJ02(深圳地区)统计表

图3:误差精度对比图

图4:迭代次数对比图

以上几个图表可以看出,相比用公式法直接反算,①当阈值为0.01时,GCJ02→WGS84完全一样,而BD09→GCJ02精度反而有所降低;②当阈值为0.001时,GCJ02→WGS84的精度有了微小的提升,而BD09→GCJ02的精度仍低于直接反算;③当阈值≥0.0001时,精度逐渐有较大幅度的提升,迭代次数也趋于平稳,达到微米级精度所需平均迭代次数少于4次;⑤y方向收敛更快。⑥该算法用于GCJ02→WGS84比用于BD09→GCJ02收敛速度快,精度也更高。

PS:以上的误差精度,是按照1°≈110千米计算所得的。

尝试着如wuyongzheng[17、18]一样分析一下在全国范围内,x、y方向误差的分布。结果发现:①GCJ02→WGS84呈现无规律性,在中国大陆中部偏西地区x、y方向的误差较大;②而BD09→GCJ02,在x方向的误差是纬度越高,误差越大;在y方向是经度越大,纬度越高,误差越大。

图5:gcj02→wgs84 x方向误差分布图

图6:gcj02→wgs84 y方向误差分布图

图7:bd09→gcj02 x方向误差分布图

图8:bd09→gcj02 y方向误差分布图

结语

1、该算法抓住了这一特点,并巧妙的利用了不动点迭代法来进行迭代逼近,但对其他不符合该特点的正算函数并不适用。

2、 本文研究是在假设坐标正算算法无误差的前提上进行的,而实际可能并不是这样[16],因此只能保证使用同样算法进行坐标正算后的反算精度。当然,这也规避了坐标保密处理技术的相关问题。

3、关于从百度坐标反算到WGS84坐标,有两种设计思路,一种分两步进行反算,即BD09→GCJ02、GCJ02→WGS84;另外一种是把WGS84→GCJ02→BD09的正算过程组合成一个函数,再按照不动点迭代法直接进行反算。本文并没有做进一步的验证,有兴趣的朋友不妨一试。

4、该算法不受百度开发平台等 API等调用的限制、也无需进行人工配准等操作、精度也高(误差低),达到微米级精度误差的迭代次数平均不到4次(远远少于二分法,具体这里不作介绍),基本上与我的预期相符。

5、研究该算法只是为了数据能更精确的回溯,以尽量减少使用其他算法反复转换后导致的累计误差。在精度要求不高情况下,直接使用网络上流行的反算公式(公式法)即可。

参考资料

  1. 各种经纬度坐标系转换-百度坐标系、火星坐标系、国际坐标系.https://blog.csdn.net/doulejian/article/details/70155080

  2. 百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系互转.https://cnodejs.org/topic/564c0a27e4766d487f6fe38d

  3. 谈谈火星坐标与地图坐标的那点坑. https://blog.csdn.net/wu__di/article/details/52444872

  4. 为何您的坐标不准?如何纠偏?. http://www.cnblogs.com/milkmap/p/3627940.html

  5. 从零开始学高德JS API(六)——坐标转换.https://www.cnblogs.com/milkmap/p/3768379.html

  6. 百度地图开放平台Web服务API . http://lbsyun.baidu.com/index.php?title=webapi/guide/changeposition

  7. 利用地图SDK生成火星坐标纠偏数据库. https://blog.csdn.net/huzgd/article/details/8933118

  8. 构建自己的百度地图坐标纠偏数据库. https://blog.csdn.net/gatr/article/details/21520737

  9. 巧妙解决百度地图加偏纠偏问题. https://blog.csdn.net/gatr/article/details/9569189

  10. (百度、谷歌、高德等)地图经纬度gps偏移解决办法:gps纠偏数据库纠偏.http://blog.sina.com.cn/s/blog_ae91db6001014pi6.html

  11. 使用数据库实现百度地图纠偏. http://200cc.iteye.com/blog/2009492

  12. 一种根据纠偏数据对火星坐标进行完美拟合的方法.http://blog.sina.com.cn/s/blog_538036cf0100pxbl.html

  13. WGS84坐标系图层转火星坐标系.https://www.cnblogs.com/wenxiuliang/p/WGS84ToGCJ.html

  14. GPS坐标互转:WGS-84(GPS)、GCJ-02(Google地图)、BD-09(百度地图).https://www.oschina.net/code/snippet_260395_39205

  15. 如何看待「地形图非线性保密处理技术」?. https://www.zhihu.com/question/29806566

  16. Wgs84坐标系转换为gcj02坐标系及bd09坐标系的验证.http://blog.sina.com.cn/s/blog_5215e9300102wazw.html

  17. 中国地图坐标(GCJ-02)偏移算法破解小史. https://blog.genglinxiao.com/中国地图坐标偏移算法破解小史/

  18. China Map Deviation as a Regression Problem.https://wuyongzheng.wordpress.com/2010/01/22/china-map-deviation-as-a-regression-problem/

  19. Restrictions on geographic data in China. https://en.wikipedia.org/wiki/Restrictions_on_geographic_data_in_China

  20. 百度文库:4.2 Fixed-Point Iteration. https://wenku.baidu.com/view/d84d2d4f2e3f5727a5e9627b.html

  21. 不动点迭代(Fixed Point Iteration). https://blog.csdn.net/jbb0523/article/details/52459797

  22. 百度文库:不动点迭代法求解非线性方程组. https://wenku.baidu.com/view/a05134abdd3383c4bb4cd23c


本文尚有很多不足之处,欢迎批评指正!
后面会在GitHub上放出相关源码,将包括js、C#、pyFME转换器等版本。

下篇,利用FME进行瓦片地图抓取及拼接,敬请期待!

Note:本文仅供学习和研究使用,不作任何商业用途!

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章