免费视频|新人指南|投诉删帖|广告合作|地信网APP下载

查看: 2132|回复: 9
收起左侧

在FME中使用arcpy而不生成中间数据——利用WKT

  [复制链接]

665

主题

2万

铜板

34

好友

传奇会员

Rank: 30Rank: 30Rank: 30Rank: 30Rank: 30Rank: 30Rank: 30Rank: 30

积分
20649

精华勋章爱心勋章地信专家组贡献勋章冰雪节勋章

发表于 2021-2-23 15:41 | 显示全部楼层 |阅读模式

作者:THF

在日常工作中,总免不了对数据进行进行空间上的叠加分析,裁剪等各种数据操作。但是由于arcgis和FME的不同,一味地使用FME,会带来很多意想不到的结果。

个人感觉,如果只是单纯的裁剪数据,而不进行数据分析的话,不建议用FME,这并不是FME的最佳使用方式。

在FME中调用arcpy进行数据处理,这可能是很多朋友们都做过的事情。在此之前的处理流程里,想要调用arcpy解决问题,我们可能需要先将前面的处理流程结果写出到gis数据中。然后调用arcpy,生成另一个GIS数据,再将数据读取到FME中。

至少我之前就是这样处理的,整个处理流程就像下图一样:

这还没有算上临时数据写入的步骤,要想调用一次arcpy,都需要非常多的转换器,看起来异常臃肿,一点也不优雅。

那么问题来了?有没有一种方法,直接可以直接在FME中像使用转换器一样调用arcpy,然后直接生成结果,就能免除了一读一写的功夫。

利用GeometryExtractor和GeometryReplacer地组合,将GIS数据转成WKT格式,将几何以WKT的形式存储在FME中,然后利用PythonCaller去调用arcpy里面的方法进行数据处理,最终将生成的结果,也存储为WKT格式输出到FME中,然后再将其替换为几何。不就可以了吗?

查看改良后流程,一共就五个转换器,比之前的实现流程可简洁不少。而且可以在FME处理流程中的任何一个节点进行操作,不需要额外地读写。

整个思路已经比较明确了,模板的实现也很随意:

一、将数据转换成WKT数据

就是利用GeometryExtractor,提取转换成为WKT字符串,然后ListBuilder组合成数组,没什么可讲的。

这一步需要注意一点的是,在arcgis中,面要素是由节点按顺时针方向组成外边界,环岛的内边界按照逆时针排序的。但如果我们直接在arcgis里使用字段计算器计算的WKT,却是逆时针排序的。

所以,如果不调整节点的方向,当下一步在转换过程中,由WKT再转成polygon时,polygon的面积为负的情况。

因此,在转换WKT之前,我们需要利用Orientor调整面要素的节点方向为逆时针方向。

然后将将需要处理的数据组合成一个列表。



二、调用PythonCaller进行空间分析

具体代码如下:

整个流程就是:

先提取数据WKT数据,然后利用arcpy.FromWKT(),将转换成为几何对象;利用arcpy.Geometry()方法,将几何对象去作为arcpy的参数参与运算;最后再用GeometryReplacer将WKT形式地运算结果替换回来即可。

这个方法可以在FME处理流程中的任意位置,数据利用arcpy进行处理,处理后的结果同时也返回在FME中,可以向使用普通的转换器一样使用它,而不需要再单独读写中间临时数据。

需要注意的是,一由于中间的处理流程,丢失了数据的属性,最终的计算结果,并没有保留下来属性,和直接用诸如AreaOnAreaOverlayer此类的转换器还是有区别的;二是,由于转WKT的格式限制,弧会被打散成折线,椭圆会被打散成多边形(虽然在这一过程中会自动进行节点增密),但还是不可避免地造成精度的损失。

受以上两个因素的影响,能够真正运用到实际处理过程中的应用情景,还是很小。也比不上FME自带的转换器方便。不过在小规模数据,精度要求不高的场景下,还是比较方便的。

本文转载来自CSDN作者:fmechina  版权归作者所有


头像被屏蔽

141

主题

980万

铜板

3万

好友

管理员

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

积分
627184
发表于 2021-2-24 09:02 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

10

主题

2万

铜板

34

好友

黄金会员

Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23

积分
4394

精华勋章灌水勋章活跃勋章贡献勋章

发表于 2021-2-24 18:36 | 显示全部楼层
谢谢分享
回复

使用道具 举报

0

主题

3万

铜板

10

好友

钻石会员

Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26

积分
6105
发表于 2021-12-6 14:39 | 显示全部楼层
谢谢分享
回复

使用道具 举报

1

主题

1万

铜板

2

好友

黄金会员

Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23

积分
5179
发表于 2022-12-31 17:30 | 显示全部楼层
感谢分享
回复

使用道具 举报

2

主题

1万

铜板

7

好友

钻石会员

Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26

积分
6401
发表于 2023-1-6 15:45 | 显示全部楼层
没事来逛逛
回复 支持 反对

使用道具 举报

33

主题

4万

铜板

19

好友

钻石会员

Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26

积分
10843

活跃勋章

发表于 2023-1-30 12:52 手机频道 | 显示全部楼层
谢谢分享
回复

使用道具 举报

33

主题

4万

铜板

19

好友

钻石会员

Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26

积分
10843

活跃勋章

发表于 2023-1-30 12:53 手机频道 | 显示全部楼层
学习了。
回复

使用道具 举报

0

主题

1万

铜板

1

好友

高级工程师

Rank: 9Rank: 9Rank: 9

积分
840
发表于 2024-3-19 19:22 | 显示全部楼层
感谢分享
回复

使用道具 举报

2

主题

4万

铜板

7

好友

钻石会员

Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26

积分
6445
发表于 2024-7-17 12:08 | 显示全部楼层
感谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
快速回复 返回顶部 返回列表