使用FME和python两种循环方式在数组处理中的对比
写博客之前
在上一次博客更新完我就看到了别人写的博客,和我的博客一对比,我不禁感觉惭愧,太伤自尊了,我这写的是什么辣鸡。原本我想马上删掉的,后来想一想,放在那吧,给自己留一个警示。
在上次的博客里,我在某些自己也不清楚的地方含糊其辞,以期望能够逃避过去,这样写基础教程的做法简直是在害人。
我得承认,我确实不懂Python,我写的东西甚至连脚本都算不上,只不过在处理数组上用Python确实要方便很多,所以我用了,我写的东西也绝对到不了教大家怎么写Python的底部,只不过是FME处理数组的一些小技巧而已。
场景假设
首先,先假设有这样一个应用场景,我们有一个规划地块面,地块面内有对应的新增控规和老控规的设施点位。
我要进行控规的设施点位更新,将新的控规的点位全部都保留,但是如果有存在老控规里面的点位,在新控规里没有,也必须保留下来。
怎么去找新控规里没有。老控规里存在的点位呢?用数组是一个非常方便的方法。
比较简单的思路就是:
根据空间关系,将新老控规分别以数组的形式存在对应的地块面内。新控规为alist,老控规为blist。然后遍历一blist查询alist中是否存在blist的元素,如果存在,则不进行处理。如果不存在,则输出该元素。
由于本次主要讲解的是对数组的处理,模版内我省略了其他的操作,提供给大家的数据也仅仅是一个FFS格式的数组。(FFS是FME的中间格式,可以很好的兼容FME进行数据操作,如果你在一个很大的模版上进行调试,每次运行都得花半天时间,也可以将其调试前的数据保存成FFS格式的数据,这样可以节省很多时间。)
后数组的样式如下:

FME实现数组遍历方法
创建一个自定义转换器,名称为“seachDifPoint”。
在自定义转换器内,定义三个临时变量分别预设lista的长度a_index和listb的长度b_index,设置当前循环的次数test_count,test_count预设为0.

然后开始循环

先经过Tester转换器,判断当前循环次数是否小于“b_index”,如果是,则进入循环,如果不是,则跳出循环,输出数据。
如果小于“b_index”,则经过ListSearcher转换器,查询lista是否存在与“blist{@Value(test_count)}.公建类型”一致的要素,如果没有,则将当前blist{@Value(test_count)}.公建类型所对应的要素存储在“outFeatures”属性中,用逗号“,”隔开,如果不是,则不进行操作。
ListSearcher转换器参数设置如下:

创建“outFeatures”属性转换器参数设置如下:

最后无论是不是,判断完成后,都需要将当前循环的test_count加一,然后进入下一循环,
依次类推即可。
循环完成后,所有的我们需要的要素都存在一个属性中,这并不符合我的要求,还得再用AttributeSplitter将其分割成数组。

好了,完整的利用FME对数组进行处理就已经完成了。下面让我们用python试一下:
用PythonCaller实现思路
基本代码如下所示:
import fme
import fmeobjects
# Template Function interface:
# When using this function, make sure its name is set as the value of
# the 'Class or Function to Process Features' transformer parameter
def processFeature(feature):
pass
# Template Class Interface:
# When using this class, make sure its name is set as the value of
# the 'Class or Function to Process Features' transformer parameter
class FeatureProcessor(object):
def __init__(self):
pass
def input(self,feature):
lista = feature.getAttribute('alist{}.subclass')
listb = feature.getAttribute('blist{}.公建类型')
listbNum = feature.getAttribute('blist{}.bid')
difList = []
print(lista,listb,listbNum)
for i in range(len(listb)):
if listb[i] not in lista:
print(listb[i])
difList.append(str(listbNum[i]))
feature.setAttribute('difList',difList)
self.pyoutput(feature)
def close(self):
pass
最后在PythonCaller暴露数组要素

这是一个极其常规的处理数组时用到的for循环的例子,代码也是极其粗陋的。
不过当我用FME实现的时候,虽然也能够做到,其过程就不是那么的简洁,有很多不需要的浪费,我得先将所有的属性拼接成一个字符串,然后再分割成一个数组,当数组足够长,数据足够多的情况下,FME会让你知道什么是龟速。
所以某些时候数组上的处理,用PythonCaller还是很有必要的。
最后插入模版链接
链接:https://pan.baidu.com/s/1U9paibd8nm0lnJ0eG3icUQ
提取码:pnqe
本文对比了使用FME和Python处理数组的效率和便捷性。通过具体案例,展示了如何在FME中创建自定义转换器实现数组遍历,以及PythonCaller中使用for循环处理数组的具体代码。实验证明,Python在数组处理上更胜一筹。

2002

被折叠的 条评论
为什么被折叠?



