ArcGIS空间分析的一个特别好的分析教程是汤国安老师的空间分析的内容。
实例与练习
练习1. 利用水文分析方法提取山脊、山谷线
1. 背景:山脊线、山谷线是地形特征线,它们对地形、地貌具有一定的控制作用。它们与山顶点、谷底点以及鞍部点等一起构成了地形及其起伏变化的骨架结构。因此在数字地形分析中,山脊线和山谷线以及地形特征点等的提取和分析是很有必要的。
2. 目的:理解基于DEM结合水文分析的方法提取出研究区域的山脊线和山谷线的原理;掌握水流方向、汇流累积量的提取方法以及它们的提取原理;能将水文分析的方法和其它的空间分析方法相结合以解决应用问题。
3. 要求:
(1)利用水文分析思想和工具提取研究区域的山脊线;
(2)利用水文分析思想和工具提取研究区域的山谷线。
4.数据:一幅25m分辨率的黄土地貌DEM数据,数据的区域大概有140 km2。数据存放于…/ChP11/Ex1中,请将其拷贝到E:/ChP11/Ex1。结果数据保存在…/ChP11/Ex1/Result中。
5.算法思想:
基于DEM的这种地形表面流水物理模拟分析的原理是:对于山脊线而言,由于它同时也是分水线,那么对于分水线上的那些栅格,由于分水线的性质是水流的起源点,通过地表径流模拟计算之后这些栅格的水流方向都应该只具有流出方向而不存在流入方向,也就是其栅格的汇流累积量为零。通过对零值的汇流累积值的栅格的提取,就可以得到分水线,也就得到了山脊线;对于山谷线而言,由于其具有汇水的性质,那么对于山谷线的提取,可以利用反地形的特点,即是利用一个较大的数值减去原始的DEM数据,而得到了与原始地形完全相反的地形数据,也就是原始的DEM中的山脊变成负地形的山谷,而原始DEM中的山谷在负地形中就变成了山脊,那么,山谷线的提取就可以在负地形中利用提取山脊线的方法进行提取。
山脊线=分水线=水流起源点=只有流出方向=栅格汇流累积量为零
山谷线=反地形的山脊线
基于DEM利用水文分析的方法提取山脊线和山谷的技术流程如图1所示。
6. 操作步骤
正负地形的提取
1) 启动ArcToolbox,展开Analysis Tools工具箱,打开hydrology工具集。在图层管理器中加载研究区域的原始DEM数据,如图2所示。图2 研究区域的DEM数据
2) 加载Spatial Analyst模块,点击Spatial Analyst模块的下拉箭头,点击neighborhood statistics菜单工具,利用邻域分析的方法以11×11的窗口计算平均值。分析结果命名为meandem。
3) 点击spatial analyst中的raster calculator菜单工具,对原始DEM数据与邻域分析之后的数据meandem做减法运算,并将运算结果重分为两级,分级界线为0,那么大于0的区域在原始DEM上就是正地形区域,小于0的区域在原始DEM上就是负地形区域。
4) 对上一步得到的二值化数据进行两次重分类,一次将正地形区域属性值赋值为1,负地形区域属性赋值为0,命名为zhengdixing;另一次将正地形区域属性值赋值为0,负地形区域属性赋值为1,命名为fudixing。分别如图3、图4所示。
山脊线的提取
1) 在ArcMap中加载研究区域的原始DEM数据,如图2所示。
2) 洼地填充:双击hydrology工具集中的fill工具,进行原始DEM的洼地点填充。在Input surface raster文本框中选择原始DEM数据dem,将输出数据命名为filldem,因为选择的是将所有洼地全部填充,所有在填充容限Z limit为默认值。
3) 基于无洼地的水流方向的计算:双击hydrology工具集中的flow direction工具,在Input surface raster文本框中选择填充过的无洼地DEM数据filldem,将输出的水流方向数据命名为flowdirfill。
4) 汇流累积量的计算:双击hydrology工具集中的flow accumulation工具。选择flowdirfill作为输入的水流方向数据;输出数据命名为flowacc1。
5) 汇流累积量零值的提取:加载Spatial Analyst模块,点击Spatial Analyst模块的下拉箭头,然后单击raster calculator菜单,打开栅格计算对话框,在文本框中填写汇流累积量零值的提取公式:facc0 = (flowacc = 0),然后点击evaluate进行计算。计算结果为所有的汇流累积量为0的栅格。
6) 在ArcMap中打开facc0,发现所提取出的栅格很乱,有很多的地方并不是山脊线的位置,因此应对这个数据进行处理。处理过程可以利用邻域分析的方法,对提取出的汇流累积量等于零值的数据进行3×3邻域分析进行光滑处理,处理后的数据命名为neiborfacc0。
7) 单击spatial analyst模块中的surfer analyst中的countline和hillshade菜单命令,分别生成原始DEM的等值线图ctour和晕渲图hillshade。
8) 打开neiborfacc0数据的属性信息,进行重新分类,将分类级别设置为两类,不断的调整分界数据大小,并以由DEM生成的等值线图和晕渲图为辅助判断数据。在neiborfacc0中,属性值越接近于1的栅格越有可能是山脊线的位置,这里确定的分界阈值为0.5541。
9) 将进行过二值化的neiborfacc0进行重分类为reneibor,将属性值接近1的那一类的属性值赋值为1,其余的赋值为0。
10)将重分类过后的neiborfacc0数据与正地形数据zhengdixing利用spatial analyst菜单下的raster calculator进行相乘运算,这样就消除了那些存在在负地形区域中的错误的山脊线。然后将计算结果进行重分类,所有属性不为1的栅格属性值赋为NO DATA。就得到了山脊线,如图5所示。
山谷线的提取
1) 在ArcMap中加载原始DEM数据,如图2所示。
2) 加载Spatial Analyst模块,点击Spatial Analyst模块的下拉箭头,点击options raster calculator菜单工具,打开栅格计算对话框;在文本框中填写反地形的计算公式:fandem =Abs (dem-2000),点击evaluate进行计算。计算结果与原始DEM地形完全相反的反地形数据,如图6所示。
3) 反地形计算完毕之后,山谷线的提取就和山脊线的提取步骤一样的,直到最终利用重分类的方法将重新分级的邻域分析后的结果二值化为止。在这里,是不需要对反地形DEM进行洼地填充的。计算过程中的数据名称分别为:水流方向数据为flowdirfan,汇流累积数据为flowacc2,零值汇流累积量提取数据为flowacc0fan,对flowacc0fan进行均值3×3邻域分析后的结果数据为nbfacc0fan,并将其分级改为两级,分级阈值为0.65677。
4)将重分类过后的数据与负地形数据fudixing利用spatial analyst菜单下的raster calculator进行相乘运算,这样就消除了那些存在在负地形区域中的错误的山脊线。然后将计算结果进行重分类,所有属性不为1的栅格属性值赋为NO DATA。就得到了山谷线,如图7所示。
图7 计算出的研究区域的山谷线(图中深色区域,背景为该区域的晕渲图)