ArcMap水文分析全流程:从DEM预处理到流域图出图
发布时间:2026/10/3 1:20:27 作者:尧图编辑部 阅读量:1,286

第一次把DEM数据拖进ArcMap的时候我盯着那片灰绿色的栅格图心里只有一个问题这么一张看不出规律的高程图怎么才能变成报告里那种边界清晰、河网分明的流域图后来把ArcToolbox水文分析模块里的工具挨个试了一遍填洼、流向、流量累积、河网提取、盆域分析再到Layout视图排版出图折腾了两个星期终于输出了自己的第一张流域图。回头看核心链路其实非常固定真正的难点在于每一步的原理、参数和坑点。这篇就把从数据准备到出图的全过程完整梳理一遍给准备用ArcMap做水文分析的同学一条可以直接照着走的路线。1. 动手之前先想清楚流域图在表达什么1.1 流域图到底是什么流域学名叫drainage basin指的是地表水从分水岭两侧汇集到某一条河流或某个出水口所经过的整片区域。通俗一点说站在分水岭上往下撒一把沙子沙子最终会被哪条河带走那片面积就是这条河的流域范围。流域图就是把这种“水往哪儿流”的空间关系画成图纸。对于水利、环境、规划等领域的人来说流域边界是所有分析的基础洪水计算要它污染源分析要它水土保持措施布局也要它。ArcMap里的水文分析工具就是把“水往哪儿流”这件事用算法算出来再变成一张能交付的地图。1.2 为什么选ArcMap而不是其他工具现在能做流域提取的工具其实不少QGIS免费开源、ArcGIS Pro界面更现代、Python生态里的pysheds和WhiteboxTools效率也很高。但对于绝大多数需要把成果正式交付的工程场景来说ArcMap依然是使用率最高的桌面GIS软件。它的Spatial Analyst扩展模块里水文分析工具链非常完整从填洼到流域划分一步不缺而且每一步生成的中间结果都能可视化查看这对理解水文过程特别友好。再加上大量历史项目数据都是shp格式、组织内部的技术规程也围绕ArcGIS体系新手用ArcMap入门后续接项目、对接数据都会顺畅很多。1.3 完整链路是什么样整条生产链路可以概括为八个环节DEM获取与预处理填洼Fill流向计算Flow Direction流量累积Flow Accumulation阈值提取河网Con / Map Algebra河网矢量化Stream to Feature盆域分析Watershed制图出图Layout后面所有的内容基本就是围绕这条链路展开。虽然步骤固定但每步都有不少门道尤其是阈值怎么定、坐标系怎么选、填洼要不要限制深度这些参数直接决定最终流域图靠不靠谱。所以这篇不打算只给操作路径还会尽量讲清楚每个参数背后的逻辑。2. 数据准备DEM的质量决定后续所有环节的成败2.1 DEM从哪里来做水文分析必须有数字高程模型DEM。免费的数据源里我常用的有三个ASTER GDEM覆盖全球分辨率约30米国内用得很多SRTM同样是全球覆盖30米和90米两个版本都有精度比较稳定ALOS AW3D30日本JAXA发布的全球30米数据在山区的细节表现更好。国内下载的话地理空间数据云和USGS EarthExplorer都可以。需要注意一份DEM文件往往覆盖范围非常大如果你的研究区只是一个小流域建议下载后直接用Extract by Mask工具按研究区范围剪裁这样后续运算量会小很多ArcMap跑起来不容易卡处理速度有明显提升。2.2 坐标系最容易犯的第一个错误这一步我想单独拿出来说因为见过太多人在坐标系上栽跟头。拿到DEM之后第一件事不是急着算而是打开图层属性里的Source选项卡看它的坐标系到底是什么。水文分析要求数据必须是投影坐标系也就是单位是米而不是度。如果你的DEM是WGS84经纬度直接去做流向和流量累积结果完全没法看——流量累积出来的数值单位会变成“度”的累积根本不是汇水面积的概念。正确的做法是在ArcToolbox里使用Data Management Tools Projections and Transformations Raster Project Raster工具根据研究区的经纬度选择合适的分带国内一般用CGCS2000、WGS84或西安80的UTM分带或高斯-克吕格投影重采样方法选双线性插值Bilinear对DEM这种连续表面来说比最邻近法更平滑。2.3 投影转换与坐标单位的关系为什么必须做投影转换因为ArcMap的水文分析算法是基于栅格邻域高程差计算坡向和流向的只有单位统一为米坡度计算才真正有物理意义。如果数据还停留在经纬度一个像元的经度差和纬度差对应的地面距离完全不同算出来的“坡度”就是个没法解释的数。投影转换时还要注意带号UTM分带一个带是6度中国横跨多个带如果选错了带号图面位置会偏移几百公里生成的流域边界自然和真实地形对不上。转换完成后用Identify工具随便点几个像元确认属性值还是原始的高程值而不是被改过这步很容易被忽略但很值得做。2.4 检查DEM异常值DEM并不是拿来就能用的常见的问题有这么几类NODATA空洞部分区域没有数值在填洼的时候会导致流向计算出现异常值飞点或负值河湖区域的错误高程会形成虚假的洼地或突起边缘锯齿数据拼接处的接边错误同样影响流向判断。检查方法是加载DEM后在Layer Properties的Symbology里用拉伸显示并设成彩色渐变用眼睛扫一遍凡是出现明显不自然的色块或突变点就要回到原始数据确认。空洞不大的话可以用栅格计算器或Focal Statistics工具做邻域填充空洞太大则建议重新下载其他时相或数据源的产品硬填容易出现一个巨大的平底盆后续流向怎么算都不对。3. 水文分析核心链路填洼、流向、流量、阈值、河网3.1 Fill填洼为什么DEM不能直接拿来算流向DEM里几乎必然存在虚假洼地。所谓洼地就是周围像元高程都比它高的一小片区域。真实地形里确实有洼地比如湖泊、水库、封闭盆地但DEM中的大部分洼地来自数据噪声、插值误差或者采样分辨率不足它们会把水流“困”在原地导致流向中断。如果不做填洼后面流量累积的结果会在这里断掉河网变得支离破碎。填洼的原理其实很直白把所有比周围低、且没有出水口的像元高程提升到它能够流出到边界的最低高度直到该像元所在区域不再是一个“水塘”。ArcMap的Fill工具提供了Z limit参数默认是无穷大也就是把所有洼地一律填平。如果研究区里有大量人工湖或坑塘建议给Z limit设一个具体值比如10米只填平深度小于10米的洼地这样能在保留真实水体和消除噪声之间找到平衡。这个参数没有标准答案要结合你对研究区地形的了解来调我建议第一次先跑默认值观察河网断裂情况再决定要不要收紧。3.2 Flow Direction流向D8算法与方向编码填洼之后就可以计算流向。ArcMap用的是D8算法意思是从中心像元出发比较它周围8个邻域像元的高程找出坡度最陡的方向作为水流方向。方向不是用“东”“南”这样的文本存储的而是用2的幂编码编码值方向1东2东南4南8西南16西32西北64北128东北这个表在ArcMap的Flow Direction帮助文档里有刚开始看的时候容易记混后来发现记住“幂次按2倍递增方向从东开始逆时针转”就不会错。生成的流向栅格里每个像元的值就是上面这些编码之一。检查流向结果有个小技巧把流向栅格加上山体阴影做半透明叠加肉眼看颜色变化是否符合地形走向如果大片区域流向杂乱无章多半是DEM没填洼或者填洼参数不对。3.3 Flow Accumulation流量累积它到底在累积什么流量累积计算的是“有多少上游像元的水最终汇入当前像元”。原理是从分水岭的最高处开始每个像元把自身和所有上游汇入的水量相加传给下游方向编码所指向的邻域像元。最终河道的像元因为汇集了大量上游来水累积值会非常高山脊上的像元累积值则基本是1或者接近1。这里要区分两个常被混淆的点流量累积的单位不是立方米每秒它只是一个无量纲的“像元计数”如果你把DEM的重采样分辨率改了比如从30米重采样到10米相同区域的累积值并不会严格变成原来的9倍因为流向网络已经变了所以不要拿不同分辨率下的结果直接对比。流量累积结果出来后用彩色渲染能很直观地看到“树枝状”的河网纹理。这个纹理越明显说明DEM质量越高如果纹理模糊、河道忽断忽续那问题大概率出现在前面的填洼环节。3.4 阈值提取河网到底多少像元才算河流量累积栅格是连续的需要设定一个阈值大于等于这个阈值的像元判定为河流像元否则不是。这一步是水文分析里主观性最强的地方。阈值越小河网越密阈值越大河网越稀。以30米DEM为例我实际试过几种阈值阈值河网表现适用场景500河网很密冲沟和季节性细沟都会识别精细尺度的水系调查1000-2000主干和较大支流清晰碎屑适中1:5万制图、常规流域分析5000以上只剩主干河道支流大量消失区域尺度概化分析我的建议是不要凭空设打开一个阈值结果后叠加在线影像或者研究区已有水系矢量数据对比识别出来的河网和实际河流的重合度。多试几个阈值挑一个在“细碎程度”和“主干完整度”之间最平衡的。这一步值得多花一点时间因为河道范围直接决定后面每个子流域的边界。3.5 栅格计算器里的Con语句写法河网提取这一步大多数人用的是Spatial Analyst Tools Map Algebra Raster Calculator表达式写Con(FlowAcc 1000, 1)输出结果里值为1的像元就是河道其他像元是NoData。这样提取出来的河网栅格只有1和NoData两类值为下一步矢量化做准备。如果想保留河道对应的高程值或累积值也可以用嵌套写法Con(FlowAcc 1000, FlowAcc)这样输出的河道像元值就是流量累积值本身后面做河道分级时还能利用这个属性。注意栅格计算器里图层名要带双引号输入图层名称不能有空格和特殊字符否则容易报错这个细节能省不少调试时间。4. 从栅格到矢量河网矢量化与流域边界生成4.1 Stream to Feature让河道变成能编辑的线河网栅格虽然直观但不能直接用于制图和空间分析得转成矢量。用Spatial Analyst Tools Hydrology Stream to Feature输入河网栅格和流向栅格工具会自动根据流向方向把相邻的河道像元连接成连续的折线输出一个线要素类。这里有一个细节默认的Simplify简化选项建议保持勾选它能把锯齿状的网格路径尽量平滑成贴近真实河道走向的折线图形干净很多。如果不勾选输出的河网线会像楼梯一样一格一格地拐弯后续制图时非常难看。4.2 Stream Link给河网分段编号Stream Link工具会把河网从交汇处和源头处打断给每一段赋予唯一的编号。这个编号值在后面Watershed工具里会被当作汇水区的出水口标记也就是说每一段河网都会生成一个对应的子流域。如果只想要整个研究区作为一个大流域可以跳过Stream Link直接用一个点做盆域分析但大多数实际项目都需要子流域级别的结果比如要统计每个子流域的面积、坡度、土地利用比例所以Stream Link这一步很常用。4.3 Watershed盆域分析原理与操作Watershed工具的核心输入有两个流向栅格和汇水点栅格。汇水点栅格可以是Stream Link生成的河段编号也可以是自己设定的出水口点要素。它的原理是从每个汇水点出发沿流向栅格反向追踪所有最终流向这个汇水点的像元把这些像元合并成一个区域。操作路径是ArcToolbox Spatial Analyst Tools Hydrology Watershed。输入流向栅格和汇水点后输出就是流域栅格。需要注意汇水点必须落在流向栅格的有效像元上如果出水口点落在NoData区域工具会直接忽略它不报错但结果里就是没有这个流域。我第一次用的时候就遇到过这种情况明明设了三个出水口结果只出了两个子流域排查了半天才意识到其中一个点落在了DEM边缘的无值区。4.4 Raster to Polygon与边界清理流域栅格还需要转成面要素用Conversion Tools From Raster Raster to Polygon。转换出来的面会有两个问题一是碎屑多边形特别多二是边界呈锯齿状。处理方法有两种先用Spatial Analyst的Region Group把相邻的同值像元合并再转矢量碎屑会少很多转成矢量后用Cartographic Generalization工具集中的Simplify Polygon选择适当容差做化简边界会平滑很多。但简化容差不能设太大否则流域面积会失真一般控制在像元尺寸的0.5到1倍比较稳妥。以30米DEM为例容差设在15到30米之间既能消除锯齿又不至于把关键拐点拉直。4.5 小流域合并与属性计算如果最后想要的不是成百上千个细碎子流域而是几条主干河流对应的流域分区可以用Dissolve工具按某个属性字段合并。合并之后记得新建面积字段右键字段选Calculate Geometry算一遍面积单位选平方公里顺便检查各子流域面积之和与研究区总面积是否接近。如果偏差超过2%就要回头检查投影转换和边界清理环节有没有问题。这一步是很多人不会主动做的质量检查但做一次能让最终成果的可靠性高很多。5. 第一张流域图的出图排版从数据到能放进报告的地图5.1 从数据视图切到布局视图做图和出图是两个概念。ArcMap里数据视图Data View只负责看数据、做分析真正用来出图的是布局视图Layout View。在View Layout View切换后页面默认是A4纵向如果你要出的是标准报告插图建议在Page and Print Setup里把页面设置为A4横向或A3同时选好打印机驱动以便预览实际出图尺寸。我第一次出图时没设页面大小直接导出一张默认的A4纵向图结果流域图被压得非常扁重新调整布局又花了大半天。5.2 图框和图例的相对位置安排一个合格的流域图布局通常包含主数据框放流域边界、河网、出水口等核心要素辅助数据框研究区位置图缩略到省或市范围图例、比例尺、指北针、标题、制图人、日期。这些元素都通过Insert菜单插入。插入图例时有一个容易被忽略的细节ArcMap默认会把你数据框里的所有图层全部列进图例但很多中间图层比如填洼前的DEM、流向栅格不应该出现在图上。解决办法是在图例属性里逐项删除不需要的图层或者提前把数据框里不用的图层移除。比例尺要设置成“比例单位”与地图单位一致如果数据框是投影坐标系米制比例尺单位选公里数字比例尺会自动更新。指北针不要选太花哨的样式工程图纸里一个简单的实心箭头指北针就够用。5.3 网格线、标注与配色给地图加网格线有两种常见选择经纬网Graticule适合展示地理坐标一般在地理坐标系下加方里网Measured Grid适合展示投影坐标公里网格更符合工程图纸习惯。在Data Frame Properties的Grids选项卡里可以新建和编辑网格如果只需要外围一圈可以选择只显示边框而不显示内部经纬线。标注方面把流域编号如W1、W2和河流名称用Label标上出现重叠时手动调整位置。配色上流域面要素建议用带透明度的色块这样下面的DEM晕渲或山体阴影还能透出来河网用蓝色渐变线条主干河流用稍宽的线支流用细线层次分明之后整张图的阅读体验会好很多。5.4 导出高分辨率成果图布局调整好后用File Export Map导出。工程上建议导出成PDF或者TIFF分辨率设300dpi以上字体和线宽才不会出现显示问题。如果导出JPG尽量把压缩质量拉到80以上否则地图上的文字会糊成一片。导出前再用Layout视图的缩放工具检查一遍各元素有没有被裁切、压叠。我自己的习惯是先导出一次PDF预览确认再出最终版本避免反复改设置浪费时间。做第一张图的时候如果不确定分辨率宁可选高一些后期压缩容易但低分辨率后期放大很难补救。6. 我在做第一张流域图时踩过的坑附坐标点导入与数据库关联6.1 坐标系错乱的坑第一次做的时候我下载到的DEM投影坐标信息缺失ArcMap把坐标系显示为Unknown我直接算完所有水文分析结果流量累积的最大值只有几千怎么看怎么不对劲。后来对比已有水系才发现数据的实际投影是WGS84 UTM 50N但ArcMap按地理坐标处理了从流向到流域全盘错位。处理办法是在图层属性里先用Define Projection定义坐标系再用Project Raster转成目标投影。这个教训告诉我拿到任何数据第一步必须是确认坐标系绝不跳过。现在做项目我会在项目文件夹里专门建一个CRS.md文件把所有图层的坐标系信息记录清楚。6.2 填洼阈值过高导致河网异常在一个地势平坦的冲积平原区我用默认的填洼参数把所有洼地都填了结果提取出来的河网笔直得离谱完全无视实际地形。后来研究明白了平原地区本身地形起伏极小真实洼地被过度填平后流向只能沿着人为抬升后的“伪地形”走自然就出现大面积直线段。后来把Z limit设置为5米只填深度小于5米的洼地河网形状才恢复正常。这个案例让我意识到填洼不是“填得越干净越好”而是要在保留真实地形和消除噪声之间找平衡参数一定要根据地貌类型来调。6.3 NODATA空洞导致河网断裂研究区东南角的DEM有一片NODATA空洞填洼和流向计算都没有报错但流量累积在那片区域直接变成了NoData最后河网在空洞边缘断成好几截。这个坑非常隐蔽因为栅格显示时NoData默认是透明或白色不仔细看根本发现不了。排查方法是加载DEM后在图层属性里把NoData设成显眼的红色或者用IsNull函数生成一个空洞指示栅格先把数据质量修好再做分析。自那以后我做任何栅格分析前都会用IsNull做一次排查这个习惯帮我避免了很多后续返工。6.4 把Excel经纬度坐标点转成shp做流域图的同时我还有一个任务是叠加几个雨量站的实测数据这些站点位置在Excel表格里。ArcMap导入Excel不需要先转CSV直接用Add Data选择xlsx文件即可但表格必须有一列X坐标和一列Y坐标。右键表格选择Display XY DataX字段选经度Y字段选纬度坐标系设置成WGS84地理坐标再Export Data导出成shp。这一步看似简单但有一个常见坑Excel表格里经度纬度只要有一列有空格或者被识别成文本格式Display XY Data会直接报错或导入全0值最好先在Excel里确认两列都是数字格式再做导入。6.5 成果入库存PostgreSQL为后续Web发布做准备流域图和河网做出来之后如果只是自己出图shp文件够用。但如果后续要做Web地图、多人协作或者用ArcGIS Server发布服务建议把成果数据导入空间数据库。我这边实际项目里是用PostgreSQL 9.2配合PostGIS先在安装包里装好PostGIS扩展然后在ArcMap里用Catalog加Database Connection选择PostgreSQL类型填好主机名、端口默认5432、数据库名连接后右键数据集选择Load Data就可以把shp上传。导入完成后在PostGIS里用View Geometry工具检查坐标系和几何类型是否被正确识别避免后续服务发布时出现几何类型错乱。回想做第一张流域图的过程最有价值的不是那条漂亮的边界线而是把“数据—算法—制图”完整走一遍之后对水文分析链条的理解。这些坑大概率每个人都会遇到写出来给大家少走点弯路。如果你手上的DEM数据质量不错按上面的链路走下来基本上一天之内就能产出第一版流域图。接下来要调的无非是阈值和制图细节这些“手感”层面的东西。