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

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

作者:毛毛虫

继续FME2011中自定义转换器的循环问题(一)中所述,再举一个带自定义转换器的例子。

数据如下图,现在每隔五百米向左生成与垂直的线平行等长的线,直到不再与曲线相交。求出每条直线与曲线的没出的交点。


要解决这一问题,只要对直线像左做一个500米的缓冲,计算这个生成的直线与曲线是否有交点,把交点输出,然后再对缓冲后生成的这条直线再次在缓冲……直到没有交点为止。


我所做的第一个自定义循环转换器如图:


发现循环只执行了一次。经过检查发现问题在于VariableSetter和VariableRetriever这对转换器。下面先简要介绍下这两个转换器
VariableSetter创建并设置一个指定的变量到指定的值。这个变量稍后会取回到一个使用VariableRetriever转换器设置的属性中。'Variable Scope'参数指定这个变量的范围是全局的还是局部的。Globally-scoped变量可以通过转换器VariableRetriever在工作空间的任何位置获取,而locally-scoped变量只能在创建它们的自定义转换器中获取。VariableRetriever(之前这个转换器被称作VariableRasterClassifier读取指定的变量,把它放入指定的属性中。这个变量之前必须使用VariableSetter转换器进行了设置。对这对转换器没有深入研究,不过发现对于从同一数据源或同一转换器流出的两个要素流,之后的处理是有顺序的(具体的规则还没有找到),如图:


Creator后面连接的三个转换器从上到下依次为:AttributeCreator、AreaOnAreaOverlayer和Dissolver,AttributeCreator后面的VariableSetter转换器设置_value值为1,AreaOnAreaOverlayer后面的VariableSetter转换器设置_value值为2,则执行后发现Dissolver后面的VariableRetriever转换器读取的_value值为1;而交换AreaOnAreaOverlayer和Dissolver后面的转换器,即把VariableRetriever连接到AreaOnAreaOverlayer,把VariableSetter连接到Dissolver后,则发现VariableRetriever转换器读取的_value值为1;如果把AttributeCreator和Dissolver后的转换器再交换,即把VariableRetriever连接到AttributeCreator,把VariableSetter连接到Dissolver后,则发现VariableRetriever转换器则发现没有读取到_value值。这说明要素流路线的优先级从高到低为: AttributeCreator、AreaOnAreaOverlayer和Dissolver。

上面我的工作空间中没有进行循环就是因为没有获取到_value。

另外要素流的优先级可能还跟要素之间的连线的早晚有关,如图:


两个自定义转换器一模一样,不过最后连接要素间的线不同(用红色标识的线)。最后一个tester的passed端口表示获取到了_value,而failed端口则表示没有获取到_value。
 
继续上面的例子:工作空间修改为后则可以完成循环:


我们可以看到找到了所有交点。
不过我在自定义循环的转换器中添加Visualizer后会报错(其中取交点是自定义转换器的名称):

个人感觉,能用其它转换器来替代阻塞转换器会更好,如下图,使用两个BoundsExtractor转换器,根据x的范围来做循环更高效方便。免去了设置循环次数的麻烦(设置的次数太多浪费时间,次数太少会有遗漏)。







猜你喜欢

转载自blog.csdn.net/fmechina/article/details/80963786
今日推荐