原文发布时间:2013-10-12
翻译:小新
翻译文章地址:https://blog.safe.com/2013/07/fmeevangelist117/
这篇文章讲述FME中一个鲜为人知的写模块格式,以及它在FME Server数据下载服务中的应用。我将展示一个应用它的例子:从我们的网站下载标准FME样例数据。
数据下载培训
你知道吗?当你参加safe公司的在线培训课程时,你得到一个亚马逊网络服务虚拟机实例,在这个虚拟机上,已经提前装好了需要的数据。你只需要通过远程桌面连接访问,退出时断开链接即可。我们发现这是让用户进行在线培训最简单的方式。
但是有时候用户希望可以在他们自己的电脑上开展课程,这种情况下,他们需要手动下载样例数据。
然而,数据下载的能力并没有那么高效。数据是约200m的zip文件格式,用户需要完全下载该数据,不管他们参加的课程是否用到了全部的数据。
即使Safe是FME Server的创始人,在FME Server中包含了数据下载服务,我也为尚未有一个很好的解决方案感到尴尬。
那么,在2014中,我打算做到这一点。下面是如何来实现它。
FileCopy基础
首先,我们介绍什么是FileCopy。
FileCopy写模块是鲜为人知的一个FME功能,因为它的概念有些模糊,所以使用率没有它应该有的那么高。它不是一个数据格式,相反,每个进入它的要素将触发一个文件系统拷贝(或移除)命令:
像你看到的这样,写模块要素类中包含了格式属性,它们定义了源文件和目标文件。这些属性是:
· filecopy_source_dataset
· filecopy_dest_dataset
· filecopy_dest_filename
我只是简单的设置一个格式属性为源文件/文件夹,另一个为目标文件夹/文件名。然后,在运行时,数据就从一个地方拷贝到另外一个地方。
一个例子是元数据文件的使用。例如,你有一个Shape写模块,创建文件myData.shp,接着你可能会使用一个FileCopy写模块,将myMetadataTemplate.xml 拷贝到myData.xml中。这样你可以通过拷贝已有的标准文件来自动创建元数据文件。
FileCopy还可以用于拷贝写模块的输出到不同的位置。例如,我输出一个Shape数据到本地文件系统中,并使用FileCopy自动拷贝该数据到远程文件系统的中心数据仓库,以便其他用户可以访问到这个数据。
但是我的计划是在FME Server上使用这个格式,这样将变得更加有趣。
FileCopy和数据下载( Data Download)
为什么对于我而言,FileCopy是最好的方法?
在很多FME Server的数据下载服务中,我们希望可以让用户选择下载数据的格式(Generic Writer)、图层(Feature Types to Read)或坐标系(Reprojector转换器),像下面这样:
FileCopy写模块用来做这个事情是非常好的,因为数据已经存在于所需要的格式中了。我只需要简单的将选择的培训课程映射到一系列文件,并将他们输入到FileCopy中。在FME Server的数据下载服务中,FileCopy输出zip文件供下载。
这样用户可以获得准确的副本文件,无论我选择什么提供给他们。下一节将展示我如何进行设置的。
Training Downloads Workspace
培训下载工作空间
我的工作空间首先扫描我的培训文件系统(C:FMEDataData),并搜寻数据文件夹。我使用Directory and File Pathnames读模块来完成这个任务。它和FileCopy一样,是FME的另一个独特的功能,它将返回指定位置中的文件和文件夹列表。
这点看上去很奇怪——难道我不知道有哪些文件夹存在吗?-但随着时间的推移,数据将发生变化,更多的文件夹会被添加。在这个方法中,我的过程是动态的。如果添加了新的文件夹,我不需要修改工作空间来处理它。
工作空间的下一个步骤是将选择的课程映射为一个数据文件夹列表。此刻,这个过程是硬编码的,但是我希望通过外部查找表来替代,使这个过程更加动态。
例如,Esri培训课程需要Parks,Zones,以及Airports数据文件夹,不需要Raster文件夹(该课程中没有使用这个数据)。
接着我用Tester转换器做一个简单的判断,检查我读取的文件夹是否包含在列表值中。
最终,FileCopy写模块将提供一个通过判断条件的数据文件夹列表:
当我在Server上运行这个模板时,将询问我下载哪个课程的数据,接着数据会以zip文件的方式提供下载:
几乎就是这么简单!
Final Workspace
最终的工作空间
实际上,最终的模板空间看起来是这样的,有一点复杂:
因为一些原因,所以它变得更复杂。
首先,我要发布的内容包含的不仅仅是数据(粉色书签),还有工作空间示例(黄色书签)以及自述文件(绿色书签)。
其次,我希望一次可以处理多个课程。例如,我希望用户可以同时选择KML和Esri课程。
为了实现这个,我使用了FME列表。被选择的课程以逗号分隔符组成字符串,我将它分裂成一个列表,然后将列表打散为独立的要素。接着我将每个课程匹配后的文件列表作为独立的要素。DuplicateRemover转换器确保我不会将同样的文件夹发布两次,即使它在两个课程中都有使用到。
Examples
举例
我们已经有几个FME用户(我所知道的)以这样的方式使用FileCopy,所以这并不是一个纯理论的工程。
此外,你还可以在FMEpedia中找到一些例子。
这个例子演示了如何使用FileCopy将元数据包含进来作为数据下载服务中的一部分。
这个例子也更加有趣,说明了如何用它写数据到一个已有的Geodatabase文件中,并使用FileCopy将它添加到zip文件中。
这里需要的一个条件是将FileCopy写模块放到Esri写模块之前。
总结
总结一下,我希望在这里获得一些想法。
首先来看FileCopy写模块。你可能并不知道它,也不会在Desktop或Server的转换中使用它。
其次,如果你想通过数据下载服务(Data Download Service)传送数据,注意使用FileCopy意味着你可以简单的移动数据——并且将它插入到下载的zip文件中——无需去读/写它。
另外,我可以在FME云中使用它,它是一个FME云使用的完美例子。FME云是虚拟的,对FME Server有版本要求。我们正在进行beta版测试,网页上有公布价格。
总是,注意我的下一个邮件,我会让你先睹为快,看看FME云如何进行工作。