原发文时间:2012-05-10 10:51:37
原文地址:http://evangelism.safe.com/fmeevangelist91/
作者:Mark
翻译:怕冷的企鹅
各位FME用户:
若您在FME中应用了Python,那么在2012版FME中将会对您非常有用。Python支持的时代终于到来了-Python II,您将会说它会完全成为FME Objects家族的一员。它将带来更大的改善和优势,内容如下:
NB: The title “Python II” refers really to this being a major upgrade to FME Python support, not any particular Python release. It’s also a play on the film Python II, whose tagline - by the way - is “The Beast is Back!”. My favourite Python-titled movie is actually “Police Python 357″, a French cop movie that really could cause confusion (What! You’re using Python v3.57?!)
注意:此标题中的Python II指的是FME在Python支持上的重点升级,而非特别的Python版本程序。它就像电影“野兽归来”的标题口号,其实它就是一部法国警察影片。而我所喜欢的标题命名为:Police Python357,不过这确实容易引起困惑(什么!你使用的是Python V3.57)。
当然,如果您不是一位懂Python的专家,也可以成为其一,我打算写一个后续的帖子,其中将展示一个实例:即使是不称职的程序员(我)也可以利用Python做很棒的事情。
若您是开源Python中的一员,Killer Rabbit对你来说是一本真正的好书,尤其是通过此video clip达到自我的学习和娱乐。
新API
首先要注意的是:Pyfme不再采用老的FME与Python的接口,其实这不完全正确。我们要保证向后兼容性,所以您在以前的版本中有任何pyfme脚本,仍然可以在2012的版本中运行。但,从现在开始,还是鼓励您使用最新的Python FME Objects API。
最新的Python FME Objects API有多个超过pyfme的优势,包括丰富的FME Objects覆盖面、详细的API文档和提高帮助文档。
FME Objects 覆盖面
我们原有的pyfme接口从未纳入全方位FME Objects的能力。例如:它涵盖了类似Session、Feature等的*接口,但不是所有的FME Objects。
新的API扩展了FME Objects的覆盖面。尽管还不完整,但现已保证您可以利用Python访问rich geometry(包括FMEArc、FMEDonut、FMEPath和FMEText).为支持接口的完整列表,请查阅相关文档。
API文档
FME2011中Python的API文档不是很大。这可能是为什么有这么多人频繁访问FMEpedia网站Oliver’s Python Corner的原因。
在2012中,Python升级为FME Objects中完整的一员,我们提供了详细的API文档,包括methods、parameters、return Values的描述,并尽可能的列举示例。
若您已安装了FME2012,且选中了安装所有SDKs的选项,则您就可以在您的安装路径(<FME>/fmeobjects/python/apidoc/index.html)下找到最新的文档。
帮助文档
我们还更新了Workbench的帮助文档涉及Python的部分。查阅转换器PythonCaller和PythonCreator的帮助,您将看到较以往更全面的内容。我们还在FMEpedia中增加了更多的Python相关的内容,并添加新的示例到您安装的FMEObjects文件夹下。
技术信息
如果您正准备从Pyfme到新的API转移,您需要什么知识呢?
首先,很明显,首行开头不会是:import pyfme,而是:import fmeobjects。
其次,所有通过隐式类型添加属性时移除了需要保留属性类型的说明,示例如下,在2011版中,需要使用一个显示类型:
feature1.setStringAttribute('building', 'Library')
而在2012版中同样的实现方法,内容如下:
feature1.setAttribute('building', 'Library')
第三,我们已经改善了参数传递的结构,使其有更标准Python的感觉,例如使用点元组。示例如下,创建一个线要素原有的使用示范如下:
# Create a feature.
feature = pyfme.FMEFeature()
# Explicity define the geometry on the feature.
feature.setGeometryType(pyfme.FME_GEOM_LINE)
# Add points to a feature to create the geometry.
feature.addCoordinates(xCoordsList, yCoordsList, zCoordsList)
现在我们的示范如下:
# Create a feature.
feature = fmeobjects.FMEFeature()
# Create an FMELine geometry.
line = fmeobjects.FMELine()
# Add points to FMELine as tuples of coordinates.
coord1 = (0, 100, 0)
coord2 = (500, 100, 0)
line.appendPoints([coord1, coord2])
# Set the geometry on the feature.
feature.setGeometry(line)
曾有人告诉我API的基础思想是:使用尽可能的简单、直观。
Python的其他升级
除了API方面的升级,还有许多其他有用的py-升级。
Python解译器功能
FME2012包含一项设置不同Python解译器的功能选项(命令:Tools>FME Options)
在FMEpedia中有一整个页面专门去介绍了用户为什么想要利用此功能改变它的内容。简言之,用户可以整合FME与其他不同包(例如Arcgis)或需要集成第三方的模块之间的存在不同Python解译器的应用。
顺便说一下, FME的安装应用了V2.7版本Python(在写作时),我打算后续发帖撰写一个应用V2.6解译器版本与Mapnik集成的示例。
要知道,如果您降级到V2.3或V2.4的版本解译器,您将只能与Pyfme为伍了,最新的API只适用于V2.5或更高版本。
Python转换器更新
转换器PythonCaller和PythonCreator在2012版中也做了一些改造。
尽管变化小,但其中一个有用的补充是“暴露属性”的参数。一般用户的Python脚本将会创建新的熟悉。因为FME不知道它们会是什么,导致其不能显示在工作空间中。所以此参数可以让您公开暴露由此转换器新创建的属性名称。
代码编辑器升级
打开代码编辑器对话框,您将看到一些变化如下图:
不仅是有一个以不同方式突出高亮显示脚本中的不同语言的能力,更重要的是有行号和空格、制表符的功能。Python使用空格正确布局脚本,此功能将自动制表符转换为空格。
代码模板
您是否注意到,在上面的截图脚本的内容?这不是我添加的东西,它是一个模板,这包括正确的脚本结构放在前面,为用户提供一个脚步的参考开头。
Python应用:提示
最后,让我们将使用FME Python的一些技巧快速浏览一下。
PythonCaller VS PythonCreator
PythonCaller转换器是当您想为每个传入的要素运行脚本的。这就是为什么它具有输入和输出的端口,而PythonCreator只有一个输出端口的原因。后者旨在为那些希望在他们的Python脚本中创建要素的用户,只需执行一次。
全局脚本
要存储一个Python脚本,全局使用“启动Python 脚本”(导航窗口-工作空间属性-高级选项卡中),您可以发布您的脚本到此,以便在FME的其他应用地方使用它。
存储全局脚本有益于保持您Python逻辑集中,这使得此脚本的编辑和维护变得更加容易。这点很有用,尤其当您在整个工作空间的多个地方调用相同脚本的时候。
基于要素或基于组的处理
转换器PythonCaller可通过两种方式连接Python脚本:通过function或class。当您打算一次处理单个要素时,使用function接口连接,即每个要素都运行一次脚本。当您打算为所有要素运行只运行一次脚本的时候可以使用class接口连接。
我将计划后续发帖展示此类示例。
我希望Python工程师们能发现这篇文章有用。如果您有任何进一步的问题,请不要犹豫,让我知道,我将努力给与您答复。
但无论您利用FME Objects做什么,请不要忘记IFMEWorkspaceRunner的接口,让您以编程的思维运行由Workbench创建的转换工作。这意味着您不必改造原代码中的FME的基本组成部分,却可以给FMEWorkbench带来更多的方便,同时创建了一个独立的解决方案。