Python是一门强大而又灵活的编程语言,其本身语法简洁严谨容易上手,拥有众多开发者分享的拓展模块,是IT从业者手中的一把利器。FME擅长可视化操作,是数据处理行业的瑞士军刀。当两者结合在一起,那就是双雄联手,所向披靡。
目前主流使用的版本有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。
在FME中调用Python脚本可以通过2个装换器:PythonCreater 和 PythonCaller。
PythonCreater主要用来创建要素,而处理FME中的要素则需要使用PythonCaller。
PythonCaller有一个入口,可以接收其他工作流的要素输出, 作为输入。
打开PythonCaller转换器的参数窗口可以看到已经定义好的代码模板,代码模板定义了一个函数和方法,两者是有所区别的。帮助文档上推荐使用“函数”(Function)来逐条处理输入的要素,使用“方法”(Class)来处理复杂的计算,比如说需要读取整个列表的运算。而在代码窗口的上方,需要在“Class or Function to Process Features”参数中指定函数名或方法名来确定使用哪个函数或方法来处理要素。
函数只能接收一个“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) # 第一个参数指定属性名,第二个参数设置属性值
方法拥有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)来使设置值生效
介绍完如何在FME中调用Python后举个我碰到的实际问题,这个问题刚刚好是个典型的FME和Python结合的例子,很好的使用了Python的优点弥补了FME的缺点。FME中的StringReplacer转换器能够使用正则表达式进行字符替换,但是替换的内容是固定的,没有办法生成序号,这个时候就用Python弥补这个功能。
首先说一下数据,数据是存在一个txt文本内部的,需要在里面特定的字符串后进行顺序编号,然后保存,效果如下:
使用StringReplacer转换器进行关键词替换:
首先输入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)
最后添加txt写模块保存文本,完成!
PS:本教程FME模板已上传,提供下载:PythonCaller模板