FME利用DEM高程数据,提取建筑面

开此博客的目的就是记录我在生活,工作中做的一写技术方面的案例小总结,若是可以帮助到大家,那就更好了,我的目的也在于此。
由于本人接触GIS的时间也不长,在讲解的过程中可能会有很多错误,掺杂着我个人的一些不靠谱的想法(我不熟悉的东西会在文章中说出来,尽量不给大家误导)。
如有不足之处,还请大家指证,毕竟两年前的今天我还在大山里拿着锤子敲石头,干的体力活,头一次准备吃技术饭,哪里接触过这么高级的东西……
好了,废话不多说,正文开始:
首先,假设我有一个存储了地形高程的DEM数据,我要提取里面高度大于多少米的面数据,生成一个SHP数据,以供我进行别的数据分析。

1.将栅格数据转换成面数据,并进行融合

利用python提取dem影像的坡度 dem提取坡度大于25的面积_模版


在FME里有一个RasterToPolygonCoercer转换器,可以将栅格数据转换成对应的面数据,并且融合周边输出的要素。参数设置如下:

利用python提取dem影像的坡度 dem提取坡度大于25的面积_数组_02


运行效果如下:

利用python提取dem影像的坡度 dem提取坡度大于25的面积_利用python提取dem影像的坡度_03


可以看到,它以不同高程值将栅格数据转换成了一个个的面要素,并且将其高程数据输出为_lable属性。如果附近的高程值一样,则将其面融合。

然后用Tester转换器,过滤掉高程不符合我们需求的要素。

再Dissolver转换器进行融合,因为在融合后我需要提取该面的高程最大最小值,因此需要创建一个数组,保留融合前的每一个要素的_lable值。

其DIssover转换器参数设置如下:

利用python提取dem影像的坡度 dem提取坡度大于25的面积_gis_04


为了加快融合效率,我用Buffer做了一个缓冲,如果不需要的,可以这略过一步。

2.从list数组中还原面要素的最大最小值

利用python提取dem影像的坡度 dem提取坡度大于25的面积_数据_05


经过上一步的操作,最终生了我需要的面要素,每个面内的list数组中,存储了我融合之前的所有要素的高程值,下一步就是将这些属性提取出来。

利用python提取dem影像的坡度 dem提取坡度大于25的面积_利用python提取dem影像的坡度_06


先用ListSorter,给数组按从小到大排个序,我要的最小值就是数组的第一个值“list{0}._label” ,而最大值就是数组最后一位。

利用python提取dem影像的坡度 dem提取坡度大于25的面积_利用python提取dem影像的坡度_07


要获取数组最后一位,就需要知道数组的长度,ListElementCounter可以获取数组长度,用数组的长度减一则是数组的最后一位所在的索引。我们用一个_counter接收其数组长度即可。(我感觉我写的好啰嗦啊,囧!)

利用python提取dem影像的坡度 dem提取坡度大于25的面积_模版_08


最终结果如下:

接下来就是用AttributeCreator创建最大最小属性,然后给其赋值。,因为图省事,我只用了一个转换器,所以里面的函数会稍微有一点复杂,对小白不是那么友好。首先,min_level,直接给其赋值为“list{0}._label”就可以了。max_level需要线算出数组长度减一的值,数字加减用“@Evaluate()”函数,里面填上需要计算的数值,即为“@Value(_count)-1)”。然后再用list{}._label包裹起来,最终函数为:“@Value(list{@Evaluate(@Value(_count)-1)}._label)”

利用python提取dem影像的坡度 dem提取坡度大于25的面积_模版_09


再用AttributeRemover清理掉你不需要的属性。

输出最终结果如下,大功告成,打完收工!!!

利用python提取dem影像的坡度 dem提取坡度大于25的面积_利用python提取dem影像的坡度_10


第一次写自己的个人博客,我还是没有做好定位,到底是面向FME小白,还是有一些FME基础的新手,有的时候我觉得写的太罗嗦,有的时候可能该讲的东西又有些粗略,导致比较杂乱,还请大家海涵。

我下一步应该考虑在贴出原始模版,以供大家参考,所以,讲解的部分会在精简一些,模版功能也往更丰富一点的方向上靠。