“python调用者内部统计信息”的注释和答案 https://knowledge.亚搏在线safe.com/questions/82491/statistics-inside-a-python-caller.html “python调用者内部的统计信息”问题的最新注释和答案 答案由jdh https://knowledge.亚搏在线safe.com/answers/82576/view.html

@takashi的解决方案是最有效的内存,但如果你需要处理的功能,你不能保证他们是按组排序,我喜欢使用默认dict。

close方法循环遍历每个组,提供group by的属性值和该组中的特性列表。

从集合中导入fmeobjects导入defaultdict类FeatureProcessor(object): def _init__(self): self。features = defaultdict(list) def input(self,feature): id = feature.getAttribute('_group_id') self.features[id].append(feature) def close(self): for id, featureList in self.features.items(): #do whatever
格林尼治时间2018年11月14日星期三19:42:54 jdh
答案由隆 https://knowledge.亚搏在线safe.com/answers/82547/view.html

我有时会应用这个PythonCaller脚本框架来实现一个基于组的处理,并与一个按组按属性对输入特性进行排序的排序器相结合。

#假设所有的特性都已经按照“_group_id”预先排序。类特征处理器(对象):def _init__(self): self。groupId =无自我。features = [] # list of features def input(self,feature): id = feature.getAttribute('_group_id') if id != self.groupId: self.process() self.groupId = id # Update current group ID.自我。features = [] # Reset the list of features.self.features.append(feature): def close(self): self.process(): def process(self):如果不是self。特性:返回# # TODO:处理组中的特性并输出结果。#

但是,如果需要执行真正高级的统计计算,可以考虑学习R语言并利用RCaller。

格林尼治时间2018年11月14日星期三15:17:41
答案由david_r https://knowledge.亚搏在线safe.com/answers/82540/view.html

好的,我明白你的意思。我倾向于使用dict来对特性进行分组,其中每个dict键将包含“group by”属性值,而dict值将包含第二个dict,其中包含整个组区域和特性列表。

如果我们有组A, B和C, dict可能看起来像这样(不是实际的代码):

area = {' A': {'total_area': 123, 'features': [
        
         ,
         
          ,……)}, 'B': {'total_area': 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, default to empty dict group_area = my_group['total_area'] # returns 123 group_features = my_group['features'] # Returns [
        
         ,
         
          ,……)
         
        

第二行将返回组A的嵌套dict,如果组A尚未定义,则返回空的默认dict。

更新A组,你可以:

new_area = group_area + features. getgeometry ().getArea() #计算新的总group_features.append(feature)区域['A'] = {'total_area': new_area, 'features': group_features} #更新组A

需要注意的一件事是内存消耗:您当前构建代码的方式实际上是在缓冲所有的回忆直到工作空间终止。这将成为一个问题后,一定(大)数量的功能,所有的依赖,但你可以缓解这个问题,以64位FME。我的建议是在您的PythonCaller之前使用AttributeKeeper,通过删除任何不需要的属性来尽可能减少特性的大小。

格林尼治时间2018年11月14日星期三15:01:57 david_r
阿西评论阿西的评论 https://knowledge.亚搏在线safe.com/comments/82538/view.html

实际上,我想执行一些统计数据,而这些统计数据是无法通过简单的统计计算器获得的。其中一些统计数据必须由一个小组来计算,而另一些则不是。

我的情况与面积计算无关。我只是用这个例子来说明我最后想做什么。

是的,你是对的。它比FME更像python,但并没有超出FME的范围。

2018年11月14日星期三14:26:19 GMT arthy
david_r评论david_r的评论 https://knowledge.亚搏在线safe.com/comments/82537/view.html

这就完全脱离了FME的范围,进入了纯Python的领域,这本身并没有错,但是我认为在这种情况下,您最好使用AreaCalculator +与Group By一起使用的统计计算器。

这对你有用吗?

格林尼治时间2018年11月14日星期三14:09:37 david_r
阿西评论阿西的回答 https://knowledge.亚搏在线safe.com/comments/82536/view.html

你好@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)


干杯

2018年11月14日星期三14:04:36格林尼治时间 arthy
答案由david_r https://knowledge.亚搏在线safe.com/answers/82521/view.html

我同意其他人的看法,使用它更容易。统计计算器,如果它能做你需要的。然而,您可能需要自己实现一些统计操作,例如。使用Python。

我的建议是使用class接口,例如下面介绍如何计算所有属性值的运行总数my_number,然后输出总数为the_total_is在一个单独的功能结束:

类CalculateStatistics(对象):def __init__(自我):#以前第一次调用此方法功能进入PythonCaller self.running_total = 0 def输入(自我,特性):#曾经呼吁每个特性self.running_total + = int (feature.getAttribute (my_number)或0)self.pyoutput(特性)def关闭(自我):#后调用此方法最后功能退出PythonCaller sum_feature = fmeobjects.FMEFeature sum_feature ()。setAttribute (the_total_is, self.running_total) self.pyoutput (sum_feature)

我还建议您阅读python调用者的文档,其中详细解释了很多内容:https://docs.亚搏在线safe.com/fme/html/FME_Desktop_Documentation/FME_Transformers/Transformers/pythoncaller.htm

2018年11月14日星期三08:29 28 GMT david_r
答案由danilo_fme https://knowledge.亚搏在线safe.com/answers/82494/view.html

@arthy

如果您查看自定义transformer ListStatisticCalculatorhttps://hub.亚搏在线safe.com/transformers/liststatisticscalculator这个transformer有一个transformer PythonCaller,它使用脚本python处理列表属性中的统计信息。

你可以查一下这个笔记本电脑。


*@takashi感谢这个神奇和有趣的定制变压器


谢谢,

达尼洛

格林尼治时间2018年11月13日星期二22:50:09 danilo_fme
答案由隆 https://knowledge.亚搏在线safe.com/answers/82493/view.html

StatisticsCalculator支持一次计算多个属性的统计信息。尝试将所有属性设置为在单个统计计算器中分析参数的属性。

格林尼治时间2018年11月13日星期二22:47:45