在日常数据处理中,经常会使用到火星坐标(GCJ02)、百度坐标(BD09)以及国际通用的地球坐标(WGS84),这三者之间是存在偏差的。要进行坐标纠偏首先需要明白这几个坐标系之间的区别是什么。
众所周知,国内的数据但凡是带坐标的都是保密数据,所有的保密数据都需要经过加密转到再放到网络上,所以就有了火星坐标(GCJ02)和百度坐标(BD09)的由来。
WGS84坐标经过加密后形成了GCJ02坐标,BD09坐标又是在GCJ02的基础上,再一次经过加密后形成的。
在网络坐标转换中,我们比较关注的是WGS84和GCJ02的坐标系之间的相互转换。一般我们会将数据从WGS84转换成GCJ02叫做正算,这种加密方式目前已经有公开的算法,误差也较小,基本上可以认为其是正确的,关键是反算。可能有些人会疑惑,既然已经知道的正算的算法,为什么还求不出来反算的公式呢?
嘿,问的好,因为我也不会。我只知道,WGS84到GCJ02是一种非线型加密。每个区域的矢量都是不一样的。
目前网络上也有以公式法反算的算法,但基本上误差都是在米级的,这也基本已经满足了我们日常使用的需求。
虽然不会归不会,不过把人家优秀的开源算法拿来改吧改吧自己用,还是成的。
于是,我基于github.com/GaryLea/ChangeCoordinate的坐标纠偏算法,封装了一个自定义转换器,据博主所说,其反算的最大误差在5米左右。
之后,在网络上 https://github.com/googollee/eviltransform 找到一种精度更高的的迭代逼近法,可以通过预设误差,不断迭代计算,精度可达微米级别。
根据以上两种算法,将其封装到了FME自定义转换器中,实现了坐标点对的GCJ02、BD09、WGS84坐标的相互转换。
模版很简单,主要就是一个PythonCaller转换器。总体算法都是基于github.com/GaryLea/ChangeCoordinate写的,后来将坐标反算的算法换了一下,改成 https://github.com/googollee/eviltransform 的算法,精度更高,不过随之而来的就是转换效率的降低。
有兴趣的可以去下载源码查看一下,不过需要注意这两个算法的lng,lat分别代表的X和Y轴是相反的,我就因此被坑了好久。
代码的实现过程是很粗糙的,因为我确实不会python。具体代码也很简单我就不贴出来了,大家可以自己去将转换器下载下来看一下,基本上就是github上的用法没有改变。
而且我也很用心的写了帮助,使用注意事项都在帮助里面。
这个自定义转换器,很多想法都是参照一篇文章做的。
https://mp.weixin.qq.com/s/khqt5j8X09hfY6jutY-sEw这是真正的大佬,他的每一篇文章我都拜读过。在此博客的基础上,不断追述源头,如我这样的小白,也能对坐标纠偏有一些了解了。
最后老样子,附上转换器链接
链接:https://pan.baidu.com/s/1c_BlidUhNVkiiznYnHRtog
提取码:owhi
既然都有网络坐标纠偏了,肯定有POI数据爬取,基本思路都已经实现了,只是一直没时间写……囧