FME模板兴趣班第十八期(面遮挡处理) 任务小结

班长欣欣

一、题目说明

对面进行遮挡处理,处理要求如下:

多个面之间存在压盖,要求压盖区域用Level高的遮挡Level低的,并将压盖区域从Level低的面中擦除。如下图所示:

    

面1、面2、面3 的Level分别是 80、90、100。

面1和面3的压盖区域为面4,则面4的Level为100,面4应从面1中擦除;

面2和面3的压盖区域为面5,则面5的Level为100,面5应从面2擦出;

最终得到的面1、2、3结果如下:

    

二、题目分析

按照本题目的要求,对数据进行遮挡处理时,重点在于两个方面:

1)当面有压盖时,要判断面重叠部分最大的Level级别,并将该级别作为重叠部分的Level

2)将重叠部分从Level级别低的面中擦除,只保留在Level级别最高的面中。

三、作业情况

本次一共收到26份作业,作业概括和分析如下:

序号

作者

主要方法

小结

转换器个数

推荐

1

刘足建

  1. 读入要素AreaOnAreaOverlayer进行面面压盖分析,并设置列表保存重叠面的所有属性;
  2. ListRangeExtractor提取列表中的最大Level值,将最大Level值作为重叠面的Level
  3. 使用DissolverLevel相同的进行融合

ListRangeExtractor只取最大的Level值,重叠部分的其他属性无法确保跟Level最大的面相同。Dissolver后得到的面属性可能有误。

4

 

2

努力的和尚哥

  1. 先用Sorter对所有要素按照Level级别升序排序;
  2. 使用AreaOnAreaOverlayer进行面面压盖分析;
  3. 使用DissolverLevel相同的进行融合

1)没有写模块,注意模板完整性。

2)利用FME要素处理机制,排序后让要素按照Level级别从低到高进入面面压盖,在面面压盖的时候直接让重叠部分带上最后一个要素的属性。即Level级别最高的面的属性。然后通过Dissolver

3

推荐有一定FME基础的人学习

3

伸手摘星

  1. 使用AreaOnAreaOverlayer进行面面压盖分析,并设置列表保存重叠面的所有属性;
  2. TestFilter分析了list列表中0-2的三个要素分别最大的情况,再根据不同的情况使用AttributeCreator进行Level赋值;
  3. 使用DissolverLevel相同的进行融合

TestFilter分析列表具有特殊性,如果重叠面的压盖计数超过3,则不再适用。做模板的时候要考虑一下通用性。

可以了解一下List相关的转换器进行操作。

7

 

4

向左向右

  1. 使用AreaOnAreaOverlayer进行面面压盖分析,并设置列表保存重叠面的所有属性;
  2. 使用ListSorter按照Level最高进行排序,确保Level最大的为列表中的第1个元素
  3. 使用DissolverLevel相同的进行融合。Level值取列表第1个元素。

Dissolver合并分组的时候只需要考虑Level属性即可。其他属性可以不用选择

ListSorter之后对重叠面的用户属性进行重新赋值,无法确保Dissolver时候的属性。

3

 

5

刘振东

运算的结果正确,但是过程太复杂,而且没有注释,不太明白具体思路。

建议学习一下14的作业思路

17

 

6

徐文彬

  1. 读入要素AreaOnAreaOverlayer进行面面压盖分析,并设置列表保存重叠面的所有属性;
  2. ListRangeExtractor提取列表中的最大Level值,将最大Level值作为重叠面的Level
  3. 使用DissolverLevel相同的进行融合

ListRangeExtractor后的AttributeManager应该把所有用户属性赋值。

4

 

7

箜竹

  1. 使用Counter给每个要素赋BSM,再AreaOnAreaOverlayer通过overlap判断重叠部分的面,对重叠部分的面通过Tester判断列表中元素的Level值大小
  2. 保留Level值大的元素的BSM,通过Dissolver按照BSM分组合并

对重叠部分的面通过Tester判断列表中元素的Level值大小不够严谨,也只考虑了列表元素最多为3的情况。

而且Tester_2中的判断条件不够严谨。

9

 

8

森林木

  1. 对面进行压盖分析的步骤使用面转线、线相交打断、重构面、再与原始面进行裁剪完成;
  2. 使用统计和Tester提取Level最大的重叠面后,通过Dissovlver合并

面面分析的步骤用AreaOnAreaOverlayer即可完成,可以节省很多步骤。

8

 

9

魏文波

  1. AreaOnAreaOverlayer压盖后,使用Tester选出重叠部分
  2. 重叠部分使用ListSorterLevel值进行排序,获得重叠部分最大的Level
  3. 使用Dissolver进行分组合并

Counter这个转换器貌似多余了,

AttributeCreator获取第0个元素的属性时,应考虑把所有用户属性进行赋值。

另可以更简化,参考序号4的作业,思路基本一致。但是转换器更少。

6

 

10

东方牛仔

思路与方法与序号9的作业基本一致。排序后使用AttributeCopier获取了元素0的所有属性。

使用AttributeCopier可以确保Dissolver后的属性正确。

6

11

钱小将

  1. 先用Sorter对所有要素按照Level级别升序排序;
  2. 使用AreaOnAreaOverlayer进行面面压盖分析;
  3. 使用DissolverLevel相同的进行融合

跟序号2的作业方法一样,就不重复说明啦

3

推荐有一定FME基础的人学习

12

小迷糊

  1. 读入要素AreaOnAreaOverlayer进行面面压盖分析,并设置列表保存重叠面的所有属性;
  2. ListRangeExtractor提取列表中的最大Level值,将最大Level值作为重叠面的Level
  3. 使用DissolverLevel相同的进行融合

ListSorter后没有对重叠部分的其他属性做处理,Dissolver之后的属性可能有问题。

提交的模板中有两条连接线还是禁用状态,下次注意哦。

 

4

 

13

Because of you

  1. 使用AreaOnAreaOverlayer进行面面压盖分析,并设置列表保存重叠面的所有属性;
  2. 使用ListSorter按照Level最高进行排序,确保Level最大的为列表中的第1个元素
  3. 使用DissolverLevel相同的进行融合。Level值取列表第1个元素。

Counter貌似多余了

这样获取的几何图形没问题,但是ListSorter后没有对重叠部分的其他属性做处理,Dissolver之后的属性可能有问题。

模板最整洁,注释最清晰,点赞!

4

 

14

阿呆

循环的过程我没看明白……下次可以写个注释说明么……

 

5

 

15

比巴卜

  1. AreaOnAreaOverlayer压盖后,使用Tester选出重叠部分
  2. 重叠部分使用ListSorterLevel值进行排序,获得重叠部分最大的Level
  3. 使用Dissolver进行分组合并

这样获取的几何图形没问题,但是ListSorter后没有对重叠部分的其他属性做处理,Dissolver之后的属性可能有问题。

4

 

 

16

江树

  1. 先用Sorter对所有要素按照Level级别升序排序;
  2. 使用AreaOnAreaOverlayer进行面面压盖分析;
  3. 使用DissolverLevel相同的进行融合

Counter好像没必要,其他跟序号2的作业方法一样,就不重复说明啦

4

推荐有一定FME基础的人学习

17

  1. AreaOnAreaOverlayer压盖后,使用Tester选出重叠部分
  2. 重叠部分使用ListSorterLevel值进行排序,获得重叠部分最大的Level
  3. 使用Dissolver进行分组合并

使用ListIndexer可以保证重叠面获取所有属性。

 

有注释,很好。

18

杨忠智

  1. AreaOnAreaOverlayer通过overlap判断重叠部分的面;
  2. 对重叠部分的面通过ListSorter判断列表中元素的Level值大小,取大的为重叠面的Level
  3. 对所有面按照Level值进行融合

面面叠加后可以直接使用ListSorter

ListSorter后只取第0个元素的Level还不够严谨,重叠部分的其他属性无法确保跟Level最大的面相同。Dissolver后得到的面属性可能有误。

缺少写模块,下次加上哦。

 

 

19

①②③

  1. AreaOnAreaOverlayer压盖后,
  2. ListRangeExtractor提取列表中的最大Levelmax
  3. Dissolver直接使用max值分组合并

ListRangeExtractor只取最大的Level值,重叠部分的其他属性无法确保跟Level最大的面相同。Dissolver后得到的面属性可能有误。

3

 

20

D

  1. AreaOnAreaOverlayer压盖后,
  2. ListRangeExtractor提取列表中的最大Levelmax
  3. ListSearch查找max值元素的index
  4. Dissolver直接使用max值分组合并

如上。

ListSearch的结果没有用上。

5

 

21

Lee.Retin

  1. 先用Sorter对所有要素按照Level级别升序排序;
  2. 使用AreaOnAreaOverlayer进行面面压盖分析;
  3. 使用DissolverLevel相同的进行融合

跟序号2的作业方法一样,就不重复说明了

3

推荐有一定FME基础的人学习

22

活力贝贝

  1. 先用Sorter对所有要素按照Level级别升序排序;
  2. 使用AreaOnAreaOverlayer进行面面压盖分析;
  3. 使用DissolverLevel相同的进行融合

跟序号2的作业方法一样,就不重复说明了。

有注释,更易理解!

3

推荐有一定FME基础的人学习

23

上来透口气

  1. 使用AreaOnAreaOverlayer进行面面压盖分析;
  2. Tester判断overlap,对重叠部分和非重叠部分分别处理。对重叠部分通过自定义转换器利用Python代码处理,找到Level最大的
  3. 使用Dissolver进行合并

对重叠部分的处理,使用List的转换器即可。

 

5+1(自定义转换器)

 

24

桃子

用了两种方法:

Counter赋唯一标示

  1. 方法1:AreaOnAreaoverlayer做面面叠加,然后用对listLevel降序排序后,提取列表第1个元素的值,然后Dissolver进行合并
  2. 方法2:使用了Sorter降序对面排序,然后使用Clipper进行进行裁剪,确保重叠部分带上的属性为Level大的属性值,然后使用Dissolver合并

感谢提供两种思路

10

25

小胖纸

  1. 判断Level是否为数字
  2. AreaOnAreaoverlayer做面面叠加,通过overlap区分重叠部分和非重叠部分
  3. 对重叠部分用ListSorter降序排序后,去第0个元素的Level值作为重叠面的Level
  4. 最后使用DissolverLevel合并

ListSorter后只取第0个元素的Level还不够严谨,重叠部分的其他属性无法确保跟Level最大的面相同。Dissolver后得到的面属性可能有误。

7

 

26

熊阿大

  1. AreaOnAreaoverlayer做面面叠加
  2. ListRangeExtractor提取列表中的最大Level值,
  3. 使用Dissolver按最大Level值进行合并。

ListRangeExtractor只取最大的Level值,重叠部分的其他属性无法确保跟Level最大的面相同。Dissolver后得到的面属性可能有误。

5

 

 

四、小结

  1. 这次是作业最多的一次,感谢大家对FME的热爱。
  2. 这次作业从最后生成的几何图形来说,大家的结果几乎都正确。不过每次作业看得越多,我也会思考越多,考虑多了就会觉得有的方法不够严谨。比如说用AreaOnAreaOverlayer叠加后对List排序,但是排序之后只提取Level属性或者直接用列表Level进行融合。这样的思路乍看起来是OK的,但是如果我们再严谨一点,既然保留最大Level的部分,那如何保证Dissolver之后的属性跟原来一致呢?这个时候需要在Dissolver之前把素有用户属性对重叠部分重新赋值,会更严谨。 (我想大部分原因是因为题目没有强调这个,但是我觉得我们可以多考虑一点)。基于这个原因,所以我只推荐了能同时保证几何和属性的作业。
  3. 序号211162122的作业,先对Sorter按升序排序后叠加,可以保证Level最大的最后进入AreaOnAreaOverlayer,但是关于AreaOnAreaOverlayer属性设置的参数选项(如下):

    Use Attributes From One Feature 帮助文档的解释说的是“从一个代表性要素中获取所有属性”。这个代表要素是第一个要素还是最后一个要素没有给出答案。谁能帮我答疑解惑一下,有奖!

  4.   最后,我们第十九期任务马上就要发布了,你们期待吗?

点击下载:第十八期模版兴趣班(面遮挡处理)任务说明和共享作业

猜你喜欢

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