原文发布时间:2017-12-29 10:40:09
原文地址:
https://knowledge.safe.com/articles/23184/example-using-the-clipper-transformer.html
下载
clippersfirst.fmwt
clippercreateaggregates.fmwt
介绍
转换器Clipper使用多个裁剪边界去裁剪多个要素,并把输出分成Inside和Outside两类.下述例子主要说明Clipper中"Clippers First"和"Create Aggregates"两个设置的作用。
描述
转换器Clipper使用多个裁剪边界(即Clipper)裁剪多个要素(即Clippee)。截止FME 2013,该转换器输出均为两类,在FME 2013之前,输出分为四类:
l Inside,clippee要素完全包含在一个clipper内。
l Outside,clippee要素完全落在所有的clipper之外。
l 与裁剪边界相交的clippee要素,被分成两部分,落在clipper要素内的部分通过Inside端口输出,落在clipper要素外的部分通过Outside端口
输出。
当clippee要素穿过某个clipper要素的边界时,它会被分成不同的部分。
"Clippees on Clipper Boundary"设置实现以下功能,与clipper边界重合的clippee要素应该从Inside输出,还是Outside输出。如果设置为"Treat as Inside and Outside",那么在该边界上的点和线段被复制,并输出到Inside和Outside端口。
Clippers First
在平常的使用中,转换器Clipper一次接受一个clipper或clippee要素,并将他们保存在内存中,直到整个组完成。然后,开始执行处理过程。该方式必须在内存中保存要素,因为在没有把所有的clipper要素读完之前,处理过程是无法开始的。而且,也没有办法知道它什么时候开始。
"Clippers First"设置(Clipper Type选项)告诉FME,数据流顺序是
A.所有的Clipper要素,然后
B.所有的Clippee要素
转换器Clipper仍然和以前一样,一次读入一个要素,不同的是,一旦遇到clippee要素,它便假设clipper集合是已经读完的。然后,它就开始一个一个处理clippee要素,而不再将整个组保存到内存里面。存储在内存里的只有clipper要素——通常这些要素非常少。
因此,用户如何确保所有的clipper要素都提前到达呢?这里提供三种方式:
1.通常将clipper和clippee要素保存在独立的数据集中,FME会按照navigation窗格中的显示顺序读取所有的数据集。顶端的数据最先读。因此,将clipper代表的数据集移到最顶端(右键点击该读模块,并选择"move up in list"),用户就可以强制先读这些要素。
2.如果clipper要素保存在相同的数据流中(但是在进入转换器Clipper之前,被分开了),那么,可以使用转换器Sorter将clipper要素设置到clippee要素之前。
3.将转换器FeatureHolder放置在clippee端口之前也是替代Sorter的一种方案。
当使用上述方式时,转换器Clipper可用来替代转换器PointOnAreaOverlayer。
Clippers First示例
附件的工作空间(clippersfirst.fmwt)给出使用转换器Clipper的一个示例。
该例子主要说明Clippers First的作用。通过强制clipper先到达,转换器Clipper可以立即处理clippee要素。如果不设置成Clippers First的话(比如设置成Multiple Clippers),转换器会缓存所有传入的要素,因为它不确定是否还有clipper要素到达。这么设置的好处是提高性能——处理过程更快,并且使用更少的内存。
这里,我们通过在Creator_2(创建clippee要素)中设置"Create at End"为"Yes",强制clipper要素先到达。
日志文件-内存使用情况
日志文件记录了在转换过程中的内存使用情况:
Multiple Clippers:
Clippers First:
这里的好消息是多重的:它不但表明转换速度更快(57s vs 43s),也证明内存的减少(减少了接近85%)。
注意,这些数字可能因你的机器和安装的FME版本而有所不同。
意想不到的Aggregates
注意,如果一个要素分裂成多个部分,并且不止一个部分落在裁剪边界内(比如,一个线要素在clipper要素的多个位置游走穿越),你会得到一个聚合(aggregate)要素,该聚合要素由每个clipper要素内部的clippee要素构成。
这将会很有用。但是,当你不知道聚合存在的时候,也会是一个问题(比如,将聚合要素写出到DXF中,你会得到insert要素而不是单独的线要素)。
聚合示例
附件里的工作空间(ClipperCreateAggregates.fmwt)给出使用转换器Clipper的例子。
这个例子使用Create Aggregates设置。这里的clippee要素多次穿越clipper要素。当 Create Aggregates = Yes时,则产生一个聚合要素。
输出截图
Create Aggregates = Yes,在Outside端口生成了一个聚合要素。点击查询时,它们将都被选中(绿色部分)。Inside部分也同样地分为一组。
Create Aggregates = No,查询Outside部分时(绿色部分),则是一个单独的要素。Inside部分也同样是分离的。