FME2011中自定义转换器的循环问题(一)

原文发布时间:2011-01-05

作者:毛毛虫

最近在做一个FME自定义转换器的循环,使用FME2011时发现一些不同于之前版本的功能,这里简要跟大家探讨下。

在2011版本中,对含有循环的自定义转换器,克服了旧的限制(阻止在循环中使用阻塞转换器)。

自定义转换器中的循环是一个相对较老的功能,可以追溯到2006年。不过,封锁转换器比如Clipper  SpatialRelator或其他可以使用"Group By"功能的转换器,不能在循环中正常的工作。首先解释下什么是阻塞转换器(Blocking Transformers)。

阻塞转换器(Blocking transformers):可以理解为进入一个要素处理一个要素的转换器。

非阻塞转换器(non-blocking transformers):可以理解为必须等到要素全部达到才能处理的转换器。看下面两个图:


这并不意味着在循环转换器中不能包含这些阻塞转换器,不过它们阻止任何要素从Transformer Loop端口出去。

Safe soteware公司的开发人员进行了一些迭代开发和测试的努力,现在没有了阻塞成员。尽管这项功能的背后的变化是很大的,而且很不容易,开发人员尝试使其对终端用户尽可能简单和不被注意。

在循环中使用阻塞转换器只有一个限制——自定义转换器包含它们应该是外部的(保存为FMX文件),并且总是LINKED的(LINK和embed的区别在其他文章中有有说明,此处不累赘)。

当一个阻塞转换器放置在循环中的自定义转换器中,或一个LOOP端口添加到一个带阻塞转换器的自定义转换器中,FME使用下面的对话框提醒用户:


如果用户继续这个导出,创建一个外部的自定义转换器,阻塞转换器会像循环中其它转换器一样工作。

                                        带循环的自定义转换器


                                       不带循环的自定义转换器

对比上面两个图,可以看出带循环的自定义转换器和不带循环的自定义转换器是有区别的。带循环的自定义转换器增加了几个参数,这也是这个外部自定义转换器的几个要素控制着循环——在自定义转换器中一个称为INCOMPLETE的端口,它在转换器体中没有暴露;在参数对话框中的两个强制参数:

"Maximum number of iterations"允许避免无限的循环。当转换器是无止境的时,FME不会阻止用户创建潜在的无限循环,不过它会在一定数目的迭代会给出一个退出循环的机会。这意味着如果转换器的逻辑不跟踪潜在的无限循环,设置参数为0可能会非常危险。

"Attribute to hold interation count"创建一个包含要素通过循环的次数的属性。


INCOMPLETE端口输出不满足标准的要素,它们在没有达到最大的迭代次数之前会通过正常的用户端口。

 

下面给出一个fmepedia上的一个示例:下图是一个湖(蓝色)和沿湖的等高线(粉红色)示意图,现在想利用循环对每条等高线使用一定的容差进行抽稀化简,并保证抽稀后的等高线与湖泊不想交。初始容差为10,如果得到的线与湖泊相交,则对该线的容差减1再次抽稀,如果还相交,容差继续减少1,……如果容差为7仍与湖泊相交,则保留原来的等高线。

首先除了两个自带的发布参数 "Maximum number of iterations"和 "Attribute to hold interation count"外,还需要设置一个最大的容差值和每次容差减少的差值(如果抽稀后等高线与湖泊相交,容差应该减少的值)。设置好这四个发布参数后,使用Attributeexposer转换器暴露 _iteration_count属性,并使用ParameterFetcher转换器来获取最大容差和容差步差,使用GeometryExtractor转换器提取现在要处理的等高线,然后使用Generalizer转换器进行抽稀,根据SpatialFilter转换器的空间关系判断结果,做一个判断,不与湖泊相交的直接输出,若与湖泊相交,则对容差减去步差后则对使用GeometryReplacer还原后的原等高线再次抽稀,直到不与湖泊相交或仍与湖泊相交,但容差小于7,则把使用GeometryReplacer还原后的原等高线输出。没有进行处理的等高线后从INCOMPLETE端口输出。
整个工作空间看起来如下图:

最后执行的结果如下图:


 蓝色的是湖泊,红色的为抽稀后的等高线,绿色的是保持原状的等高线。
 
 
下面在FME2011中自定义转换器的循环问题(二)再举一个示例,待续……




猜你喜欢

转载自blog.csdn.net/fmechina/article/details/80963751