span8
span4
我有时实现一个处理应用此PythonCaller脚本框架的工作,在用分拣机结合的是各种输入由分组依据属性设有基于组的。
#假设所有的功能已经被“_group_id”预先排序。类FeatureProcessor(对象):高清__init __(个体经营):self.groupId =无self.features =功能高清输入(个体经营,功能)的[]#列表:如果ID = feature.getAttribute( '_ GROUP_ID')ID =自.groupId:self.process()self.groupId = ID#更新当前组ID。self.features = []#复位的功能列表。self.features.append(特征)DEF接近(个体):self.process()DEF处理(个体):如果不self.features:返回## TODO:过程中的基团和输出结果的功能。#
如果您需要执行真正先进的统计计算,但是,考虑学习R语言和利用RCaller。
@高石的解决方案是最有效的记忆,但是如果你需要处理功能,你不能保证他们是由一群有序的,我喜欢用默认的字典。
for循环close方法遍历每个组中,提供由该组的属性值和该组中的功能列表。
从集合进口defaultdict类FeatureProcessor(对象)进口fmeobjects:DEF __init __(个体):self.features = defaultdict(列表)DEF输入(个体,特征):编号= feature.getAttribute( '_ GROUP_ID')self.features [ID].append(功能)高清接近(个体经营):id的,featureList在self.features.items():#do什么
好吧,我明白你的意思。我更倾向于将使用的字典进行分组的功能,其中每个字典键将包含“分组依据”属性值,和值字典将包含含总组区域和功能列表的第二个字典。
如果我们有组A,B和C,在字典可能是这个样子(而不是实际的代码):
区域= { 'A':{ 'total_area':123, '功能':[, ,…]},'B':{'总面积':56,'features':[ ]},'C':{'total_area':789,'features':[ , , ...]} }
访问与组A关联的总面积和功能时,可以执行以下操作:
empty_group={total_area':0,'features':[]}my_group=areas.get('A',empty_group)#get items for group A,默认为empty dict group轵area=my轵group['total轵area']\returns 123 group轵features=my轵group['features'][, , ...]
第二行将返回组A的嵌套dict,如果组A尚未定义,则返回空的默认dict。
要更新组A,可以执行以下操作:
new_area=group_area+feature.getGeometry().getArea()#计算新的总组功能。append(feature)area['A'={total_area':new_area,'features':group_features}更新组A
需要注意的一件事是内存消耗:代码当前的构造方式有效地缓冲了所有的记忆直到工作区终止。这将成为一个问题后,一定数量(大)的功能,所有的婷婷取决于,但你可以减轻这与64位FME。我的建议也是在PythonCaller之前使用AttributeKeeper,通过删除任何不需要的属性来尽可能减小特性的大小。
我同意其他人的观点,即它更容易使用。统计计算器,如果它能做你需要的。但是,有些统计操作可能需要您自己实现,例如。使用Python。
我的建议是使用类接口,例如,下面是如何计算我的号码,然后将总数输出为总共是在最后一个单独的功能中:
类CalculateStatistics(object):def u init uu(self):35;在第一个特征进入PythonCaller self之前调用此方法一次。running total=0 def input(self,特性:每一个特征Self.RunnIng++int(Stutial.GETActEngy('MyLo.No')或0)自给.PyDead(特性)DEFCULL(自):该方法在上一个特征退出Python调用SUMyFase= FMEObjest.FMETrimule()SUMIONSTATION.SETITY(‘THI TooTyIIS’)之后调用一次。self.running_total)self.pyoutput(sum_特性)
我还建议您阅读PythonCaller的文档,其中大部分内容都有详细的说明:https://docs.亚搏在线safe.com/fme/html/fme_Desktop_Documentation/fme_Transformers/Transformers/pythoncaller.htm文件
你好@david_r,
感谢您的回复,我能够实现一个代码代码与类接口类似的描述在上面的链接链接您发送的关于pythonCaller的文档。
现在我想做点别的。
让我们看一下这个示例,其中计算了处理的所有特性的总面积,然后创建一个包含总面积的新属性。如果我想计算由一个属性处理的所有特性组的总面积,该怎么办?
导入fmeobjects类FeatureProcessor(object): def _init__(self): self。featureList = [] self。totalArea = 0.0 def input(self,feature): self.featureList.append(feature) self.totalArea += feature.getGeometry().getArea() def close(self): for feature in self.featureList: feature.setAttribute("total_area", self.totalArea) self.pyoutput(feature)
干杯
您好!@阿尔西
如果您查看自定义变压器列表StatisticCalculatorhttps://hub.亚搏在线safe.com/transformers/list统计计算器这个transformer有一个transformer PythonCaller,它使用脚本python处理列表属性中的统计信息。
你可以查一下这张便条来了解一下。
*@高石感谢这个令人惊奇和有趣的定制变压器
谢谢,
达尼洛
©2019安全亚搏在线软件公司|法律