HEC-RAS与GIS联动:洪水淹没分析全流程实战指南

HEC-RAS与GIS联动:洪水淹没分析全流程实战指南 干防洪这一行做洪水危险性评估我几乎每年都会被问到同一个问题HEC-RAS到底怎么和GIS联动起来才能快速出一张能用的洪水风险图很多刚接触的人把稳定流、非稳定流、DEM处理、断面提取、结果可视化当成几座独立的山头爬完一座发现下一座更陡。实际上HEC-RAS配合GIS做洪水淹没分析是一条可以被打通的固定流水线DEM准备、几何建模、水力计算、结果出图。这篇文章就按我从原始地形到风险图的完整流程把每个环节怎么操作、为什么这么做、踩过哪些坑一次讲清楚。适合正在做防洪评价、洪水危险性评估、城市内涝模拟或者GIS专业想切入水利场景的朋友。1. 洪水危险性评估的整体思路与方案选型1.1 为什么选择HEC-RAS定位与能力边界HEC-RAS最核心的能力是河渠水力计算它由美国陆军工程兵团水文工程中心开发维护在水利界基本是免费模型里的默认选项。它既能做稳定流模拟也能做非稳定流模拟既有传统的一维河道计算也有6.0版本之后逐步成熟的二维淹没模拟。对大多数洪水危险性评估项目来说一维稳定流或非稳定流已经能解决80%的问题二维更多用于精细的城市内涝和蓄滞洪区分析。选HEC-RAS而不是别的商业软件原因很现实一是免费对一个项目来说软件授权成本往往是压死骆驼的最后一根稻草二是结果认可度高评审专家对HEC-RAS的计算结果普遍习惯三是前后处理和GIS的衔接最顺HEC-GeoRAS和内置的RAS Mapper把数据交换做得相当成熟。它也有短板比如二维模块的前处理不如一些商业软件友好但做洪水危险性评估这条短板完全可以用流程标准化来弥补。1.2 稳定流还是非稳定流怎么选很多人卡在第一步我到底该算稳定流还是非稳定流我的判断标准很简单只关心“某频率洪水最大淹到哪、淹多深”用稳定流关心“洪水怎么演进、什么时候到、淹多久”用非稳定流。稳定流对应的是设计洪水推求比如百年一遇洪峰流量是1200 m³/s我就按这个固定流量算一条最大水面线得到淹没范围。它的计算原理是能量方程算得快、收敛稳定适用于大多数防洪评价和洪水风险图编制。非稳定流则要给定完整的流量过程线比如一场24小时的洪水从起涨到洪峰再到退水模型按圣维南方程组逐时刻求解能模拟出洪水波的传播过程适用于水库调度、演进分析、蓄滞洪区淹没过程等场景。对比项稳定流非稳定流适用场景设计洪水位、最大淹没范围洪水演进、调度方案、淹没过程边界条件固定流量、固定水位流量过程线、水位过程线计算原理能量方程连续性方程动量方程输出结果一条水面线多时刻水位、流量、淹没过程上手难度相对低相对高需要处理时间步长和初始条件1.3 GIS在整个流程中的角色GIS不是锦上添花而是HEC-RAS在地形处理上的必经之路。前处理阶段GIS负责把DEM变成模型认识的数据提取河道中心线、生成横断面、计算断面与主流向的距离、给不同土地利用区域赋糙率。后处理阶段GIS负责把模型计算结果变成空间上的淹没范围、水深栅格、流速分布再进一步做成危险性分级专题图。比较关键的一点是现在HEC-RAS 6.x内置的RAS Mapper已经能完成大部分前处理后处理很多人会问那还要ArcGIS或QGIS做什么我的经验是两个都要用RAS Mapper处理模型关联的地形和结果非常顺手但做地形预处理、填洼、土地利用整合、最终专题图输出GIS桌面软件灵活性更高。尤其是遇到投影不一致、要叠加多源数据出图时纯靠RAS Mapper会非常痛苦。2. 数据准备与GIS预处理打通坐标系和DEM2.1 标准数据清单开始建模之前先把数据清单列清楚不然做到一半发现缺数据返工成本很大。最基本的一套数据包括DEM栅格一个流域或工程段范围的数字高程模型、河道中心线矢量、横断面位置线、土地利用或植被覆盖数据用来赋糙率、设计洪峰流量或流量过程线、下游控制断面的水位或水位-流量关系。DEM的分辨率直接决定淹没范围的精度。做流域级洪水风险图30米分辨率勉强够看但断面和河道提取会显得粗糙做城区或重点河段的危险性评估最好有5米甚至1米分辨率的DEM有条件直接用机载LiDAR点云产出的高精度DEM。另一个容易被忽略的问题是范围DEM的范围一定要比你预测的淹没范围大一圈否则断面扩展不出去模拟时水会从模型边界“跑掉”结果明显偏小。2.2 DEM预处理与填洼DEM拿到手不能直接丢给HEC-RAS这里有两个必须处理的环节。第一是投影转换所有数据必须统一到一个投影坐标系下比如CGCS2000高斯投影或者UTM。如果不做投影转换直接用经纬度坐标跑模型横断面面积、河道长度都会被算歪最后淹没范围形状会很奇怪。第二是填洼DEM里的每个小坑都会截断水流导致河道不连续模型根本没法算。填洼的工具很多ArcGIS里用Spatial Analyst工具集的FillQGIS里可以用Whitebox Tools或者GRASS的r.fill.dir。填洼有一个细节不能对所有洼地一键填平。在高山区很多洼地其实是真实存在的封闭洼地填平后会改变真实水文情势。更稳妥的做法是“有条件的填洼”先分析哪些洼地是DEM噪声形成的、哪些是真实地形或者用河网burning的方式先把精确的河道矢量转成栅格把河道位置的DEM人为降低0.5到1米这样水流就有一条强制通道再去填洼出来的河网会和实际河道走向基本一致。2.3 提取河网与断面断面数据是HEC-RAS几何建模的核心。传统做法是在ArcGIS里安装HEC-GeoRAS扩展插件从DEM提取河流中心线、河岸线、洪水边界再画横断面线最后导出为RAS的几何文件。这套流程很成熟但刚上手容易在“河岸线”和“断面线”的关系上卡壳。其实HEC-GeoRAS的每个要素都有明确作用河流中心线决定河流走向和里程“河岸线”用来区分主槽和滩地“断面线”是每一处横断面的位置断面数据会沿中心线自动编号。新版本HEC-RAS 6.x里也可以用RAS Mapper直接在地形图上画中心线和断面不用先导出到ArcGIS这对快速建模很友好。但不管用哪种方式画断面线有几个硬性原则断面方向要基本垂直于河道主流线断面范围必须覆盖到可能淹没的最高水位以上断面在水流方向上的间距不能太大通常平缓河段几百米一个急变段和桥闸附近需要加密。我自己有个习惯断面在弯道处不是绝对垂直而是沿径向偏转这样能更好反映弯道水面横比降的影响。2.4 糙率、收缩系数等参数准备粗糙系数也就是曼宁糙率n是影响水位计算最敏感的参数之一。它本质上反映的是河床和滩地对水流的阻力取值经验性很强。我在实际项目中常用一套参考值天然主河槽取0.03到0.04河床有卵石或杂草取0.04到0.05漫滩农田草地取0.05到0.07灌木丛取0.07到0.1树林和建成区取到0.1以上。土地利用数据可以辅助赋值比如从土地覆被分类图里把每个断面左滩、主槽、右滩分别提取出来再按地类赋n值。需要注意n值不是定死不能动的。如果有实测洪水位或历史淹没痕迹就必须用实测数据反推率定n值这才是模型“可信”的关键。另一个常被忽略的参数是收缩和扩张系数它用来描述断面渐变引起的局部水头损失默认值一般取0.1和0.3除非断面有急剧变化否则不要轻易调。3. 稳定流模拟实操从几何到水面线3.1 几何数据导入与常见错误修正在HEC-RAS里先把之前的GIS成果导入。选择File - Import - Geometry导入由HEC-GeoRAS生成的.gxx文件或者直接在RAS Mapper里新建Geometry。导入成功后先别急着算一定要进几何编辑器逐项检查河流和河段名是否正常断面编号是否从上游向下游递增断面之间距离是否合理。新手的几何数据翻车十有八九是断面方向反了。断面方向反了的典型特征是主槽位置跑到断面的另一侧或者左滩地和右滩地和常识对调。修正办法是在Geometry编辑器里选中断面选Reverse Station。还有一种是断面出现了交叉常见于断面线在弯道处拉斜了会导致计算时“断面重叠”HEC-RAS会报错这时候最好的办法不是硬改而是回到GIS里重新布置断面线再导一次。几何检查里还要看“Bank Station”也就是河岸线在断面上的位置。这个位置决定了主槽和滩地怎么划分直接影响水力半径和湿周计算。如果主槽流量明显偏大或过流面积异常先看Bank Station是否落在合理位置。3.2 稳定流数据与边界条件设置几何没问题后进入Steady Flow Data。这里要填每个断面的流量和下游边界条件。流量可以在每个断面单独填也可以用流量变化表在河段内部插值。对于一条没有大支流汇入的河段全河段流量一致就行有支流汇入时要在汇合点上下游设置不同的流量。下游边界条件最常用的是Normal Depth即正常水深需要填一个能量坡降值。这个值可以用河段的平均比降估算比如河道纵坡0.001到0.005。另一个常用的是已知水位如果你有下游水文站的设计水位直接填水位更稳妥。做多个频率洪水时在Steady Flow Data里可以同时建多个Profile比如0.5、1、2、5年一遇填好流量后一次算完后面出图时可以逐个选择。计算之前在Steady Flow Analysis里选择水流态。大部分河流是缓流选Subcritical慢流就够如果存在急流、跌水或临界流的情况要选Mixed Flow。我的建议是刚开始建模先用Subcritical遇到“不收敛”再考虑Mixed Flow因为Mixed Flow对初始条件敏感容易来回震荡。3.3 结果检查与解读计算完成后第一件事是看结果而不是急着出图。先看Water Surface Profile图从上游到下游的水面线应该是平滑的如果在某个断面突然掉下去或抬得过高说明那个断面几何或流量设置有问题。再看Profile Table重点看每个断面的水位、流量、平均流速、过流宽度这几个字段和水力学常识比对一下。如果某个断面的水位异常高或者出现被淹没的提示说明断面过流能力不足。解决思路不是直接把整个河岸抬高而是先检查断面范围是否够宽、主槽Bank Station位置是否正确、n值是否取太大。我在实际项目中遇到最典型的情况是断面没画到淹没范围外洪水直接从模型里“漏”出去了这时候要回到GIS里把断面加长重新导入水位就正常了。稳定流的结果确定后最好把计算流量和对应水位整理成一张水位流量关系表一方面用于报告另一方面也是下一阶段非稳定流初始条件的重要准备。4. 非稳定流模拟实操洪水过程与调度演进4.1 基础设置时间窗、步长与输出间隔非稳定流模拟的第一步是设置Simulation Time Window也就是模拟起止时间。比如一个12小时的洪水过程起止时间就设为0:00到12:00。随后是最关键的计算步长Computation Step。时间步长是初学者最容易踩的坑设得太大计算发散或者结果震荡设得太小计算量暴涨。我的经验是初始值先取300秒跑通之后再逐步缩小。判断步长是否合理可以用Courant数辅助判断公式是Cr u * Δt / Δx其中u是流速Δt是时间步长Δx是断面间距。理论上Cr小于1.0才能保证数值稳定。一条河道流速2 m/s断面间距200米那Δt最大不要超过100秒。如果断面间距小、流速快时间步长必须跟着缩小这就是为什么山区陡坡河流比平原河流难算因为水流急时间步长要很小。4.2 边界条件与初始条件非稳定流需要设置上游边界和下游边界。上游一般用Flow Hydrograph也就是流量过程线给出“时间-流量”成对数据下游可以用Stage Hydrograph水位过程线或者Rating Curve水位流量关系曲线。如果下游边界没有实测水位也可以用Normal Depth后接一段足够长的虚拟延伸让边界扰动不影响你关心的河段。初始条件是最能体现经验的地方。很多人第一次算非稳定流直接从一个干模型开始结果前几个小时水位剧烈振荡、甚至出现负水深这就是“冷启动”带来的数值振荡。正确做法是“热启动”先用稳定流算一遍用稳定流得到的水位和流量作为非稳定流的初始条件。在HEC-RAS里把稳定流计算文件作为初值文件或者干脆在非稳定流初始条件设置里给定各断面初始水位和流量让模型从接近真实的、渐变的流态起步。4.3 调参经验与稳定性处理非稳定流跑起来了不代表结果能用。一个常见异常是水位在某个时段反复跳动像锯齿一样这多半是时间步长太大。先缩小计算步长看振荡是否减弱如果振荡还在检查下游边界条件是否合理有时候下游边界反射回来的波会干扰上游。另一个常见异常是计算在某时刻假死提示“At time xxx, water surface has gone below the channel bed at cross-section xxx”这通常说明某个断面水流失控要么是断面范围不够要么是这一时刻计算步长过大。调整参数时有个原则一次只动一个变量。比如先固定时间步长只调初始流量稳定后再缩小时间步长观察结果差异。这样定位问题最快。我自己做非稳定流时一般会先跑一个粗糙的、步长较大的结果看整体趋势再用小步长细化计算而不是一上来就追求精细。4.4 桥梁、涵洞与堰在非稳定流中的处理如果河段里有桥、涵洞、堰等建筑物非稳定流模型的稳定性会明显变差。桥梁对水流的阻水作用要在几何数据里建Bridge模块需要输入桥墩形状、桥面高程、桥孔过流面积等。涵洞则要建Culvert模块它内部是有压流和无压流交替的对时间步长敏感特别容易振荡。我的习惯是在初步模拟河段演变时把桥涵暂时当成普通断面处理先让整个河段跑通再逐步加入建筑物。每加一个建筑物重新计算并对比前后两次水位如果差异异常大多半是建筑物几何数据或过流公式设错了。建筑物模型对水位的影响通常是局部性的如果一座桥让上游水位抬升好几米大概率有问题。5. 模拟结果GIS可视化与危险性等级划分5.1 结果导出RAS Mapper还是HEC-GeoRAS模拟算完之后要做空间可视化。老流程是把结果导回ArcGIS用HEC-GeoRAS把水位、流速等数据生成TIN或栅格再叠加DEM生成淹没范围。这个流程绕、容易错现在HEC-RAS 6.x的RAS Mapper已经完全能替代这一步加载地形后直接生成Depth水深、Water Surface Elevation水面高程、Velocity流速等专题栅格还能导出GeoTIFF。我强烈建议新项目直接用RAS Mapper但要注意一点RAS Mapper生成栅格的分辨率默认比较粗输出的水深图会有明显的锯齿。导出前可以在结果图层上设置输出分辨率一般设成和DEM一致或者略粗一档再使用双线性或三次插值重采样出图质量会好很多。如果项目要求更精细的制图再把GeoTIFF导入ArcGIS或QGIS做后续处理。5.2 水深栅格与淹没范围生成拿到水深栅格后第一步不是直接出图而是先做“淹没范围”提取。水深栅格里有大面积的0值和极小值这些地方要么没被淹要么是1厘米、2厘米的伪淹没。工程上一般会设定一个最小淹没阈值比如0.05米或0.1米把低于阈值的像素重分类为0。在ArcGIS里可以用栅格计算器写Con(depth 0.05, 1, 0)在QGIS里用Raster Calculator做同样的事再把二值栅格转成面矢量就得到了淹没范围边界。这里有几个很实际的坑。第一水深栅格是逐像元计算的淹没范围容易出现“椒盐噪声”也就是孤立小斑块可以在矢量转出后用“消除面”工具或者面积阈值筛选去掉。第二河道附近的地形洼地会导致淹没范围出现大量“手指状”延伸这是DEM填洼不彻底的典型表现需要回头处理DEM而不是在出图时硬删。第三RAS Mapper生成的水面高程有时会低于DEM高程导致水深为负检查一下Terrain与几何数据坐标系是否一致。5.3 危险性分级水深×流速的风险矩阵洪水危险性不能只看水深同样的50厘米水静止和流速1 m/s完全是两个威胁等级。业界比较通用的做法是水深、流速组合分析用“水深×流速”这个指标来衡量行人的稳定性再叠加水深本身对人车通行的限制形成低、中、高、极高四级危险性分区。在GIS里实现很简单ArcGIS栅格计算器里用h * v得到水深流速乘积栅格再按下列“水深、流速组合”作重分类。我整理一个参考分级思路具体取值要结合当地规范但思路一致危险性等级水深hm水深×流速m²/s低h 0.5h×v 0.5中0.5 ≤ h 1.50.5 ≤ h×v 1.0高1.5 ≤ h 3.01.0 ≤ h×v 3.0极高h ≥ 3.0h×v ≥ 3.0注意危险性分级是成果输出的关键一步它直接把水力计算成果转化成风险评估的语言。出图时低危区用浅蓝绿色中危区用黄色高危区用橙色极高危区用红色这样的配色在应急管理场景里已经被大家熟悉了不用另辟蹊径。5.4 专题图制作与成果输出最后一步是制图输出这也是很多人觉得“软件学会了但成果不能看”的地方。我的出图检查清单是底图用高分辨率影像或地形图叠加淹没范围、危险性分级、水系、道路、居民点、堤防等要素图廓要素包括指北针、比例尺、图例、坐标网格、制图单位和时间图例里要把“淹没范围”和“危险性等级”分开别混在一个图层颜色渐变里。QGIS在这个环节很好用它对HEC-RAS导出的GeoTIFF原生支持好配色方案可以保存成.qml样式文件换数据时直接套用能省大量时间。如果项目要出三维效果现在很多团队会用QGIS三维视图或者WebGIS方案把水深栅格叠加在DEM白模上拉一个夸张比例尺做成动态淹没浏览。这个环节不复杂但能把成果的专业感提升一个档次评审时很加分。6. 常见问题与排查技巧实录6.1 稳定流不收敛到底卡在哪稳定流计算不收敛是新手遇到最多的问题。现象是计算进度条一下跳过去结果却不更新或者提示“The energy equation could not be balanced”。排查顺序我固定是先看下游边界条件Normal Depth的能量坡降填得是否合理这个值填得离实际偏太远能量方程很难平衡再看收缩扩张系数默认0.1和0.3一般不动实在不行调小最后看断面几何有没有异常窄的断面或突变断面把断面数据重新平滑一下。6.2 非稳定流振荡与发散的处理非稳定流报告里的水位、流量出现锯齿状跳跃优先把时间步长缩小。如果缩小到60秒还跳就要检查初始条件是否用了稳定流结果做热启动。另一个隐蔽原因是下游边界离研究河段太近边界扰动直接反馈到内部解决办法是延长下游虚拟河段让边界远离或者把下游边界换成较平缓的Rating Curve。6.3 坐标系与数据丢失问题HEC-RAS本身是一个“无坐标系”的软件它只认尺寸和相对位置。所以GIS端输出给RAS的所有数据必须已经在同一投影坐标系下否则换一台电脑、换一个软件版本几何数据就会错位。还有一点所有文件路径尽量不要出现中文HEC-RAS对中文路径的兼容性很差我见过不少“结果导不出来”“打开文件报错”的案例最后原因都是路径里带中文或特殊字符。6.4 淹没范围断头、孤岛的处理导出的淹没范围图经常出现上游有、中间断、下游又出现的现象或者内部有大量孔洞。这多半是DEM局部高程异常或者地形没有填洼干净。处理办法不是直接编辑矢量结果而是回到DEM检查河道路径位置的高程是否连续必要时用河网burning强制降低河道高程再重新计算一次。孤立小斑块可以直接在GIS里用面积阈值滤除但如果有大面积的断裂还是要回到模型里检查断面覆盖范围。6.5 长期做洪水评估的一些个人习惯最后分享几个我这些年养成的习惯项目文件夹永远按“01-原始数据”、“02-中间成果”、“03-模型文件”、“04-制图输出”分类HEC-RAS和GIS的项目文件都放在英文路径下DEM原始数据永远留一份备份所有填洼、burning操作都在副本上做不管项目要不要非稳定流我都会先跑一版稳定流用它的结果校核n值再作为非稳定流的热启动初值。这些习惯看起来不起眼但能让你在项目赶工、隔了几个月回来继续做的情况下依然能快速接手自己的模型而不是对着文件名猜当时算了什么。