今天分享的内容,是收到的FME作品集。相对上一篇推送的用R实现的方式,用FME实现的更多。 下面我将按照:整体思路、关键转换器的方式对各个作品进行逐一解读。 根据作者的意愿与我之前被白嫖的经历,本篇推送只分享思路,不分享具体的实现模板。
点是空间中只有位置,没有大小的图形 线是由点形成的图形,只具有位置和长度,没有宽度 面是由线围合而成的图形
总的来说,使用三角网思路来查找缝隙的作品比较多,有四个(加油_💯琦、傻狗、鹦鹉拔牙、以及我);使用缓冲区思路实现的有一个(凡尘);调用QGIS实现的有一个(悟空)。 下面对各个作品进行详细解读。
1、作者首先将待检查的面进行编号,赋予每个面一个唯一的ID,然后将面转成三角形; 2、然后通过空间分析的方式将三角形的边分成两部分:原面边线一致的,位于原来面内部的; 3、通过设置的值域(宽度小于60米),找出符合条件的内部边; 4、使用步骤三中的内部边,筛选出与之相邻的边(为后续的构面使用); 5、构面,并将相邻的小面融合在一起; 6、用空间裁切的方式,区分出狭长面和大面部分。
作者使用了三个SpatialFilter转换器,这几个转换器的参数设置有两种,一种是如下图所示的包含:
作者的第2步,使用如上图所示的参数将三角形的边分成了两部分。
上图的红色和水蓝色,是分别从转换器的两个端口输出的数据。需要知道,当线与面的边线重合的时候,那不叫包含,只能叫相交。
作者的另一种设置是相交
作者的第3步,使用空间相交的方式,过滤出了构成小面所需要的边。 这几个SpatialFilter转换器的使用,筛选出了狭长面相关的边,通过后续的构面处理,形成了狭长面,思路非常清晰,作品也很精彩,值得学习、借鉴。
在我的笔记本上,运行时间0.5s
从整体上来看,悟空这个思路复杂了不少,用的转换器也比较多。他将寻找分割线的计算,放到了Qgis中来计算。不过 1、计算面积、编号; 2、使用Qgis计算分割线; 3、过滤计算后的分割线,保留需要的部分; 4、把所有线放在一起打断、构面; 5、计算小面面积,并计算占比进行过滤; 6、使用面进行裁剪,分出大小面。
这位作者的重点转换器,是在QGIS里的这些计算,通过QGIS的计算,取出了分割线,后续通过构面、计算、裁切实现了狭长面的寻找
在我的笔记本上,运行时间1.1s
首先,凡尘这个排版就很清爽,一看就是个精致的人,非常棒!
1、将面打断为线段; 2、使用两次缓冲,提取出面主体部分; 3、使用空间计算,筛选出狭长部分的边线; 4、将边线碎线连接成长线段; 5、构面; 6、裁切并输出。
两个缓冲转换器的使用,非常精妙地去除了面的狭长部分。又用三个空间筛选,找出了狭长部分的边线。后续的捕捉,将开口的边线封闭起来,以便后续裁切。
在我的笔记本上,耗时0.7秒
作者也是使用三角网的方式来完成狭长面查找的,整体也比较清爽,大致思路如下: 1、分别将面拆分为三角面和线段; 2、将三角边拆分为线段,并按照线段的长度过滤出符合条件的边; 3、将边连接起来; 4、构面,并按照面积大小进行过滤; 5、融合小面,并对原始面进行裁切,输出大小面。
作者这里生成三角网用的是chopper,节点个数设置为4(鹦鹉拔牙也用的这种方式)
按照这样的方式打断之后,面就变成了三角面。
这跟Triangulator转换器的结果是一致的,都可以完成对大面的三角剖分。
在我的机器上,运行时间0.5秒
酒神不愧为神,除了三角网,基本就没用啥空间分析类的转换器,跟其他作品思路完全不一致,真棒!
1、分别按照打断面为线段和三角形; 2、计算三角形边长,并根据边长进行过滤; 3、构面; 4、计算面积,并统计面的平均数; 5、通过面积平均数,进行过滤; 6、将碎面融合输出,融合后的面,即为狭长面。
酒神这里统计了每个小面的面积,并计算了平均数,后面又根据平均数,区分出了狭长面,非常精彩!
1、将面剖分为三角形; 2、过滤出短边和内部边,和外边线; 3、根据长度过滤内部边; 4、将外部边、内部边连成长边; 5、计算边长度,并构面; 6、根据构面的每个边的边长,区分出大小面; 7、融合小面,并输出,输出的面,即为狭长面。
在这个转换器,保留了构面的每个边的边长,在后续通过计算面的最长部分边,来区分大小面。
在我的机器上,运行时间0.5秒
通过这次作品征集,我认识了一些新朋友。也从这些作者的思路中,学到了新知识。希望上面作者分享的思路,也能给各位读者一些启发。需要注意的是,这次征集的作品,都是针对样例数据(如图所示的几个面)的解决方案。在更换数据源的时候,上述方案可能会找得到狭长面,也可能找不到。
我希望以后的作品征集,能有更多的作者参与进来,我们一起来交流学习。