Clipper转换器使用示例

原文发布时间:2017-12-29 10:40:09

原文地址

https://knowledge.safe.com/articles/23184/example-using-the-clipper-transformer.html

下载

clippersfirst.fmwt

clippercreateaggregates.fmwt

介绍

   转换器Clipper使用多个裁剪边界去裁剪多个要素,并把输出分成InsideOutside两类.下述例子主要说明Clipper"Clippers First""Create Aggregates"两个设置的作用。

描述

   转换器Clipper使用多个裁剪边界(Clipper)裁剪多个要素(Clippee)。截止FME 2013,该转换器输出均为两类,在FME 2013之前,输出分为四类:

Insideclippee要素完全包含在一个clipper内。

Outsideclippee要素完全落在所有的clipper之外。

与裁剪边界相交的clippee要素,被分成两部分,落在clipper要素内的部分通过Inside端口输出,落在clipper要素外的部分通过Outside端口

输出。

clippee要素穿过某个clipper要素的边界时,它会被分成不同的部分。

   "Clippees on Clipper Boundary"设置实现以下功能,与clipper边界重合的clippee要素应该从Inside输出,还是Outside输出。如果设置为"Treat as Inside and Outside",那么在该边界上的点和线段被复制,并输出到InsideOutside端口。

Clippers First

   在平常的使用中,转换器Clipper一次接受一个clipperclippee要素,并将他们保存在内存中,直到整个组完成。然后,开始执行处理过程。该方式必须在内存中保存要素,因为在没有把所有的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要素先到达。

Clipper转换器使用示例_第1张图片

  

日志文件-内存使用情况

   日志文件记录了在转换过程中的内存使用情况:

Multiple Clippers

Clipper转换器使用示例_第2张图片

  

Clippers First

Clipper转换器使用示例_第3张图片

  

   这里的好消息是多重的:它不但表明转换速度更快(57s vs 43s),也证明内存的减少(减少了接近85%)

   注意,这些数字可能因你的机器和安装的FME版本而有所不同。

意想不到的Aggregates

   注意,如果一个要素分裂成多个部分,并且不止一个部分落在裁剪边界内(比如,一个线要素在clipper要素的多个位置游走穿越),你会得到一个聚合(aggregate)要素,该聚合要素由每个clipper要素内部的clippee要素构成。

   这将会很有用。但是,当你不知道聚合存在的时候,也会是一个问题(比如,将聚合要素写出到DXF中,你会得到insert要素而不是单独的线要素)

聚合示例

   附件里的工作空间(ClipperCreateAggregates.fmwt)给出使用转换器Clipper的例子。

   这个例子使用Create Aggregates设置。这里的clippee要素多次穿越clipper要素。当 Create Aggregates = Yes时,则产生一个聚合要素。

Clipper转换器使用示例_第4张图片

  

输出截图

   Create Aggregates = Yes,在Outside端口生成了一个聚合要素。点击查询时,它们将都被选中(绿色部分)Inside部分也同样地分为一组。

Clipper转换器使用示例_第5张图片

  

   Create Aggregates = No,查询Outside部分时(绿色部分),则是一个单独的要素。Inside部分也同样是分离的。

Clipper转换器使用示例_第6张图片

你可能感兴趣的:(默认分类)