作者:慧慧2502916487 | 来源:互联网 | 2023-08-25 18:22
前言
在做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],意识到这就是我想要的算法,本文暂称之为迭代逼近法,并对其进行了验证分析。
算法思想
该算法思想简明,巧妙的运用了向量代数、极限以及范数等数学概念。转换为数学表达语言:
本文在此基础上,做了一些细微的调整,调整后的算法流程如下:
图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方向误差的分布。结果发现:①GJC02→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、研究该算法只是为了数据能更精确的回溯,以尽量减少使用其他算法反复转换后导致的累计误差。在精度要求不高情况下,直接使用网络上流行的反算公式(公式法)即可。
参考资料
-
各种经纬度坐标系转换-百度坐标系、火星坐标系、国际坐标系.https://blog.csdn.net/doulejian/article/details/70155080
-
百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系互转.https://cnodejs.org/topic/564c0a27e4766d487f6fe38d
-
谈谈火星坐标与地图坐标的那点坑. https://blog.csdn.net/wu__di/article/details/52444872
-
为何您的坐标不准?如何纠偏?. http://www.cnblogs.com/milkmap/p/3627940.html
-
从零开始学高德JS API(六)——坐标转换.https://www.cnblogs.com/milkmap/p/3768379.html
-
百度地图开放平台Web服务API . http://lbsyun.baidu.com/index.php?title=webapi/guide/changeposition
-
利用地图SDK生成火星坐标纠偏数据库. https://blog.csdn.net/huzgd/article/details/8933118
-
构建自己的百度地图坐标纠偏数据库. https://blog.csdn.net/gatr/article/details/21520737
-
巧妙解决百度地图加偏纠偏问题. https://blog.csdn.net/gatr/article/details/9569189
-
(百度、谷歌、高德等)地图经纬度gps偏移解决办法:gps纠偏数据库纠偏.http://blog.sina.com.cn/s/blog_ae91db6001014pi6.html
-
使用数据库实现百度地图纠偏. http://200cc.iteye.com/blog/2009492
-
一种根据纠偏数据对火星坐标进行完美拟合的方法.http://blog.sina.com.cn/s/blog_538036cf0100pxbl.html
-
WGS84坐标系图层转火星坐标系.https://www.cnblogs.com/wenxiuliang/p/WGS84ToGCJ.html
-
GPS坐标互转:WGS-84(GPS)、GCJ-02(Google地图)、BD-09(百度地图).https://www.oschina.net/code/snippet_260395_39205
-
如何看待「地形图非线性保密处理技术」?. https://www.zhihu.com/question/29806566
-
Wgs84坐标系转换为gcj02坐标系及bd09坐标系的验证.http://blog.sina.com.cn/s/blog_5215e9300102wazw.html
-
中国地图坐标(GCJ-02)偏移算法破解小史. https://blog.genglinxiao.com/中国地图坐标偏移算法破解小史/
-
China Map Deviation as a Regression Problem.https://wuyongzheng.wordpress.com/2010/01/22/china-map-deviation-as-a-regression-problem/