FME2011中自定义转换器的循环问题(一)
原文发布时间:2011-01-05
作者:毛毛虫
最近在做一个FME自定义转换器的循环,使用FME2011时发现一些不同于之前版本的功能,这里简要跟大家探讨下。
在2011版本中,对含有循环的自定义转换器,克服了旧的限制(阻止在循环中使用阻塞转换器)。
自定义转换器中的循环是一个相对较老的功能,可以追溯到2006年。不过,封锁转换器比如Clipper 或 SpatialRelator或其他可以使用"Group By"功能的转换器,不能在循环中正常的工作。首先解释下什么是阻塞转换器(Blocking Transformers)。
阻塞转换器(Blocking transformers):可以理解为进入一个要素处理一个要素的转换器。
非阻塞转换器(non-blocking transformers):可以理解为必须等到要素全部达到才能处理的转换器。看下面两个图:
Safe soteware公司的开发人员进行了一些迭代开发和测试的努力,现在没有了阻塞成员。尽管这项功能的背后的变化是很大的,而且很不容易,开发人员尝试使其对终端用户尽可能简单和不被注意。
在循环中使用阻塞转换器只有一个限制——自定义转换器包含它们应该是外部的(保存为FMX文件),并且总是LINKED的(LINK和embed的区别在其他文章中有有说明,此处不累赘)。
如果用户继续这个导出,创建一个外部的自定义转换器,阻塞转换器会像循环中其它转换器一样工作。
带循环的自定义转换器
不带循环的自定义转换器
对比上面两个图,可以看出带循环的自定义转换器和不带循环的自定义转换器是有区别的。带循环的自定义转换器增加了几个参数,这也是这个外部自定义转换器的几个要素控制着循环——在自定义转换器中一个称为INCOMPLETE的端口,它在转换器体中没有暴露;在参数对话框中的两个强制参数:
"Maximum number of iterations"允许避免无限的循环。当转换器是无止境的时,FME不会阻止用户创建潜在的无限循环,不过它会在一定数目的迭代会给出一个退出循环的机会。这意味着如果转换器的逻辑不跟踪潜在的无限循环,设置参数为0可能会非常危险。
"Attribute to hold interation count"创建一个包含要素通过循环的次数的属性。
INCOMPLETE端口输出不满足标准的要素,它们在没有达到最大的迭代次数之前会通过正常的用户端口。
下面给出一个fmepedia上的一个示例:下图是一个湖(蓝色)和沿湖的等高线(粉红色)示意图,现在想利用循环对每条等高线使用一定的容差进行抽稀化简,并保证抽稀后的等高线与湖泊不想交。初始容差为10,如果得到的线与湖泊相交,则对该线的容差减1再次抽稀,如果还相交,容差继续减少1,……如果容差为7仍与湖泊相交,则保留原来的等高线。
最后执行的结果如下图: