fme自定义循环转换器

自定义循环转换器

循环是一种执行重复一段转换器的过程的方法。在FME中,循环只允许在自定义转换器内部使用。
B站视频凑合看:自定义循环转换器

为什么使用循环?

如您所知,FME一次处理一个要素。因此,在创建循环时,将分别在循环发送每个要素。循环的每次迭代都必须获取新数据(例如,从列表中读取另一个条目)或使用重复相同的过程上一个循环的结果。
对于想要利用现有转换器(test等)来确定最终条件的用户来说,循环使用自定义转换器非常有用。
例如,您可以将转换器设置为“循环”,直到满足条件,而不是多次重新运行工作空间并重置转换器属性。
如果要为(或 )属性创建值,这些转换器也可以很好地工作,该属性将颜色从深色均匀地分布在输入要素的数量上,独立地从深色到浅色。fme_colorfme_fill_color
注意: 要使用基于组的(或阻塞的)转换器设置循环,请参阅使用阻塞转换器循环。

设置自定义转换器循环

自定义转换器中的循环需要两个组件:循环的起点和终点。
循环起点
循环的开始由输入端口对象标识。尽管它可以是用于要素进入的相同输入端口,但事实并非如此。例如,下面有一个输入端口用于要素到达,另一个用于循环开始的输入端口:
在这里插入图片描述

这允许循环点不是自定义转换器的起点。
默认情况下,第二个输入端口也出现在转换器本身上,如下所示:
在这里插入图片描述

如果您不需要它,那么您只需要在输入端口的参数中“取消发布”它:
在这里插入图片描述

循环终点
循环的末尾由Loop对象标识。您可以通过从自定义转换器的画布上下文菜单中选择它来插入一个:

在这里插入图片描述

放置循环对象时,系统会询问您要循环到哪个Input对象:
在这里插入图片描述

然后循环完成:
在这里插入图片描述

当然,此示例是一个无限循环。该操作是重复的,但没有测试任何条件来阻止它。FME不会让无限循环永远运行-它会认识到问题并阻止它-但我们应该设置一些东西来迫使结局。

循环条件
我们可以测试两种一般类型的条件。首先,我们可以循环一定次数。其次,我们可以循环直到满足特定条件。
下面是一个自定义转换器,它循环设置的次数:
在这里插入图片描述

请注意,我们有一个属性,它是我们循环次数的计数器(LoopCounter),还有一个属性告诉我们循环的最大次数。执行(最大循环)。
在每个循环中,计数器属性递增1。当循环计数器<最大循环时,我们循环回并再次处理数据。当循环计数器=最大循环时,我们退出转换器。
另一种方法是测试数据质量的特定度量值,而不是简单的迭代计数。例如,此处对表示公园的椭圆进行调整(调整大小越来越小),直到其大小小于特定数量:
在这里插入图片描述

使用阻塞转换器循环

您应该已经知道,一次对一个要素进行操作的转换器称为基于要素,而一次对多个要素进行操作的转换器称为称为“基于组”。
我们也可以将循环称为“基于要素”,因为它一次只处理一个要素。不幸的是,这意味着在(基于要素的)自定义转换器循环中使用基于组的转换器并不是一项简单的任务。
如果尝试在嵌入式自定义转换器内创建循环,当它包含基于组的FME转换器时,则会收到一条错误消息。基于组的转换器只允许在链接的自定义转换器的循环内使用。
这是您收到的错误消息:
在这里插入图片描述

因此,在链接的自定义转换器定义中,您将看到一个名为“启用阻塞循环”的特定参数(在“导航”窗口中):
在这里插入图片描述

如果设置为“是”,则将公开其他参数以设置迭代次数,并设置将保存该值的属性。请注意,对于正在循环的自定义转换器,并行处理关闭的(参数被删除),并且插入模式会自动更改为“仅链接”。

FME 可以围绕阻塞(或基于组)的转换器创建处理循环,这些转换器通常会阻塞要素流。此要素类似于循环要素,但它的操作方式非常不同。它们可能会保留某些要素,直到FME完成处理。(例如,当使用转换器的“分组依据”要素时,就会发生这种情况,因为在考虑了每个要素之前,组无法完成。像这样的转换器也经常被称为“基于组”的转换器。当这些转换器固定一个要素时,FME返回到读取器以获取下一个要处理的要素。阻断转换器在其所有输入累积之前无法产生任何输出。从逻辑上讲,这意味着阻塞转换器不能包含在转换器循环中,因为循环发生在转换器尚未准备好接受新要素的时候。
“启用阻塞循环”要素克服了这一限制。
要求
在 FME 中工作时,某些转换器被称为“阻断转换器”,例如,Clipper、SpatialRelator 或任何可以使用“分组依据”要素的转换器。这些转换器要求所有输入要素都保留在那里,直到收到所有要素以完成转换器的操作,然后再释放这些要素以继续执行工作流。
在自定义转换器内部循环时,保留所有要素会带来问题,因为阻塞转换器永远不会接收所有输入要素,因为它会期望从循环中获取要素。值得庆幸的是,只要您使用的是FME 2011+,FME就有解决方案。

在循环中使用阻塞转换器时,只有一个要求:自定义转换器必须是外部的(保存并存储为.fmx文件)并且始终链接(未嵌入)。
步骤
1.创建自定义转换器。如果是嵌入式自定义转换器,请将其导出为链接的自定义转换器。
或者,当您将循环端口添加到包含阻塞转换器的自定义转换器时,FME 会提示您导出自定义转换器,并显示以下消息:此消息指出,要使用此转换器,需要将自定义转换器导出到外部 .fmx 文件:
在这里插入图片描述

导出文件后,可以使用带有循环的自定义转换器。
注意: 如果将阻塞转换器添加到包含循环端口的自定义转换器,则不会显示此消息。但是,您仍然可以导出自定义转换器。
2.在工作台中打开链接的自定义转换器(.fmx 文件)。在“导航窗口”中的“转换器属性”下,将“启用阻塞循环”参数设置为“是”并保存更改。
![在这里插入图片描述](https://img-blog.csdnimg.cn/d694c65299f9456f9fb561d2832f7f5a.png

注意: 当“启用阻塞循环”设置为“是”时,只允许一个 LOOP。
在链接的自定义转换器中启用“阻塞循环”时,转换器上会公开两个附加参数:最大迭代次数和用于保存迭代计数的属性:
在这里插入图片描述

这两个参数控制循环的执行次数,并有助于防止无限循环。
3.将此链接的自定义转换器插入到需要循环的工作空间中。将转换器添加到工作区时,它将显示为“已链接”。(如果没有,请右键单击插入的转换器,然后选择“链接”。
4.这个插入的链接自定义转换器将有一个额外的输出端口,称为不完整。您不能重命名此端口。自动创建它以路由满足循环条件但无法循环返回的要素,因为循环迭代计数已超过“最大迭代次数”的值。
注意: 链接的自定义转换器中的任何输入/输出端口都不能使用名称“不完整”。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值