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

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

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

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

FME利用DEM高程数据,提取建筑面
在FME里有一个RasterToPolygonCoercer转换器,可以将栅格数据转换成对应的面数据,并且融合周边输出的要素。参数设置如下:
FME利用DEM高程数据,提取建筑面
运行效果如下:
FME利用DEM高程数据,提取建筑面
可以看到,它以不同高程值将栅格数据转换成了一个个的面要素,并且将其高程数据输出为_lable属性。如果附近的高程值一样,则将其面融合。

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

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

其DIssover转换器参数设置如下:
FME利用DEM高程数据,提取建筑面
为了加快融合效率,我用Buffer做了一个缓冲,如果不需要的,可以这略过一步。

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

FME利用DEM高程数据,提取建筑面
经过上一步的操作,最终生了我需要的面要素,每个面内的list数组中,存储了我融合之前的所有要素的高程值,下一步就是将这些属性提取出来。
FME利用DEM高程数据,提取建筑面
先用ListSorter,给数组按从小到大排个序,我要的最小值就是数组的第一个值“list{0}._label” ,而最大值就是数组最后一位。

FME利用DEM高程数据,提取建筑面
要获取数组最后一位,就需要知道数组的长度,ListElementCounter可以获取数组长度,用数组的长度减一则是数组的最后一位所在的索引。我们用一个_counter接收其数组长度即可。(我感觉我写的好啰嗦啊,囧!)
FME利用DEM高程数据,提取建筑面
最终结果如下:
接下来就是用AttributeCreator创建最大最小属性,然后给其赋值。,因为图省事,我只用了一个转换器,所以里面的函数会稍微有一点复杂,对小白不是那么友好。

首先,min_level,直接给其赋值为“list{0}._label”就可以了。max_level需要线算出数组长度减一的值,数字加减用“@Evaluate()”函数,里面填上需要计算的数值,即为“@Value(_count)-1)”。然后再用list{}._label包裹起来,最终函数为:“@Value(list{@Evaluate(@Value(_count)-1)}._label)”
FME利用DEM高程数据,提取建筑面
再用AttributeRemover清理掉你不需要的属性。
输出最终结果如下,大功告成,打完收工!!!
FME利用DEM高程数据,提取建筑面
第一次写自己的个人博客,我还是没有做好定位,到底是面向FME小白,还是有一些FME基础的新手,有的时候我觉得写的太罗嗦,有的时候可能该讲的东西又有些粗略,导致比较杂乱,还请大家海涵。

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

如果有感兴趣的,可以关注我的个人公众号:不务正业的GISER,我会不定期推送一些GIS方面的小知识。

最后,附上本文模版链接:
链接:https://pan.baidu.com/s/1ozxm-_-cb2H5pDu5S0Tdmg
提取码:ee1s
FME利用DEM高程数据,提取建筑面