斯潘8
斯潘4
我有时会使用这个pythoncaller脚本框架来实现基于组的处理,与按属性分组的输入特征排序器一起使用。
#假设所有功能都已预先按“_group_id”排序。class featureprocessor(object):def_u init_uuuu(self):self.group id=none self.features=[]功能列表def input(self,feature):id=feature.getattribute(“u group_id”)if id!=self.group id:self.process()self.group id=id更新当前组ID。self.features=[]重置功能列表。self.features.append(feature)def close(self):self.process()def process(self):如果不是self.features:return todo:处理组中的功能并输出结果。γ
如果您需要执行真正的高级统计计算,然而,考虑学习R语言并利用RCaller。
高桥的解决方案是最高效的内存,但如果您需要处理不能保证按组排序的功能,我喜欢使用默认的dict。
循环的close方法在每个组上迭代,提供group by的属性值和该组中的功能列表。
import fmeobjectsFrom collections import defaultdictclass featureprocessor(object):def_u init_uuuu(self):self.features=defaultdict(list)def input(self,feature):id=feature.getattribute(''u group_id')self.features[id].append(feature)def close(self):for id,featureList in self.features.items():做任何事
好啊,我明白你的意思。我的偏好是使用一个dict来分组你的特性,其中每个dict键将包含“group by”属性值,dict值将包含第二个dict,其中包含总组区域和功能列表。
如果我们有A组,B和C,dict可能看起来像这样(不是实际的代码):
区域='A':'total_area':123,“特征”:, ,……}“B”:“总面积”:56,“特征”: }“C”:“总面积”:789,“特征”: , ,…} }
访问与A组关联的总面积和特征时,你可以做到:
空的_group='总_区域':0,'功能':[]我的_group=areas.get('a',空_group)35;获取组A的项目,默认为空dictgroup_area=my_group['total_area']35;返回123group_features=my_group['features']返回[, ,……
第二行将返回组A的嵌套dict,如果尚未定义组A,则为空的默认dict。
要更新A组,你可以做到:
new_area=group_area+feature.getgeometry().getarea()35;计算new total group_features.append(feature)areas['a']=total_area':new_area,“功能”:组更新组A
需要注意的一件事是内存消耗:当前构建代码的方式有效地缓冲了记忆中所有的节日直到工作区终止。在某些(大量的ISH)特性之后,这将成为一个问题,一切都取决于,但是你可以通过64位的FME来缓解这个问题。我的建议也是在你的pythoncaller之前使用一个attributekeeper,通过删除任何不需要的属性尽可能地减小特性的大小。
我同意其他人的观点,即更容易使用,例如统计量计算器,如果它可以做你需要的。但是,您可能需要自己执行一些统计操作,例如使用Python。
我的建议是使用类接口,例如,下面介绍如何计算迈尔数,然后将总数输出为第三个是在末尾的单独功能中:
类calculateStatistics(object):def uu init uuuuu(self):在第一个功能进入pythoncaller self之前调用此方法一次。running total=0 def input(self,feature):对每个feature self.running_total+=int(feature.getattribute('my_number')或0)self.pyoutput(feature)def close(self):在最后一个feature退出pythoncaller sum_feature=fmeobjects.fmefeature()sum_feature.setattribute('u total_',self.running_total)self.pyoutput(sum_功能)
我还建议您阅读一下关于蟒蛇的文档,其中大部分都详细解释了:https://docs.亚搏在线safe.com/fme/html/fme_桌面文件/fme_变压器/transformers/pythoncaller.htm
你好@戴维德,
谢谢你的回复,我能够使用类接口实现一个代码,类似于您在上面发送的关于pythoncaller文档的链接链接上描述的代码。
现在我想做点别的。
让我们来看一个例子,在这个例子中,计算所有处理的特征的总面积,然后创建一个包含总面积的新属性。如果我想按属性计算所有已处理功能的总面积,该怎么办?
导入fmeobjectsClass FeatureProcessor(对象):def u init_uuuu(self):self.featureList=[]self.totalArea=0.0def输入(self,feature):self.featureList.append(feature)self.totalArea+=feature.getGeometry().getArea()def close(self):用于self.featureList中的功能:feature.setAttribute(“total_area”,self.totalarea)self.pyoutput(功能)
干杯
您好!阿瑟
如果您查看自定义Transformer ListStatisticCalculatorhttps://hub.亚搏在线safe.com/transformers/liststatisticscalculator这个转换器有一个转换器pythoncaller,它使用脚本python处理列表属性中的统计信息。
你可以查一下这个守财奴的主意。
*高桥感谢您为我们定制的变压器。
谢谢,
达尼洛
?2019安全亚搏在线软件公司|合法的