计划没有变化快,原定下周写基于FME零代码热力图数据获取与展示的记录还没动笔;在将获取热力图数据进行转换需要在线调用API转换,虽然能实现坐标转换,但每天近700万条的数据(图1),近7万次的API调用,需要耗费大量的时间,如何实现离线转换迫在眉睫。
图1 每日热力图数据量示意图
一、写在前面的啰嗦话
MYFME有“ChinaReprojector”点要数的转换器,但这需要授权,同时也无法将百度米制(墨卡托)坐标(BDMC)转成经纬度坐标【作者自行编制的“ChineseCoordReprojector”(图3),也是基于要数的坐标转换器,可以同时实现点线面转换(处理面要数时如孔洞中存在面,孔洞中的面会被消除)】;FME Hub有“CoordinateTranslate”自定义转换器,这个转换器是基于输入的经纬度数据对坐标进行转换,同样也不能将BDMC转成其他坐标(见图3,遗憾的是使用这个转换器每次都出现输入错误)。
图2 “ChinaReprojector”参数设置图
图3 “ChineseCoordReprojector”转换器参数设置
图4 “CoordinateTranslate”参数设置图
除了调用百度API实现BDMC转经纬度坐标,网络上有大量关于网络地图坐标系转换(纠偏)的算法(如:https://blog.csdn.net/sinat_34149445/article/details/100081478;https://blog.csdn.net/zr527397749/article/details/84841356),但都需要使用编程;虽然,“ChineseCoordReprojector”也用到了python,但那只是在他人(非常抱歉,忘了拷贝哪位大神的成果)编好的“PythonCaller”进行少量的修改(本人不会Python,更不会编程)。
今年年初公众号@平直杂货铺发了个GitHub(https://github.com/GaryLea/ChangeCoordinate)可以实现国内网络地图纠偏的代码,希望我在FME中实现BDMC转经纬度坐标,但由于不会编程,几经尝试未能成功,遂放弃。由于这段时间在获取热力图数据,需要对大量BDMC坐标进行转换,除了采用调用API转换外,还尝试了控制点纠偏(“AffineWarper”)但总是相差数十米的距离。昨晨(2020年7月18日)再做尝试,但还是未能成功;就上网搜索,搜到了@点点儿博客园上“【备忘】使用FME PythonCaller的基本代码结构”的文章,这篇文章非常短,但看完后恍然大悟,然后就有了这篇记录及文后分享的自定义转换器;本人开始用FME获取网络数据也是看了@点点儿博客园上“FME中通过HTMLExtractor向HTML要数据”这篇文章。
二、自定义转换器介绍
1、参数介绍及注意事项
自定义转换器基于FME2018.1进行编制,命名为“ChineseCoordinateTransformer2018.1”(名称够长了吧),可以实现8种坐标互转,遗憾的是没能实现经纬度坐标转百度墨卡托坐标(这个可以通过前文介绍的自定义转换器在线实现);“BDMCtoBD09”“GCJ02toBD09”复用(其实就是拷贝)了GaryLea的代码(https://github.com/ /ChangeCoordinate),其余的采用了记不清明的大神的代码(GaryLea代码也可以实现,但由于其他模块已经写好就直接复用)。
图5 自定义转换器参数设置图
此自定义非要素转换器,需要转换的文件需要具有经纬度属性,或是手动输入经纬度,如需要转换的矢量要素(点)无经纬度可先通过“CoordinateExtractor”提取。需要特别注意的是需要转换的数据如有以“lon”和“lat”命名的属性,转换后将会被删除,造成属性丢失(建议先重命名再转换)。
2、转换准确性目测
是的,你没看错,就是这么不靠谱的目测,
将获取的深圳的热点数据通过百度API接口转换成BD09II和GCJ02,与通过离线转换的结果进行对比未发现两者之间存在偏移(流弊的算法),图6为API转换的结果,图7为在线离线转换结果叠加;通过孤立的点进行放大、放大、再放大,仍无法看出存在重影。
图6 调用API将BDMC转BD09II
图7 在线离线转换结果叠加(BD09II)
为了显得工作认真,分离出了一队坐标进行比较,不比不知道一比吓一跳(见图8),是的你没有看错:完全一致!那为什么能完全一致,上CSDN搜搜就知道了(被高手和谐了)。
图8 单点转换结果比较(BD09II)
同样为了比较在线BDMC转GCJ02与离线转换的差别(反正肉眼是看不出),也选取了一对坐标进行比较,小数点第十二位才有差异(见图9,一般只要保留小数点6位,也就是说算法结果不存在差异);那两个点具体偏移了多少,通过作为平面坐标,构线、计算长度等一系列工作得出的结果见图10。不同地区转换的精确不同,感兴趣的可以看公众号@懒人GIS(杨忠智)“【更正】利用FME进行火星、百度坐标反算及误差分析”的文章。
图9 在线离线转换结果叠加比较(BD09II)
图10 单个点转换差异分析(BDMCtoGCJ02)
这次转换的模板截图就不放出来了(主要是太丑),模板主要用了“PythonCaller”(各种坐标之间的转换),“Tester”和“TestFilter”(判断需要转换坐标的类型)三个转换器。下一步根据需求,可能将现有的要数转换器进行更新,以支持更多的坐标格式转换。
公众号后台发送ChineseCoordinateTransformer,获取本文自定义转换器下载连接。
如觉得有用,点赞点在看再走!