FME模板兴趣班第三期任务小结
作者:活力贝贝
第三期兴趣班的题目是群友投票选择的悬挂线的处理及修复,悬挂线是CAD采集数据中最容易出现的问题之一,而悬挂线也是CAD数据转入GIS后需要做的很重要的一环。悬挂未处理好,后期的由线构面就会出错,由点属性空间挂接就会有问题。
一、 本次任务要求
本期任务要求如下:
1、消除测试数据的出头线部分;修复线悬挂的部分。在修复过程中,剩余部分不允许有任何变动。
2、不改变数据的属性内容。
要求只有两点,可规则有五条:
规则 1:短于 50 米的过头线,需要去除过头部分。
规则 2:短线段,但两端都与其它线对象相交,需要保留
规则 3:间隔小于 10 米的悬挂线,需要自动延伸,当与规则 4 出现矛盾时,此规则优先。
规则 4:短于 50 米的断头线需要删除,但如果出现与规则 3 中 10 米内可以延伸到与其它线相交的情况时,优先延伸。
规则 5:线长度大于 50 米时且 10 米内可以延伸到与其它线相交的情况时必须延伸。
二、 任务分析
1、 悬挂线的几种情形
悬挂线:由于悬挂节点位置不同,主要体现有多边形不封闭、不及或过头、节点不重合(不接头)等几种情形。具体情形详见图一。
2、 如何找出悬挂线
从图一可以看出,悬挂线及悬挂节点,不论是过头或不及都有一个共同的特征,即悬挂线的端点只有一个节点,悬挂点下只有一条线。那么如何依据这个特征来提取我们所需要的数据呢?使用得比较多的一个转换器就是相交(Intersector)该转换器对所有的输入要素、断裂线和多边形,在发生相交处计算交点。
由上图可以看出,所有相交的地方和断裂的地方都生成了点,输出到了转换器的NODE输出端,而相交的线也在节点处打断,输出到了Intersected端口,这样就得到了所有的线和所有的节点。在此基础上,再使用PointOnLineOverlayer转换器执行点和线的压盖操作后,可以筛选出只有一条线压盖的端点,这个点就是悬挂节点。再用SpatialFilter转换器根据空间关系来筛选与悬挂节点有相交的线要素。
另外还有一种就是取线段的两头转换器的端点坐标后生成点,也就是利用CoordinateExtractor转换器获取序号0和-1的坐标后使用VertexCreator的replace模式生成点,后期再用PointOnLineOverlayer转换器筛选出只有一条线压盖的端点。
3、 如何延伸悬挂线
悬挂线找出来了,延伸的方法有两种,一种是使用转换器Extender对线状要素创建两点式延伸,依据悬挂点来判断延伸方向是否正确。另一种是依据悬挂点使用邻近查找,得到延伸后最近节点后进行延伸。
三、 模版性能分析汇总
由于原始数据量小,本次用来测试的数据,重新复制了几份,具体测试明细如下:
从数据统计结果看,运行效率最高的是@千浪的模版,内存占用最少的是@阿呆的模版,虽然统计数据可能会有一些偏差,但大体还是能发现一些问题的,例如@向左向右的模版,运行时间和内存占用都偏高,说明该模版存在优化的空间,经过分析,发现该模版中用来分析空间关系的转换器使用的是SpatialRelator,而其他人模版中,使用的是SpatialFilter,这两个转换器内存和效率差别怎么这么大呢,SpatialRelator是判定要素集之间的空间拓扑关系的转换器,也就是说通过这个转换器的元素,空间关系会形成一个列表挂接在元素上,而SpatialFilter是根据空间关系来筛选要素,执行效率自然高了许多。运行大数据转换时,特别要注意内存的消耗,由于兼容性和其他一些原因,目前使用得比较多的还是32位FME,内存节省一些,时间效率就能提高不少。@简单就好的模版,思路没有大问题,只是在细节使用上不够细心。FME的转换器不光选项多,输入和输出端口也不少,真正要熟悉,是需要一个过程的。
四、 结束语
模版兴趣班的目的,为了大家能够看到其他人的思路和想法,从而拓展自己的思路,学到更多的技巧。如果说FME10分钟是教会大家的招式,那么模版兴趣班就是把招式结合起来,教会大家套路,例如(罗汉拳、螳螂拳.....),谁能学到更多的招式呢?敬请期待下一期兴趣班内容。