FME模板兴趣班第三期任务小结

作者:活力贝贝

第三期兴趣班的题目是群友投票选择的悬挂线的处理及修复,悬挂线是CAD采集数据中最容易出现的问题之一,而悬挂线也是CAD数据转入GIS后需要做的很重要的一环。悬挂未处理好,后期的由线构面就会出错,由点属性空间挂接就会有问题。

一、 本次任务要求

本期任务要求如下:

1、消除测试数据的出头线部分;修复线悬挂的部分。在修复过程中,剩余部分不允许有任何变动。

2、不改变数据的属性内容。

要求只有两点,可规则有五条:

规则 1:短于 50 米的过头线,需要去除过头部分。

规则 2:短线段,但两端都与其它线对象相交,需要保留

规则 3:间隔小于 10 米的悬挂线,需要自动延伸,当与规则 4 出现矛盾时,此规则优先。

规则 4:短于 50 米的断头线需要删除,但如果出现与规则 3 中 10 米内可以延伸到与其它线相交的情况时,优先延伸。

规则 5:线长度大于 50 米时且 10 米内可以延伸到与其它线相交的情况时必须延伸。

二、 任务分析

1、 悬挂线的几种情形

悬挂线:由于悬挂节点位置不同,主要体现有多边形不封闭、不及或过头、节点不重合(不接头)等几种情形。具体情形详见图一。

FME模板兴趣班第三期任务小结 - FME - FME—专业化的空间数据服务实践者

2、 如何找出悬挂线

从图一可以看出,悬挂线及悬挂节点,不论是过头或不及都有一个共同的特征,即悬挂线的端点只有一个节点,悬挂点下只有一条线。那么如何依据这个特征来提取我们所需要的数据呢?使用得比较多的一个转换器就是相交(Intersector)该转换器对所有的输入要素、断裂线和多边形,在发生相交处计算交点。

由上图可以看出,所有相交的地方和断裂的地方都生成了点,输出到了转换器的NODE输出端,而相交的线也在节点处打断,输出到了Intersected端口,这样就得到了所有的线和所有的节点。在此基础上,再使用PointOnLineOverlayer转换器执行点和线的压盖操作后,可以筛选出只有一条线压盖的端点,这个点就是悬挂节点。再用SpatialFilter转换器根据空间关系来筛选与悬挂节点有相交的线要素。

另外还有一种就是取线段的两头转换器的端点坐标后生成点,也就是利用CoordinateExtractor转换器获取序号0和-1的坐标后使用VertexCreator的replace模式生成点,后期再用PointOnLineOverlayer转换器筛选出只有一条线压盖的端点。

3、 如何延伸悬挂线

悬挂线找出来了,延伸的方法有两种,一种是使用转换器Extender对线状要素创建两点式延伸,依据悬挂点来判断延伸方向是否正确。另一种是依据悬挂点使用邻近查找,得到延伸后最近节点后进行延伸。

三、 模版性能分析汇总

由于原始数据量小,本次用来测试的数据,重新复制了几份,具体测试明细如下:


从数据统计结果看,运行效率最高的是@千浪的模版,内存占用最少的是@阿呆的模版,虽然统计数据可能会有一些偏差,但大体还是能发现一些问题的,例如@向左向右的模版,运行时间和内存占用都偏高,说明该模版存在优化的空间,经过分析,发现该模版中用来分析空间关系的转换器使用的是SpatialRelator,而其他人模版中,使用的是SpatialFilter,这两个转换器内存和效率差别怎么这么大呢,SpatialRelator是判定要素集之间的空间拓扑关系的转换器,也就是说通过这个转换器的元素,空间关系会形成一个列表挂接在元素上,而SpatialFilter是根据空间关系来筛选要素,执行效率自然高了许多。运行大数据转换时,特别要注意内存的消耗,由于兼容性和其他一些原因,目前使用得比较多的还是32位FME,内存节省一些,时间效率就能提高不少。@简单就好的模版,思路没有大问题,只是在细节使用上不够细心。FME的转换器不光选项多,输入和输出端口也不少,真正要熟悉,是需要一个过程的。

四、 结束语

模版兴趣班的目的,为了大家能够看到其他人的思路和想法,从而拓展自己的思路,学到更多的技巧。如果说FME10分钟是教会大家的招式,那么模版兴趣班就是把招式结合起来,教会大家套路,例如(罗汉拳、螳螂拳.....),谁能学到更多的招式呢?敬请期待下一期兴趣班内容。


猜你喜欢

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