2d与2.5d坐标转换_基于FME的国内网络地图坐标互转自定义转换器介绍

计划没有变化快,原定下周写基于FME零代码热力图数据获取与展示的记录还没动笔;在将获取热力图数据进行转换需要在线调用API转换,虽然能实现坐标转换,但每天近700万条的数据(图1),近7万次的API调用,需要耗费大量的时间,如何实现离线转换迫在眉睫。

ea2813c8b82d0ec8b2526aef880217f1.png

图1 每日热力图数据量示意图

一、写在前面的啰嗦话

MYFME有“ChinaReprojector”点要数的转换器,但这需要授权,同时也无法将百度米制(墨卡托)坐标(BDMC)转成经纬度坐标【作者自行编制的“ChineseCoordReprojector”(图3),也是基于要数的坐标转换器,可以同时实现点线面转换(处理面要数时如孔洞中存在面,孔洞中的面会被消除)】;FME Hub有“CoordinateTranslate”自定义转换器,这个转换器是基于输入的经纬度数据对坐标进行转换,同样也不能将BDMC转成其他坐标(见图3,遗憾的是使用这个转换器每次都出现输入错误)。

e61b8df9305893b1d81b4ab509ed0003.png

图2 “ChinaReprojector”参数设置图

e95749c1331656fb238ef2dfcfb8c04f.png

图3 “ChineseCoordReprojector”转换器参数设置

da482234ebfe43f45fd45667eb632708.png

图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代码也可以实现,但由于其他模块已经写好就直接复用)。

e643ab0ae614d55732ad80cd0242eb9c.png

图5 自定义转换器参数设置图

此自定义非要素转换器,需要转换的文件需要具有经纬度属性,或是手动输入经纬度,如需要转换的矢量要素(点)无经纬度可先通过“CoordinateExtractor”提取。需要特别注意的是需要转换的数据如有以“lon”和“lat”命名的属性,转换后将会被删除,造成属性丢失(建议先重命名再转换)。

2、转换准确性目测

是的,你没看错,就是这么不靠谱的目测,

将获取的深圳的热点数据通过百度API接口转换成BD09II和GCJ02,与通过离线转换的结果进行对比未发现两者之间存在偏移(流弊的算法),图6为API转换的结果,图7为在线离线转换结果叠加;通过孤立的点进行放大、放大、再放大,仍无法看出存在重影。

70af7d5123873156e6f9b0a586a28585.png

图6 调用API将BDMC转BD09II

02cef2d809b038f1135417ccfa4b0c8e.png

图7 在线离线转换结果叠加(BD09II)

为了显得工作认真,分离出了一队坐标进行比较,不比不知道一比吓一跳(见图8),是的你没有看错:完全一致!那为什么能完全一致,上CSDN搜搜就知道了(被高手和谐了)。

509860b4191b2bfda096fba885a91e5d.png

图8 单点转换结果比较(BD09II)

同样为了比较在线BDMC转GCJ02与离线转换的差别(反正肉眼是看不出),也选取了一对坐标进行比较,小数点第十二位才有差异(见图9,一般只要保留小数点6位,也就是说算法结果不存在差异);那两个点具体偏移了多少,通过作为平面坐标,构线、计算长度等一系列工作得出的结果见图10。不同地区转换的精确不同,感兴趣的可以看公众号@懒人GIS(杨忠智)“【更正】利用FME进行火星、百度坐标反算及误差分析”的文章。

30407c9d1e91224f61ac95c193aaa9c1.png

图9 在线离线转换结果叠加比较(BD09II)

e5764edc9df32db17385d57aaa9797cd.png

图10 单个点转换差异分析(BDMCtoGCJ02)

这次转换的模板截图就不放出来了(主要是太丑),模板主要用了“PythonCaller”(各种坐标之间的转换),“Tester”和“TestFilter”(判断需要转换坐标的类型)三个转换器。下一步根据需求,可能将现有的要数转换器进行更新,以支持更多的坐标格式转换。

公众号后台发送ChineseCoordinateTransformer,获取本文自定义转换器下载连接。

如觉得有用,点赞点在看再走!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值