原文发布时间:2014-10-13
作者:一辉
相关文章:
自定义转换器1对自定义转换器进行了基础内容的介绍,自定义转换器2介绍了FME中自定义转换器内部属性和外部工作空间属性的关联。
本文主要介绍FME中自定义转换器的循环和扩展。
1. 循环
FME中使用循环来做一些重复性或者动态的事,也是老生常谈了,前面有不少博文提到过,比如毛毛虫的这两篇,大家也可以先阅读下:
http://blog.163.com/[email protected]/blog/static/14049249220110582411146/
http://blog.163.com/[email protected]/blog/static/14049249220110584818988/
本文就以一个简单的例子介绍如何制作循环自定义转换器:
功能:实现数字累加
图1 自定义转换器循环
思路是创建两个属性变量:1)i用来记录当前累加到哪一个数字2)leijia 用来记录当前累加结果,然后以条件i<50来进行循环,最终得到结果。
图2 使用自定义转换器
会用到FME的工具有:
图3 用到的FME菜单项
其中Transformer Input是为自定义转换器增加一个入口,如我们图1 的Input_2就是通过该菜单项添加的;Tranformer Loop则是为转换器添加一个循环出口,该出口需要指定一个入口即循环到那个位置,此处我们设置为Input_2。
2.转换器的扩展
本文将转换器的扩展主要是使用已有的转换器PythonCaller来制作的自定义转换器,当然更高级的开发可以通过C#或者Plugin,这种方式我从未尝试过也未见到过别人尝试过,所以此处无法作介绍。
FME提供了对脚本语言PYTHON和TCL的支持,主要通过PythonCaller和TCLCaller来执行脚本,我们可以通过脚本语言来制作自定义转换器,扩展FME的功能,本文也只是介绍使用Python作为脚本语言。
FME自身类库的位置:位于FME的安装路径下
“D:/apps/FME2014sp2/fmeobjects/python/apidoc/index.html”
图4 PythonCaller类库
比如我们在Indices下搜索“getattributee”
图5 类库搜索
就可以找到获取要素属性的方法getAttribute()。
下面仍以累加的例子使用脚本实现:用while循环做累加,更加简单,当然中间用到两个fmeobject的方法分别是getAttribute()获取属性值setAttribute()新建属性并指定值。
脚本如下:红色斜体是我添加的。
import fmeobjects
# Template Function interface:
def processFeature(feature):
pass
# Template Class Interface:
class FeatureProcessor(object):
def __init__(self):
pass
def input(self,feature):
_max = feature.getAttribute('_MAX')
i = 0
leijia = 0
while i <= int(_max):
leijia += i
i += 1
feature.setAttribute('leijia',leijia)
self.pyoutput(feature)
def close(self):
pass
自定制转换器如下:
图6 自定义转换器
自定义转换器的使用同上:
图7 使用自定义转化器
3.总结
FME本身的功能以足够强大,其实使用循环和脚本扩展的时候并不多,但fmeobjects提供了大量的方法,当大家在使用过程中感觉遇到瓶颈的时候不妨看下这些方法,或许会有帮助。
最近关于FME自定义转换器的总结就到这结束了,当然还会有很多未曾提到的地方,毕竟作者水平有限,大家可尽情补充。