任何时候都适用的十大FME技巧(一)

原文发布时间:2014-09-30 10:28:18

翻译:小新

原文地址:http://blog.safe.com/2014/08/fmeevangelist127/

大家好,

         刚刚完成我在Safe Software工作的第十年,我想我应该传授一些在任何时候都适用的十大FME技巧这样的经验。

         这些都是之前别人告诉我的,或者我认为用户可能会受益的一些功能。

         我把这个文章分为两个部分,这是第一篇,讲述我的一些技巧。第二篇来自于你们的重点推荐。

 

相对日期

相对日期是处理与工作空间运行时间相关的日期和时间的能力。

        

例如,我运行一个工作空间,希望找到某个数据集中最近一周更新的记录。现在的问题是,工作空间如何知道这个具体的时间,它如何计算一周前的日期,它如何知道一个记录的日期是否比这个日期晚?

 

让我们用两个要素来说明。一个要素的日期戳为20-2-2014,另外一个为24-4-2014。我写这个文章的时间是4月30号,那么24-4-2014是最近7天的一个截至日期。首先,我使用DataFormatter将它们的日期转为FME中的Data/Time(年月日)类型;然后创建一个新的属性RelativeDate,给这个属性赋值为“1 week ago”,同样使用DataFormatter将它转为FME日期型。

 

是的,这是正确的。我可以使用如“1 week ago”、“next Thursday”、或“tomorrow”这样的值,FME可以识别它们,并将它们转换为正确的日期。我很开心我们可以做到这一点。

 

然后我可以只简单的使用Tester转换器来判断是否 原始日期>相对日期,因为我使用FME日期格式,这个格式可以当作数字来处理,日期越近的,数字越大。如20140425 > 20140423。

 

工作空间如下:

通过处理要素的数量可以看出,工作空间正确找出了1个原始日期不在“1 week ago”范围内的要素,1个在这个日期内的要素。

因此,我觉得相对日期是一个很好的功能。

 

 

第一个写模块

 

FME的开发者花了大量的心思安装FME引擎,使它可以快速、高效的运行。有时了解一些内部机制,可以让你知道如何使用它们来最大化的得到利益。一个很好的例子就是写模块的顺序

         我写过一篇完整的博客阐述这个问题,在FMEpedia中也有一篇文章,因此这里我就不详细的阐述了。通常,我们的开发人员通过设置第一个写模块这样巧妙的方法,让具有多个写模块的工作空间高效的运行。你不需要做任何事情来让这个事情发生,它在任何时候都可以发生的。

        

         不过,现在你知道第一个写模块具有更高的效率,你如何使用这个优势呢?是的,你需要更改你的写模块的顺序,让处理“最多数据”的那个写模块位于第一个。

 

         如何更改写模块的顺序呢?在Workbench的导航窗口中,例如这里我将位于第二的Shape写模块移动到第一个上面,因为我知道它要处理更多的数据:

这样不仅仅是提高速度,还可以优化内存使用。在这个工作空间中,这样的操作并没有提高太多速度(之前只是有一点慢),但是内存的使用减半!另外要记住,“最多数据”不仅仅只是要素数量的体现,同时还涉及要素的几何形状以及它们的属性。复杂的几何形状和大量的属性也会导致一个较大的数据集,即使它的要素数量非常少。

 

函数,特别是@Evaluate()函数

      

这里有一些新的技巧:关于普通的FME函数和特殊的@Evaluate()函数。函数是什么呢?

Tip 8a:在FME中,任何以“@”字符开头的,我们称之为FME函数。这是通往FME核心和转换器底层的一个功能(转换器使用函数)。有一个FME“函数和工厂”的文档涵盖了所有可用的函数。

        

         这样一个计算当前要素面积的函数@Area()。毋庸置疑AreaCalculator转换器使用了这个函数。我可以通过复制AreaCalculator到一个文本编辑器来验证这一点!你知道可以这样做吗?这种情况下,我能看到一些FME内部的代码,显示了如何使用@Area函数:

  很清楚,是吧?我喜欢这个技巧,即使它不能帮助你解决一个特定的问题,但是它可以帮助你了解FME的基本核心,你了解的越多,就能够更好的使用FME。

         本文中讲解函数的真正目的在于Tip 8c中提到的@Evaluate函数。这个函数进行算数运行。它非常有用,因为它提供了集成算数计算到文本编辑器的功能。

        

         例如,我正在读取温哥华市居民区的列表,以及一个公众艺术的列表,我希望创建一个字符串表示:

"In <Neighborhood X> there are Y pieces of artwork per square m".

         我可以在一个转换器中完成么?好吧,应该不完全是。我需要将数据重投影(数据本身为经纬度坐标),然后计算每个居民区中的公众艺术数量(我已经提交了一个关于FeatureMerger转换器的增强要求,输出Suppliers的数量作为属性)。但是在构建字符串的时候,我可以只是用AttributeCreator转换器。问题在于,我是否可以使用文本或算术编辑器?

这里我将使用文本编辑器(Text Editor),使用@Evaluate()函数合并所有的计算,如下:

In @Value(NeighborhoodName) there are @Evaluate(@Value(NumberOfArtworks)/@Area()) pieces of artwork per square m

看到@Evaluate()函数了么?这样写可以告诉FME如何进行计算。如果我删除它,输出将只根据字面意思把字符串进行输出“@Value(NumberOfArtworks)/@Area()”。注意,我还使用了@Area()和@Value()(返回属性值)。

 

我将把这个运算变得复杂一点,把结果的单位转换为每平方公里,并对计算结果取整:

In @Value(NeighborhoodName) there are @Evaluate(@round(@Value(NumberOfArtworks)/(@Area()/1000000.0))) pieces of artwork per square km

         注意:这里有新的技巧(Tip8d)。如果你想得到一个浮点型结果(或非整型),在计算中你不能使用整数。这也是为什么我以“1000000.0”的方式来计算。但是!在FME2015中,我们做了升级,你也不必再这样设置。在FME2015中,2/5将等于0.4而不是0。这个改进或许会让很多用户感到开心。

        

         但是……不知道使用哪些函数?没关系,在Text Editor左边的菜单中,列出了所有可用的函数:

注意,这里还有字符串和数学函数。

希望这是一个有用的技巧,简单的将你带入FME函数的世界。我将上面的工作空间作为一个可用的模板,作为使用函数的例子。

         注意:上面还包含了一个技巧(Tip8e)。我好像没有看到过用户使用FME模板(FME Template)。我们在Safe一直使用;并不一定是作为模板,在将工作空间、数据或其他资源转换到一个单一文件时非常有用。将它假想为一个打包整个转换的方法。当我们将例子发给开发团队时,我们几乎都是用模板(template),这是我们使用它的好处—— 单一文件”(如上的模板链接)。所以尝试一下在Wrokbench中使用模板,并试想一下在你的工作中可能会带来好处的地方。

 

写入要素的数量

 

         在FME转换中有各种各样的组件;但是通常涉及的有三个:读模块、转换器和写模块。

读模块是读取数据的组件。读取数据的数量记录在FME的日志窗口/文件中:

转换器是转换(重构)数据的组件。根据转换器的类型和它们可以执行的操作,它们将记录要素在日志窗口/文件中,虽然在某种程度上看起来很神秘:

任何时候都适用的十大FME技巧(一) - FME - FME—专业化的空间数据服务实践者

 

写模块是将要素写入输出数据集中的组件。他们可以记录……。奥!稍等,这是不一样的。

这个有一点奇怪。当日志窗口中告知“Total Feature Written”,它实际上表示“发送到写模块的总要素”。换句话说,记录的是当前阶段发送到写模块的数据和要素数量:

不过,写入的实际数据仍然会产生,并且有很多原因导致一个要素不能真正被写入。例如,在上面的例子中,我的输出数据集中的要素数量为0。这是因为我试图将面要素写入到一个点要素的Shape数据集中。日志中将这样记录:

  它还会给出一个结果概述:

但是这个时候,日志中描述要素写出的部分,仍然会显示80个要素。

         因此使用这个技巧时要仔细解读这个数字。

        

除了FME写模块拒绝要素(我们应该在日志中更好的记录外),也有与写入各种格式有关的好奇。例如,如果FME写入一个要素,但是它要写入的数据库拒绝写入,那是应该算作写入的要素还是未写入的要素数量中?

 

在输出结果中,你可能得到比记录的数量要多的要素。例如,如果我将一个有10,000个节点的线要素写入到一个只支持每条线2,000个节点的格式中,将会发生什么?FME将把这条线自动拆分为5个独立的要素,确保能够写入。这种情况下,原来的一条线,在输出结果中将变为5条线。

所以,无论何时在你查看日志窗口的要素数量时,要铭记:

灵活的变化检测

 

         这里有两个变化检测的技巧,除了它们本身很不错之外,希望能阐明如何通过更灵活的思维更好的使用FME。

         我有两个公园数据集。我希望通过公园名称ParkName这个属性找到,在这两个数据集中都存在的公园。

 思考一下,我需要找到可以匹配的要素。所以可以使用Matcher这个转换器。但是实际上,我是找重复的要素,所以我还可以使用DuplicateRemover。或者使用ChangeDetector来查找不同?甚至可以使用FeatureMerger:

Tip 6a这种情况下,FeatureMerger转换器是我的第一选择。并不是我想合并数据,而是这个转换器可以很好的区分合并的数据和未合并的数据,从而告诉我哪些公园名称ParkName要素可以匹配。你可以通过测试来验证,但是我打赌FeatureMerger是上述转换器中性能最高的一个。加上它有多个输出端口,可以让我很容易的区分要素。

  这里还有一个例子。我仍然是检测这两个公园数据集,但是这里我检测的是几何的变化。理所当然的我使用ChangeDetector:

 但是有更好的办法吗?这里FeatureMerger不起作用,因为它不能匹配几何信息。SpatialFilter可以,但是这里我的技巧是使用一个叫做CRCCalculator的转换器。

         Tip 6b: CRCCalculator为给定的几何和属性计算一个唯一的值。我记得的一个典型应用是磁带驱动器——在数据集转换之前和转换之后分别记录一个CRC数字。如果两个CRC值不一样,则说明在转换过程中数据被损坏。因此,可以使用这个能力进行变化检测:

我只是对老数据和新数据分布计算了一个CRC值,然后使用我最喜欢的FeatureMerger对它们的值进行比较(CRCCalculator的帮助中建议使用Matcher,但是我坚持使用FeatureMerger)。因为只是对单一的属性值进行比较,效率会比做几何比对更高,节省更多的内存。

         我会存储CRC值以便下一次使用。这样可以让我不用再对已有数据进行计算。

         顺便说一句,如果你想知道如何计算CRC值的,我想说我不知道!我确定维基百科会有。在FME2015中,你可以选择计算CRC的算法。

 总之,考虑到大量用户在做变化检测,希望这些技巧有所帮助。

这些是我在safe学习到的技巧,我将它们提供给您使用。

        

         接下来的5个技巧我希望来自于用户,而不是我。可以邮件告诉我你最喜欢的FME技巧,或者在这篇文章中进行评论。我将选择5个最好的,在我的下一篇博客中讲解。记得选择你觉得你收益最大的技巧,同时其他用户也可能感兴趣的。

 

 

 

 

如对文章有疑问,可发送邮箱至zhuxx@antu.com.cn提问或讨论。

  • 8
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值