在FME中调用PythonCaller介绍+实例+下载

文章目录

  • 0 前言
  • 1 Python的版本
  • 2 PythonCaller转换器
    • 2.1 函数(Function)
    • 2.2 方法(Class)
    • 2.3 输出属性设置
  • 3 举个栗子
    • 3.1 读取文本
    • 3.2 正则字符替换
    • 3.3 使用PythonCaller
    • 3.4 保存文本

0 前言

Python是一门强大而又灵活的编程语言,其本身语法简洁严谨容易上手,拥有众多开发者分享的拓展模块,是IT从业者手中的一把利器。FME擅长可视化操作,是数据处理行业的瑞士军刀。当两者结合在一起,那就是双雄联手,所向披靡。

1 Python的版本

目前主流使用的版本有Python2.x和Python3.x。Python3.x相对于Python2.x是一个大的升级,他们之间有一些不同的地方,在选择版本需要注意。
比如说“print”命令,在Python2.x版本中是命令语句,其后加上字符串可以直接使用,到了Python3.x版本,“print”变成了函数,参数必须写在括号内部。

print 'hello world'    #Python2.x中print的用法
print('hello world')   #Python3.x中print的用法

还有一个大的区别是Python2.x使用ASCII编码,Python3.x使用utf-8编码,因此Python3.x直接支持中文字符串的输入输出,而Python2.x还需专门设置字符编码。在没有特殊要求的情况下,推荐使用Python3.x。

2 PythonCaller转换器

在FME中调用Python脚本可以通过2个装换器:PythonCreater 和 PythonCaller。
PythonCreater主要用来创建要素,而处理FME中的要素则需要使用PythonCaller。
PythonCaller有一个入口,可以接收其他工作流的要素输出, 作为输入。

打开PythonCaller转换器的参数窗口可以看到已经定义好的代码模板,代码模板定义了一个函数和方法,两者是有所区别的。帮助文档上推荐使用“函数”(Function)来逐条处理输入的要素,使用“方法”(Class)来处理复杂的计算,比如说需要读取整个列表的运算。而在代码窗口的上方,需要在“Class or Function to Process Features”参数中指定函数名或方法名来确定使用哪个函数或方法来处理要素。
在FME中调用PythonCaller介绍+实例+下载_第1张图片

2.1 函数(Function)

函数只能接收一个“feature object”作为输入参数,“feature obejct”就是从输入端口接收的要素。
每个输入的要素都会作为参数触发一次函数的执行,执行后的要素会继续作为输出要素。
在代码模板中的函数例子是“processFeature(feature)”。在函数中获取要素内容和设置属性值需要用到2个函数:getAttribute()和setAttribute(),例子如下:

import fmeobjects

def processFeature(feature):
    str_name = feature.getAttribute('name')    # 参数name是输入要素的属性名,本行代码也可在左侧的FME Feature Attributes里双击获取
    feature.setAttribute('aliasname', str_name) # 第一个参数指定属性名,第二个参数设置属性值

2.2 方法(Class)

方法拥有3个函数:_init_(self)、input(self,feature)、close(self)
_init_(self))close(self) 不管是否有输入要素,都会在运行期间的开头和结束执行一遍,而input(self,feature) 则是介于二者之间。

与函数(Function)相同的是在方法(Class)里面也需要通过getAttribute()和setAttribute()来获取和设置属性,不同的是在方法(Class)中,还需要一个额外的函数来使设置的属性值生效——self.pyoutput(feature)。

搬运帮助文档中的例子供大家参考,该例子将所有要素的面积求和后赋值给每个要素:

import fmeobjects
 
class FeatureProcessor(object):
    def __init__(self):
        self.featureList = []
        self.totalArea = 0.0
 
    def input(self,feature):
        self.featureList.append(feature)
        self.totalArea += feature.getGeometry().getArea()   # 这里用到了getGeometry(),更多用法可以参考帮助文档
 
    def close(self):
         for feature in self.featureList:
            feature.setAttribute("total_area", self.totalArea)  # 使用了setAttribute()来设置值
            self.pyoutput(feature)  # 还需要调用pyoutput(feature)来使设置值生效

2.3 输出属性设置

  • Attribute to Expose:选择要暴露的属性,例如在Python中创建的属性
  • Attribute to Hide:选择要隐藏的属性,例如在Python中删除的属性
  • Attribute to Hide:选择要隐藏的列表,例如在Python中创建的过程的列表

3 举个栗子

介绍完如何在FME中调用Python后举个我碰到的实际问题,这个问题刚刚好是个典型的FME和Python结合的例子,很好的使用了Python的优点弥补了FME的缺点。FME中的StringReplacer转换器能够使用正则表达式进行字符替换,但是替换的内容是固定的,没有办法生成序号,这个时候就用Python弥补这个功能。
首先说一下数据,数据是存在一个txt文本内部的,需要在里面特定的字符串后进行顺序编号,然后保存,效果如下:

  • 源文件
    在FME中调用PythonCaller介绍+实例+下载_第2张图片
  • 效果文件
    在FME中调用PythonCaller介绍+实例+下载_第3张图片
    先贴下工作流然后逐个介绍:
    在FME中调用PythonCaller介绍+实例+下载_第4张图片

3.1 读取文本

添加txt读模块后设置一次读取整个文件
在FME中调用PythonCaller介绍+实例+下载_第5张图片

3.2 正则字符替换

使用StringReplacer转换器进行关键词替换:

  • 1.使用正则表达式替换
  • 2.设置正则表达式:(id:\d+,name:\w+,index:)
    使用括号将正则表达式包住是为了在替换文本栏进行内容复用,使用"\1"即可复用第一个括号的内容,多个括号依次类推。
  • 3.在替换文本栏设置替换关键词。“\1”表示复用正则表达式第一个括号内的内容,“序号”二字作为补充的关键词。
    在FME中调用PythonCaller介绍+实例+下载_第6张图片
    本步骤运行后的效果如下:
    在FME中调用PythonCaller介绍+实例+下载_第7张图片

3.3 使用PythonCaller

首先输入processFeature作为执行函数,然后在processFeature(feature)内使用如下代码,思路是查找“序号”关键词并逐一替换成顺序号:

def processFeature(feature):
    text = feature.getAttribute('text_line_data')
    go = True
    index = 0
    while go:
        index += 1
        text = text.replace('序号', str(index), 1)
        if text.find('序号') == -1:
            go = False
            
    feature.setAttribute('text_line_data', text)

3.4 保存文本

最后添加txt写模块保存文本,完成!

PS:本教程FME模板已上传,提供下载:PythonCaller模板

你可能感兴趣的:(FME)