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),一般可将其视为错误。随着像元大小的增大,数据集中的汇数一般也随之增多。ui

这一段话中包含了很是大的信息量:编码

  1. 产生汇的主要缘由之一就是DEM数据制做的时候采样效果和高程值设置为整数时致使的。这就是笔者在上一章中详细介绍制做适合于水文分析的DEM的缘由。有些参数的设置在测绘行业上生成DEM基本上是无所谓的,但对水文分析来讲就很是重要的。若是还有一些疑问,能够翻看上一章《ArcGIS水文分析实战教程(3)DEM数据准备》。若是能在DEM制做一环上已经对DEM数据进行控制,那是效果最好的。spa

  2. 冰川和喀斯特意形不适合使用ArcGIS水文分析。这主要是D8算法的缘由。code

  3. 像元大小小于10米的DEM数据不多天然产生汇。若是这种精度的数据都产生了汇,必定要检查这些汇是否是在现实中存在,经过叠加一些地形数据能够对比查看。不然就是数据中存在一些致命的错误。blog

  4. 像元大小增大,汇也随之增长。因此精度太差的数据实际上是不适合于作小河流或小流域的分析,由于汇的大量存在基本上上会致使一部分的径流断流,因为汇入大江大河的径流会比较多,因此,针对必定级别的河流,仍是具备参考价值。教程

如下是汇的剖面图

因为汇的地势都低于周边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官方的帮助,都没有具体说明使用【汇】工具以后找到汇后做什么样的处理。大部分人的处理更是简单粗暴,有汇即填洼,也无论具体哪里须要怎么填洼,填洼完以后直接进入分析环节。

笔者花了很多时间来研究其汇和填洼的原理,总结出如下步骤:

  1. 寻找汇
    寻找汇相对来讲比较简单,先经过DEM计算流向,而后直接使用【汇】工具进行查找,最终汇得出汇的栅格数据,以下图,使用的是ArcGIS spatial中自带的DEM数据进行分析。

图上叠加了第一次查找汇的栅格,发亮部分的点就是凹陷点,若是放大一点显示,那么能够清楚看到其像元形状,以下图

  1. 计算出Z值限制

  2. 限制指定凹陷点深度和倾泻点间的最大容许差值并肯定要填充的凹陷点和保持不变的凹陷点。z 限制并不是要填充的最大深度。

从描述来看,Z值限制要作的事情就是确保填洼工具不要一刀切,不要把全部的低洼点都填充,由于有些不是真的凹陷点;另外一做用就是符合条件的洼地都会被指定填充。
例如,假设一个凹陷点区域中倾泻点的高程为 210 英尺,凹陷点的最深点为 204 英尺(相差 6 英尺)。若是将 z 限制设置为 8,则会填充该特殊凹陷点。可是,若是将 z 限制设置为 4,则不会填充该凹陷点,由于该凹陷点的深度超过该限制值,将其视为有效凹陷点。

  1. 填洼
    填洼是地形处理中必不可少的一环。若是按照工具论,直接使用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 李远祥

相关文章
相关标签/搜索