ArcGIS水文分析实战教程(4)地形预处理
目录
ArcGIS水文分析实战教程(4)地形预处理
本章导读:ArcGIS的水文分析工具是基于DEM进行地表水流动的模拟,其本身不涉及到精确数值的水流流量。在形成径流的过程中考虑的全是地形因素,D8单流向算法决定了其必须针对无凹陷的DEM数据才能正确的分析出结果。在上一章中笔者已经就如何制作适合于ArcGIS水文分析的DEM数据。在本章中笔者将会介绍如何针对已有的DEM进行预处理,制作出适合水文分析的无凹陷DEM数据。BY 李远祥
在ArcGIS原生的水文分析工具中包含两个常用的地形分析工具:汇、填洼。
###汇
什么是汇?ArcGIS的是根据其D8算法来解释了。在第二章《ArcGIS水文分析实战教程(2)ArcGIS水文分析工具的基本原理》是笔者不厌其烦的解释过。
汇是指流向栅格中流向无法被赋予八个有效值之一的一个或一组空间连接像元。汇被视为具有未定义的流向,并被赋予等于其可能方向总和的值。例如,如果最陡下落及其产生的流向都是向右 (1) 和向左 (16),则会分配值 17 作为该像元的流向。
在介绍ArcGIS流向分析算法的时候那个流向九宫格其定义是2的n次方,所以,通过汇的计算之后形成的栅格数据,可以通过其值反演出汇所在的方位。对于分析人员来说没什么作用,但对于后续编写程序的人员去改进水文分析是非常重要的。
下面这一段也是ArcGIS帮助的描述:
导致高程数据中出现汇的最常见原因是数据内存在错误。采样效果和将高程取舍为整数通常是产生此类错误的原因。除了在冰川和卡斯特地貌区,在像元大小为 10 米或更大的高程数据中出现自然产生的汇极其罕见 (Mark 1988),通常可将其视为错误。随着像元大小的增大,数据集中的汇数通常也随之增多。
这一段话中包含了非常大的信息量:
- 产生汇的主要原因之一就是DEM数据制作的时候采样效果和高程值设置为整数时导致的。这就是笔者在上一章中详细介绍制作适合于水文分析的DEM的原因。有些参数的设置在测绘行业上生成DEM基本上是无所谓的,但对水文分析来说就非常重要的。如果还有一些疑问,可以翻看上一章《ArcGIS水文分析实战教程(3)DEM数据准备》。如果能在DEM制作一环上已经对DEM数据进行控制,那是效果最好的。
- 冰川和喀斯特地形不适合使用ArcGIS水文分析。这主要是D8算法的原因。
- 像元大小小于10米的DEM数据很少自然产生汇。如果这种精度的数据都产生了汇,一定要检查这些汇是不是在现实中存在,通过叠加一些地形数据可以对比查看。否则就是数据中存在一些致命的错误。
- 像元大小增大,汇也随之增加。所以精度太差的数据其实是不适合于做小河流或小流域的分析,因为汇的大量存在基本上上会导致一部分的径流断流,由于汇入大江大河的径流会比较多,所以,针对一定级别的河流,还是具有参考价值。
以下是汇的剖面图
由于汇的地势都低于周边8个区域,所以水流都会汇入其中,导致径流最终断流。但现实中就算出现一些小的洼地,只要降水充足,这些洼地都会被填平,填满后径流将会继续往外流出。所以,D8算法就是假设有无限的降水,雨水不断的在地表形成径流。
###填洼
填平汇的过程就是填洼。ArcGIS中的填洼工具,使用与焦点流、流向、汇、分水岭和区域填充等工具等效的功能来定位和填充汇。该工具的执行过程会进行迭代,直到指定 z 限制内的所有汇均填充完毕。在填充汇的同时,可能会在填充区域的边界处创建其他汇,这些汇将在下个迭代中移除。
关于填洼工具,ArcGIS的帮助说明不算清楚。大概的原理还是基本说清楚的,就是将凹陷处填平。这个过程是一个迭代的过程,就是不断的检测汇周边的像元,填充完之后再次检查,知道指定的Z值限制内所有的汇填充完成。但关于Z值,很多人不清楚其原理。
接下来看看填洼工具的一些参数,如下图
填洼工具必填的两个参数,其一是DEM,这个DEM有可能是原始的DEM,还有可能是经过填洼之后还发现汇的DEM(也就是n次填洼后的DEM),其二是输出的路径。关于Z值限制,是个可选项,估计大部分人都看不懂这个可选项到底代表什么意思,到底怎么设置。这个Z值限制在下面再做介绍。
先来看一张非常经典的水分分析的流程图,这张图似乎被引用过无数次,但大部分人只是做了一个单向的操作。如下图
这张流程图左边部分是制作无凹陷点DEM数据的流程。这个过程其实是一个循环的过程,不断的填洼并重新判断是否存在汇,如果还存在汇,则继续填洼,直到出现无凹陷点DEM。从图上来看,这最起码是个多次填洼的过程,而大部分人的做法就是不管汇是否存在,做一次填洼后再进行后续的水文分析。
这种做法要两面看。如果DEM数据非常精确,是不会自然产生汇的,填洼的算法是迭代的算法,非常耗时和耗计算机资源,只要检查一下是否存在汇,如果没有,则可将原始的DEM数据作为无凹陷点DEM直接参与分析;如果存在汇,只是默认做一次填洼,且不设置任何的Z值限制的情况下,会默认将所有的洼地填平(包括了真的汇和实际存在的洼地),会直接影响径流的细节流向,即径流的线形形状(因为填洼周边的地形也会被填充改变,但径流的大致方向是不变的),对面积大的区域用作计算的时间非常长。使用Z值限制作为填洼的条件,其实是可以大量降低计算机的运算量,实现精确的填充。
精确填洼
直接使用填洼工具对DEM数据进行填洼,不管汇的情况,确实可以形成无凹陷点的DEM。但前面也提及到,如果只是负责填,但不是精确的填,大量的凹陷点被填平(这些凹陷点不一定就都是汇),会导致径流的线形形状与实际不符,在弯曲细节等会存在一定的损失。所以,如果水文分析人员要研究非常准确的地形与河流的关系,而不是单纯的河网拓扑关系,精确填洼就非常重要了。
ArcGIS原生的水文分析工具就只有几个,如果按照网上一些分析教程,只需要十来分钟就可以操作完。但这些教程,都只是涉及罪简单的操作,甚至大部分都是在校学生的实验报告,但从GIS实现角度上去阐述分析的过程,而不是从水文角度去思考,丧失了大量的原理和细节部分。而这些部分恰好就是水文研究人员需要去考虑的事情,一旦一些基本设置没做对,会导致整体的分析结果出现偏差。这就是笔者为什么要花大量的时间和精力去阐述ArcGIS水文分析工具的原理以及细节参数对水文研究的影响。
不管是网上关于ArcGIS水文分析的教程还是ArcGIS官方的帮助,都没有具体说明使用【汇】工具之后找到汇后作什么样的处理。大部分人的处理更是简单粗暴,有汇即填洼,也不管具体哪里需要怎么填洼,填洼完之后直接进入分析环节。
笔者花了不少时间来研究其汇和填洼的原理,总结出以下步骤:
- 寻找汇
寻找汇相对来说比较简单,先通过DEM计算流向,然后直接使用【汇】工具进行查找,最终汇得出汇的栅格数据,如下图,使用的是ArcGIS spatial中自带的DEM数据进行分析。
图上叠加了第一次查找汇的栅格,发亮部分的点就是凹陷点,如果放大一点显示,那么可以清楚看到其像元形状,如下图
-
计算出Z值限制
z 限制指定凹陷点深度和倾泻点间的最大允许差值并确定要填充的凹陷点和保持不变的凹陷点。z 限制并非要填充的最大深度。
从描述来看,Z值限制要做的事情就是确保填洼工具不要一刀切,不要把所有的低洼点都填充,因为有些不是真的凹陷点;另一作用就是符合条件的洼地都会被指定填充。
例如,假设一个凹陷点区域中倾泻点的高程为 210 英尺,凹陷点的最深点为 204 英尺(相差 6 英尺)。如果将 z 限制设置为 8,则会填充该特殊凹陷点。但是,如果将 z 限制设置为 4,则不会填充该凹陷点,因为该凹陷点的深度超过该限制值,将其视为有效凹陷点。 -
填洼
填洼是地形处理中必不可少的一环。如果按照工具论,直接使用ArcGIS的填洼工具的默认配置,可以对DEM数据进行无限量的填洼。但笔者不推荐这种方式,而且Esri也不推荐。
正确的填洼流程应该是先要计算出Z值限制,然后根据一个或者一组Z值限制进行精确填洼。关于Z值限制前面已经说得很清楚,在这个阈值范围内汇才会被填充。那么Z值限制怎么计算出来呢?在【汇】的原理里面,帮助有具体提及到,但都是使用arcpy脚本的形式进行计算。以下引用ArcGIS帮助的Z值计算流程:
-
使用汇创建通过深度进行编码的汇的栅格。
输入流向栅格数据:flowdir
输出栅格:汇点 -
使用分水岭为每个汇创建汇流区域栅格。
输入流向栅格数据:flowdir
输入栅格数据或要素类倾泻点数据:汇点
输出栅格:sink_areas -
将分区统计与最小值统计数据结合使用,以在每个汇的分水岭中创建最小高程的栅格。
输入栅格数据或要素区域数据:sink_areas
区域字段:值
输入赋值栅格:高程
输出栅格:sink_min
统计类型:MINIMUM -
使用区域填充在每个汇的分水岭中创建最大高程的栅格。
输入区域栅格数据:sink_areas
输入权重栅格数据:高程
输出栅格:sink_max -
使用减将最大值减去最小值以查找深度。
输入栅格数据 1:sink_max
输入栅格数据 2:sink_min
输出栅格:sink_depth
ArcPy的代码如下
sink_areas = Watershed(flowdir, sinks)
sink_min = ZonalStatistics(sink_areas, "Value", elevation, "Minimum")
sink_max = ZonalFill(sink_areas, elevation)
sink_depth = Minus(sink_max, sink_min)
为了与默认的填洼工具的结果进行对比,笔者特意针对该流程,使用modelbuilder进行了建模,以求出Z值限制。建模流程如下图
最后求出的是一组Z值限制,最大的Z值为32,最小是1,共有20处限制值。如下图所示
这里存在一个疑问,笔者寻遍整个官方帮助文档都没找到,就是如果出来的是一组的Z值限制,而不是一个Z值限制,那么怎么做?填洼工具只是提供一个Z值的输入,而且是针对整个DEM区域,而不是分片区填洼。为此笔者专门做了不少的测试,最后的结论是,直接使用这一组Z值限制里面最大值+1。也就是说该例子中20个值最大为32,那么填洼工具中使用的限制值设置为33。只要比地图单位大1点就行了,但不要使用浮点型数据。
笔者做了几组测试
测试1:
对原始DEM数据进行无Z值限制填洼,直接执行填洼工具,使用默认设置,不设置Z值;
利用填洼完之后的DEM数据计算流向,并执行【汇】工具,发现所有的汇已经被填充,再也没有汇的存在了。如下图
测试2
对原始DEM数据进行有Z值限制的填洼,将Z值设置为33(之前已经计算出Z值最大值为32)。同样,对填洼过的DEM进行流向计算,并查找汇,发现存在汇,如下图
如果按照帮助里面的说明,只要设置了最大的Z值,应该会将所有的汇都填充掉,但事实上没有。唯一的解释了填充汇的同时又产生了新的汇。
测试3
使用笔者按流程做好的Z值计算工具,针对填洼限制值为33的DEM数据重新计算Z值限制,如下图
计算出来新的Z值为60,如下图
再利用61作为Z值限制重新对填洼为Z值为33的DEM数据进行再次填洼,并重新查找一次汇。这一次的结果没有再发现任何的汇,跟测试1同样的结果,如下图
测试4
流程与测试1一样,直接使用原始DEM数据填洼,但填洼的Z值限制一步到位设置为61,然后查找汇。结果跟预测的一样,所有的汇都被填充,如下图
测试5
该测试才是最后的测试结论,分别都这个产生无汇结果的填洼过的DEM数据进行对比,用减法工具执行。如果这些DEM是一样的话,减法的结果将会没有任何的数据。论证的目的在于设置Z值和不设置Z值到底有多大的差别。
第一组对比为测试1的无Z值填洼的DEM数据VS测试3的第二次填洼的DEM数据(Z值为61的那次),减法结果如下
减法的结果为0,也就是说这两个填洼后的栅格无凹陷点DEM是一模一样的。如下图
第二组对比为测试1的无Z值填洼的DEM数据VS测试4的直接使用Z值为61填洼的DEM数据。同样做减法,结果如下
结果同样是0,不用做第三组测试也知道测试2与测试3的填洼后的DEM也是一样的。
不知道是不是数据凑巧是这样还是ArcGIS软件在填洼的时候会自动计算最大的Z值限制,但确实按照其无凹陷DEM制作的流程进行多次填洼,知道无汇出现,跟没设置Z值效果是一样的。为此笔者再做一次大胆的尝试,就是将Z值限制调整为300,远远超出之前二次计算的60。
测试6
对原始DEM数据进行Z值为300的填洼,然后查找汇,结果显然也是完全被填充,不再存在汇;然后用减法对填洼后的数据与无Z值填洼的DEM数据做减法对比,结果为0。也就是说只要设定一个无限大的Z值,所有的汇都会被填充,然后构成无凹陷DEM数据前一步的填洼数据,与无Z值填洼结果是一样的。
因此,笔者可以大胆的猜测,无Z值填洼中应该使用了DEM数据最大高程减去最小高程的值作为Z值,这样能够确保在所有的汇的高差值全落在这个差值范围内。
###总结
通过6个测试和3次对比,基本上可以确定,精确计算Z值多次填洼与不设置Z值填洼效果是等价的。基本上可以确定如果要生成无凹陷DEM,直接使用填洼工具做一次无Z值填洼即可。ArcGIS的创建无凹陷DEM方法是从8.x时代就传下来的,笔者的测试版本是10.5,估计填洼工具早已经实现了自动化计算Z值以及自动迭代操作,只是工具帮助上没有作更新的说明罢了。因此,在使用ArcGIS水文分析之前可以大胆的对原始DEM数据做无Z值限制的填洼操作。
本章信息量有点大,主要是笔者也想进一步查清楚创建无凹陷DEM的原理以及工具的效果,希望能对广大的GIS和水文工作者有帮助。如果读者对水文分析感兴趣的话,可以持续关注CSDN的GIS制图乐园,以及微信公众号【GIS制图乐园】。BY 李远祥
转载自:https://blog.csdn.net/liyuanxiang1984/article/details/73824774