作者: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 版权归作者所有
|