FME 开发篇(一)

原发文时间:2014-01-16 09:28:14

作者:土豆

当我面临困境的时候,我常常会想,是否我选择了一种错误的方式。

 如果你试图用FME进行二次开发,并不厌其烦的在Google或百度键入FME 开发之类的文字,那么我想你会感到迷茫。诚然,本文也很难简短的文字描述中帮助你速成,不过我们仍然试图从我们的所知的内容中帮助你找到最合适的开发方式。开始之前,请确保你对FME有基本的了解和认识,至少能对FME Deskop或FME Server的日常使用不会感到陌生。

FME Desktop开发

       对于FME本地应用开发,只有FME Desktop可以选择,这是一个集桌面和开发为一体的环境。所以FME Desktop也是本地应用的运行环境,并没有独立的FME Runtime。需要提到的是安装FME Desktop过程中,你需要仔细查看安装选项,其中之一便是是否安装FME SDK,这绝对是你不应该错过的内容。

       FME Desktop环境中提供两类开发方式,基于FME Objects组件的开发和基于FME Plugin开发,它们之间的关系看起来像下面这个结构。

FME 开发篇(一)_第1张图片

 FME Objects允许你访问FME的组件并将其功能整合到你的应用系统中。FME Plugin则为FME本身提供足够扩展能力,将你自定义的格式、函数等集成到FME运行环境中,并提供给FME桌面产品和FME Objects组件调用。

FME Objects

FME Objects可以访问到几乎FME中所有的对象,你可以创建一个Reader读取不同格式的数据、用一个Writer将你的数据转换到其它格式、调用FME Workbench中的Transformer等等。同时FME Objects支持的开发语言很丰富,足够让你轻松的挑选一款合手的使用。

 FME Objects的教程和示例可以在“[FME安装目录]\ fmeobjects\doc” 和“[FME安装目录]\ fmeobjects\samples”下可以找到,请仔细参阅,它将指导你建立一个基于FME Objects的app并让你了解FME Objects的内容。

 FME Plugin

FME Plugin 为FME环境提供新的能力。FME Plugin扩展新的格式(Format)、转换器(Transformer),融入到FME中,提供能强大的数据处理能力。FME Plugin只支持Java和C++,其文档和示例可以在“[FME安装目录]\pluginbuilder”下找到,和FME Objects相比显得晦涩了许多。

 

你也许会有些失望,上面介绍对你并没有实质性的帮助,因为我们在实践过程中发现,FME开发并不是这么用的。考虑一下这样的场景:用户需要一个工具输入Shape数据,为每个图形生成晕线,并输出DWG数据供AutoCAD使用。

在FME Workbench中建立下面的处理模型即可完成,整个建模过程耗时不足5分钟。

FME 开发篇(一)_第2张图片

 如果使用FME Objects开发,我们需要首先创建一个读取Shape格式的FMEReader,分别调用Bufferer和Clipper转换器,最后创建dwg格式FMEWriter将数据格式写入到dwg文件。我不想演示这段代码有多么繁琐,现在的问题是:你有信心在5分钟之内完成这个功能实现么?

事情远远没有结束,你的BOSS也许觉得这是个有用的功能,希望你把工具改造成服务,可以被多个系统调用,成为系统的一部分。于是你能做的就是改写代码,努力让它变成一个服务。与此同时FME的桌面用户却可以将这个处理模型发布到FME Server,让它变成一个REST或者SOAP服务,整个过程仍然不超过5分钟。

到这里事情已经变得明了,对于第三方应用系统来说,FME Objects或许并不是最理想开发的方式,构建FME应用有着更高效的方法--基于FME Workpace(模型)的调用。 使用FME Workbench建模并保存为模型文件,或者发布为一个基于Web的服务,应用系统对模型文件或服务的调用类似对一个管道进行操作,需要关心的只是输入和输出。

于是我们调用的对象从FME的基础组件直接变成了基于FME Workspace的功能模型,而把实现过程交给了FME Workbench这个建模工具。我们重新调整了对FME的使用方式:

FME 开发篇(一)_第3张图片

 FME Executer是一个EXE可执行文件,负责对FME模板文件的解义和执行,可以在“[FME安装目录下]\fme.exe”找到此文件。FME Executer调用FME模型文件参看http://blog.163.com/antufme@126/blog/static/140492492201010752849126/。同样在FME Objects也提供IFMEWorkspaceRunner接口完成FME模型文件的调用,具体参看http://blog.163.com/antufme@126/blog/static/140492492201010225213525/。

我们意识到可以将应用系统的一部分功能从系统中抽取出来,通过FME建模生成模型文件或者服务后,再供系统调用,好处显而易见,模型文件和服务独立于系统之外,可以被其它系统复用。更重要的是这部分由程序员完成的工作,现在完全可以交给实施人员来完成,并且可能有着更高的效率,实施人员甚至可以能在现场根据客户需求对系统功能做实时修改和调试。我们用一个图来展示这个过程:

FME 开发篇(一)_第4张图片

到目前为止,我们发现这钟方式工作的出乎意料的好。一个典型的案例是我们用FME建模实现了一套数据检查系统,我们只让一位程序员参与了这个项目,而他的工作只是负责UI交互和对FME模型的调用,我们把功能实现交给更精于数据的实施人员和数据处理人员,因为他们经常可以在现场根据用户的需求改进或者定制出新的检查功能。

另一个典型的案例是用户要求在我们的某个系统中,在第三方系统数据发送变化时,能将数据同步到我们的系统。我们的实施人员对数据进行分析后,建立数据抽取映射模型,发布了一个REST服务给对方,第三方系统在数据发生修改后,调用服务实时将数据写入到我们的系统中。在此之前,我们简直无法想象这个过程居然能变得如此简单,No Programmer、 No Coding,而且足够高效和快速!

如果你仅仅垂涏于FME多源数据格式支持,并执意采用FME Objects基础组件实现基本的数据转换和处理功能,我们只能表示遗憾,因为你错过了FME中最精彩的部分。

至此,FME Objects似乎被我们丢到了一个无人理会的角落,只剩下一个调用模型的IFMEWorkspaceRunner接口。在上面的场景中确实没有它展示的舞台,不过在某些特定的场合我们仍然会使用到FME Objects,并且你会发现它的魅力。我们将在下一篇中向你展示这些内容。

你可能感兴趣的:(FME开发)