如何在FME PythonCaller中批量操作属性列(无需遍历要素)?
在FME PythonCaller中操作属性列集合的实现方案
你的两个需求都可以实现,核心是要在FeatureProcessor类中提前存储MYNEWATTR的所有值,因为close方法无法直接获取已输出要素的属性数据。以下是具体实现代码:
import fme import fmeobjects def my_python_func(my_new_attr_value): # 替换为你生成新属性的自定义逻辑 if my_new_attr_value == "aucun": return "无匹配项" else: return f"包含标记: {my_new_attr_value}" class FeatureProcessor(object): def __init__(self): # 初始化集合存储MYNEWATTR的唯一值(自动去重) self.my_new_attr_unique = set() def input(self, feature): progs_dict = globals()[fme.macroValues['VARNAME_DICT']] all_prog_cols = list(progs_dict.keys()) all_col_attributes = filter( lambda x: x in all_prog_cols, feature.getAllAttributeNames()) value_tmp = map(str, map(feature.getAttribute, all_col_attributes)) value = [i for i in value_tmp if i == 'X'] if len(value) == 0: value = [progs_dict['aucun']] my_new_attr_val = ';'.join(value) feature.setAttribute('MYNEWATTR', my_new_attr_val) # 收集MYNEWATTR的值到集合 self.my_new_attr_unique.add(my_new_attr_val) # 需求2:添加新属性(逻辑仅依赖当前要素值时,直接在此处理) another_attr_val = my_python_func(my_new_attr_val) feature.setAttribute('ANOTHERATTR', another_attr_val) self.pyoutput(feature) def close(self): # 需求1:打印MYNEWATTR的所有唯一值 print("MYNEWATTR唯一值列表:", ', '.join(self.my_new_attr_unique)) # 若新属性需依赖全局统计结果(如基于所有唯一值的计算) # 无法在close中修改已输出要素,建议拆分两个PythonCaller: # 1. 第一个收集值生成映射并存储为全局变量 # 2. 第二个读取映射为要素添加新属性
关键说明:
- 打印唯一值:通过类初始化时创建的集合,在
input阶段自动收集并去重MYNEWATTR的值,close方法直接输出集合内容即可。 - 批量添加新属性:
- 若新属性仅依赖当前要素的
MYNEWATTR值,直接在input阶段处理是最高效的方式。 - 若必须基于全局统计结果生成新属性,需拆分流程:先通过一个PythonCaller收集值并生成映射,再用第二个PythonCaller读取映射为要素添加属性。
- 若新属性仅依赖当前要素的
内容的提问来源于stack exchange,提问作者mazu
相关产品推荐
相关产品推荐

