
做一个城市洪涝模拟项目时最容易被新手忽略、却又最影响结果的一步往往不是降雨输入不是边界条件而是你压根没告诉模型“这里有栋楼”。很多朋友第一次跑二维地表漫流模型都会遇到这种诡异场面洪水堂堂正正穿过沿街商铺从小区楼栋中间直接涌过去最后算出来的积水范围跟实拍照片完全对不上。问题就出在“建筑阻隔”这个环节上。说白了城市洪涝模拟里建筑阻隔就是告诉模型哪些地方房子占着、水进不去让地表径流只能老老实实沿着马路和空地流。如果不做这一步模型里所有建筑都变成“透明”的水从楼的这一头进去、那一头出来水深、流速、洪峰时间全都失真。今天这篇文章我就围绕建筑阻隔的设置技巧把原理、操作、参数选择和踩坑经验一次性讲清楚。1. 建筑阻隔不是“画个框”那么简单为什么它决定整个模拟的成败做过一两个项目之后你会发现建筑阻隔不只是“加一个图层”的事它本质上改变了地表汇流的拓扑结构。城市里建筑密度动辄百分之三四十这些不透水的实体如果不在模型里体现整个淹没格局就是错的。1.1 没有阻隔时模拟里会出现哪些荒诞场面最典型的场景是这样的一场两小时暴雨模型跑完你打开水深云图发现积水沿着一条街往下游推但中途那片水深“穿越”了一排房子直接从建筑内部穿过去等到水面出来时水深颜色还变了。为什么因为栅格模型只认高程和糙率它不知道那里有一堵墙。这种“穿楼”现象带来的连锁反应很麻烦道路积水被低估。水流有一部分被“分流”进了建筑区域看起来街道上的水深没那么高了实际上现实中水只能憋在街道里。洪峰提前到达。建筑和道路相比原本是不透水、不蓄水的区域但模型里它成了过流通道洪水走得比现实快下游流量过程线的峰值时间和量级都会偏掉。风险等级图严重失真。模型显示建筑内部受淹但实际情况可能是建筑外墙挡着水根本进不去而真正积水的低洼道路反而因为水深被低估风险等级偏低。排水管网评估也会被带偏。地表漫流路径变了雨水口接到的水量和到达顺序都变了管网过载的位置自然也对不上。1.2 建筑阻隔到底改变了什么往深了说建筑阻隔影响的是水流的“可通行空间”。我们可以把城市地表演化成一张“迷宫”——建筑就是迷宫的墙道路就是迷宫的通道。没有墙水会走直线全线铺开有了墙水只能沿着通道走而且通道变窄之后同样的水量能壅出更高的水深。具体来说它影响四个关键结果积水范围建筑区域到底进不进水直接决定淹没边界。街道水深建筑占掉的空间越大街道上分摊的水就越深。流速与流路水绕行之后流速和方向都会变这会影响人员避险路线评估。洪峰时间路径变长、调蓄空间变小下游洪峰可能会更早或更晚取决于具体布局。我在实际项目里遇到过最典型的一次一个老城区建筑密到几乎没有空隙一开始没做建筑阻隔50年一遇暴雨算出最大积水深度才0.3米怎么看都不对。后来把建筑阻隔加上去同一场雨街道积水直接干到0.8米以上和当地居民描述的情况基本吻合。差别就是这么大。1.3 为什么这一步常常被跳过很多人不是不想做而是真的会忽略。我总结下来有这么几个原因认知惯性以前做SWMM一维模型时一个子汇水分区就是一个参数根本不需要关心建筑在哪。转做二维地表漫流时惯性思维让人只盯着地形和糙率忘了建筑这回事。数据缺失建筑轮廓数据不是每家单位都现成的拿不到完整数据就干脆不做。计算量焦虑加了建筑阻隔通常意味着要加密网格模拟时间成倍增加怕跑不动。错误假设有人觉得“建筑区域糙率设大一点不就完了”其实糙率只能让水流慢一点并不能阻止水穿过去这是两种物理含义。理解到这一步你才算真正重视起建筑阻隔这个设置。2. 先搞懂你的模型怎么“看见”建筑三种主流处理机制对比不同的洪水模拟软件处理建筑阻隔的底层逻辑是不一样的。同一个参数在这个软件里有用换个软件可能就是错的。所以在动手之前得先搞清楚你用的模型属于哪一种机制。2.1 DEM地形抬升法最通用也最容易出错这是目前二维栅格类模型里最主流的方法。原理很简单把建筑覆盖范围内的DEM高程整体抬高相当于在地面上“长出”一块台地。水漫到建筑的边缘因为地形太高进不去只能绕行。HEC-RAS 2D、MIKE 21、jFlow这类基于栅格地形的模型基本都是这么干。你不需要在模型里单独设什么“建筑对象”只要给一份改好的DEM就行。这个方法的最大坑在于“抬升高度”。常见误区是拿建筑实际高度去抬——比如一栋18米的楼有人真就把地形抬高了18米。没必要因为模拟从来不需要水漫过整栋楼你要做的只是让水深到不了建筑顶就行。事实上抬升1米到2米已经能挡住绝大多数城市内涝模拟中的地表水深。抬得太高反而会引起边界处水深异常后面我会专门讲。2.2 网格内部不透水/阻隔墙边界清晰但依赖网格质量另一类做法是把建筑所在网格设为“干网格”或“墙体边界”水不能进出。TUFLOW里的建筑障碍物图层、FLUENT里把建筑边界设为墙都属于这一类。它的优点是你不需要去改地形建筑边界清清楚楚缺点也很明显——网格分辨率不够时建筑轮廓会失真。比如一栋15米宽的房子你用10米的网格去表达建筑只能占1到2个网格。如果网格中心点落在建筑外整个建筑可能就被漏掉了如果落在建筑里关掉这个网格相当于把建筑体积放大了好几倍。这种误差对结果的影响有时候比不做阻隔还大。这类方法通常要求建筑短边方向至少有3到5个网格否则不建议硬上。2.3 下垫面参数法快但不是真正的“阻隔”还有一些大尺度或者快速评估模型比如SWMM的地表汇流部分、部分城市冠层模型它们不显式建模筑而是通过给建筑区域提高曼宁系数、提高不透水率让水流在建筑区域的流速变慢、下渗减少。这种方法速度快、数据要求低但必须明确它并不能真正阻挡水流。它只是让水“走得慢”从效果上看水流还是会穿过建筑只是速度看起来合理了一点。所以它适合城市规划层面的趋势判断不适合精细化内涝风险评估。如果项目要求出淹没风险图最好还是用前两种方法。三种机制的对比我整理成了一张表方法核心原理典型软件优点缺点DEM地形抬升法抬高建筑范围的地形高程HEC-RAS 2D、MIKE 21、jFlow直观、操作简单、通用性强边界处理不当会形成虚假积水网格障碍/墙边界关闭建筑所在网格或设为不可通行边界TUFLOW、Delft3D、FLUENT边界清晰、物理意义准确依赖网格分辨率低分辨率下失真下垫面参数法提高糙率、降低渗透SWMM、大尺度分布式模型计算快、适合大范围评估无法真正阻断水流精度有限3. 实操流程从建筑轮廓到可用的阻隔数据知道了原理接下来就是动手。不管用哪种方法第一步都是要把建筑轮廓数据准备好然后根据模型机制转成对应格式。3.1 建筑轮廓数据从哪来、怎么清洗建筑轮廓数据的来源大概有三类测绘院的地籍或房产数据精度最高但很多单位拿不到而且数据可能不普及到普通项目。OpenStreetMap免费覆盖广但建筑边线不齐整低层建筑经常漏需要结合影像检查。卫星影像人工勾绘小范围项目最靠谱的办法虽然费点时间但边界和实际地形对齐度最高。拿到原始数据之后清洗这一步一定不能省。我通常按这几个步骤处理统一坐标系。建筑数据要转成和DEM一致的投影坐标系不要用经纬度直接叠。拓扑修复。消除重叠面、悬挂线避免后面栅格化时出现错误值。合并相邻多边形。同一个街区里紧紧挨着的几栋楼在模拟尺度上可以合并成一个大建筑区块减少边界数量。简化顶点。把锯齿状的小折线简化否则后期生成网格时会在边界处产生大量质量很差的网格。剔除过小碎面。面积小于半个网格的建筑建议直接并入周边区域不然计算时反而容易产生噪点。这一步的经验是建筑数据宁可比实际“胖一点点”也不要“瘦一点点”。栅格化之后建筑边界会被网格化缩水的建筑会让通道宽度虚增街道过流能力被高估。3.2 不同软件里阻隔设置的具体位置以几个常见软件为例说一下阻隔设置该在哪改HEC-RAS 2D主流做法是直接换地形把抬升后的DEM作为RAS Terrain导入。也可以在2D Flow Area里给建筑区域单独设置高糙率但正如前面说的这只能辅助不能替代地形阻隔。MIKE 21 / MIKE可以把建筑多边形定义为障碍物或者干燥网格。MIKE 21里头其实还能通过修改网格文件的地形高程来处理操作逻辑跟DEM抬升类似。TUFLOW通常用独立的建筑图层指定为“blocked”或“wall”类型前者不允许水流进入后者允许水流绕着走但不能通过。TUFLOW对这类处理支持得比较精细可以做门洞、骑楼等局部通水边界。FLUENT/CFD类把建筑扫掠成三维实体设置墙边界条件。这种精度最高但网格量和计算成本也最大项目里很少用于大范围城区洪涝模拟。新手最容易犯的错是在软件里找不到“建筑阻隔”这个按钮就以为这个软件不支持。其实大部分模型都是通过“换地形”或“改网格属性”来完成的并不存在一个叫“建筑阻隔”的开关。3.3 抬升高度、缓冲区和预留孔洞的处理细节如果你用的是DEM抬升法那最关键的三个参数是抬升高度、缓冲区宽度和孔洞处理。抬升高度怎么定我一般的做法是先估算设计暴雨下的最大地表水深然后加上一点安全余量。比如模拟显示街道最大水深0.8米那建筑抬升1.5米就足够了如果计算水深超过1.2米抬升到2米也比较常见。这里要提醒一句抬升的是“建筑底部的可通行门槛”不是建筑高度。用住宅楼实际层高去抬升是完全没有必要的。缓冲区怎么处理建筑边界如果从路面直接突变到抬高后的平台会在建筑周围形成一圈能存水的“沟”模拟结果会显示建筑被一圈深水包围极为失真。正确的做法是给建筑边界加一个渐变缓冲区宽度大概覆盖3到5个网格高度从建筑抬升值平滑过渡到周边地面。简单点的做法可以用栅格计算器做一个三层建筑区抬升1.5米缓冲区抬升0.75米外围保持原始DEM。这里给一段简单的Python示意用rasterio处理import rasterio import numpy as np with rasterio.open(dem_raw.tif) as src: dem src.read(1).astype(float32) profile src.profile # 0非建筑1建筑2缓冲区 zone rasterio.open(buildings.tif).read(1) new_dem np.where(zone 1, dem 1.5, dem) new_dem np.where(zone 2, dem 0.75, new_dem) with rasterio.open(dem_with_buildings.tif, w, **profile) as dst: dst.write(new_dem, 1)这个代码只是为了说明思路实际项目里还要注意NoData值的处理。预留孔洞别忘了南方城市很多底层商铺带骑楼或者住宅楼一楼有架空层这些空间在现实中是能让洪水进去的。做阻隔时应该先把这些“孔洞”从建筑多边形里抠掉保留为可通行区域。地下车库入口、小区大门同理只要现实中洪水可能进得去的口子都不应该简单粗暴地全部堵死。4. 设置阻隔后常见的四个“假象”及排查方法你以为加了建筑阻隔结果就一定是对的恰恰相反阻隔设置不当会带来新的问题而且这些问题比不做阻隔更隐蔽。下面这四个场景是我在项目里反反复复遇到的。4.1 建筑四周水位统一抬高街道像围堰现象是建筑周围一圈水深特别大明明是一条很宽的马路算出来像是被两面高墙夹住的深沟。原因通常是两个一是建筑抬升高度过大二是建筑密度高到把街道过流断面压缩得太狠。排查链路我一般是这么走的先把阻隔高度降到合理范围比如从3米降到1.5米重新跑一次看街道宽度和建筑间距如果两排建筑之间的路面宽度不足10米要警惕壅水效应这可能是真实的检查是否所有建筑都做了缓冲区如果建筑边界直接顶着道路网格很容易出现假性的“墙边深槽”打开流速矢量图如果建筑周边出现漩涡状回流那就是边界处理不当。4.2 锯齿边界制造虚假回流栅格模型的建筑边界都是锯齿状的尤其是建筑轮廓带有斜边时特别明显。水流碰到锯齿会在凹进去的网格里形成小旋涡流速方向会变得杂乱局部水深也会异常。处理办法有两个方向一是把建筑轮廓简化成和网格方向大体一致的折线减少锯齿二是做缓冲区平滑让地形过渡缓和一点。如果项目对流速场要求比较高比如要做人员疏散分析建议用矢量网格模型比如TUFLOW让建筑边界和网格边对齐。4.3 建筑“全淹”变“全干”底层商铺风险被低估这是最让我头疼的一个问题。建筑阻隔把建筑变成绝对不可淹没区域之后风险图显示建筑内部干干净净但现实里底层商铺遇到大暴雨经常因为卷帘门挡不住水或者雨水倒灌而受淹。所以现在做项目我越来越认同一个思路不能一刀切地把所有建筑都设为“完全阻隔”。比较精细的做法是把建筑分成“完全阻隔型”和“半阻隔型”两类。完全阻隔型针对那些没有地面开口、外墙完好的建筑半阻隔型则是给底层门洞、窗户留有进水路径。具体落地时可以在建筑外墙位置留出1到3米宽的进水通道门槛高程设为比路面高0.15米或0.3米。外部水位一旦超过门槛水就可以进入建筑区域。这样模拟出来的结果既不会出现“水穿楼”的荒谬画面又能反映出底层商铺的真实风险。4.4 阻隔之后模拟时间暴涨加了建筑阻隔地形变得更加崎岖有些模型的干湿网格切换会变得频繁计算时间可能直接翻倍甚至更多。解决思路是分级别处理大范围模拟时不要全区域都用精细网格。建筑密集区局部加密空旷区域保持粗网格。建筑抬升高度不要设置过于夸张起伏越少模型稳定性越好。短历时降雨测试时先检验阻隔设置再把时间步长放大跑长历时场景。GPU加速的模型比如TUFLOW GPU在阻隔设置复杂时优势会特别明显。5. 阻隔设得好不好拿这三个手段验证设置完建筑阻隔心里还是没底那就验证。下面是我觉得最有效的三个验证手段不一定需要实测数据多精确但能帮你筛掉大部分低级错误。5.1 拿历史积水照片和实测水深反推找几个历史上真实积水的点位对比模拟结果。重点看两件事建筑内部模拟中如果建筑区域有大片积水而照片显示建筑内部基本干燥那说明阻隔泄压失效了街道走向如果模拟显示积水沿着一条街延伸但实拍照片显示水在路口拐了个弯多半是建筑阻隔改变了流路而真实情况下建筑也是这么挡水的那反而说明阻隔有效。没有积水照片的话去现场走一圈也有帮助。看看路边建筑的门槛高度、台阶级数顺手记录一下这些都能成为验证模拟水深合理性的依据。5.2 检查沿街水深与断面流量的合理性在GIS里沿道路切几条横断面看一下水深剖面。正常情况下道路中心线水深最低、路边靠近建筑的地方水深逐渐变高而且应该是连续变化的。如果剖面显示水深在建筑边界处突然从0.5米掉到0米像悬崖一样说明建筑阻隔边界过陡需要加缓冲区。另一个检查是看流量。选几个关键断面统计通过断面的流量正常情况下一个街区上下游的流量差应该和降雨产流大致平衡。如果某个断面的流量突然变得异常大那可能是上游阻隔把水都逼迫到这个狭窄通道里了要看这个狭窄通道在现实中是否真的存在。5.3 多套网格分辨率下的结果稳定性测试这个验证我强烈推荐尤其是项目出风险图之前。做法很简单同一场降雨分别用2米、5米、10米三套网格跑一轮对比易涝点位置和峰值水深。如果建筑阻隔设置得合理三套网格算出来的高风险区位置应该高度一致水深虽然有差异但不至于天翻地覆。如果10米网格下一条街完全没淹5米网格下却淹了1米那说明建筑阻隔和网格尺寸的配合出了问题最常见的原因是建筑轮廓在低分辨率下被栅格化之后面积损失太大。我一般在项目初期就会做这个测试花半天时间能省下后面一个月的返工时间。6. 一个典型项目的阻隔参数参考与我的收尾建议最后拿一个我做过的小型城区项目做例子把建筑阻隔的参数完整列出来供你参考。6.1 一个城区项目的阻隔参数表项目背景是南方某个老城区研究范围约2平方公里建筑以6到18米的多层和小高层为主街道较窄底层商铺密集。参数取值说明DEM分辨率1米LiDAR数据建筑边线清晰模型网格5米建筑密集区局部2米保证建筑短边占3到5个网格建筑抬升高度1.5米大于50年一遇最大道路水深0.8米缓冲区宽度8米约1.5个5米网格平缓过渡缓冲区抬升0.75米中间过渡值道路糙率0.013~0.016普通沥青混凝土路面建筑区糙率0.1防止残余水流穿过加大摩擦底层门洞处理3米宽进水通道门槛高0.15米模拟商铺进水风险地下车库入口单独设为进水边界不纳入建筑阻隔范围这套参数不是万能的但它背后的逻辑是通用的抬升高度跟着设计水深走缓冲区宽度跟着网格尺寸走门洞和车库入口单独处理而不是一刀切。6.2 我踩过几次坑之后的习惯最后分享几个我自己的操作习惯都是教训换来的。第一个阻隔图层一定单独存成一个文件属性表里记录好数据来源、抬升高度、处理时间。后期调参的时候你一定会需要回退到某个版本没有记录就只能从头来。第二个每次修改完阻隔我会跑一个“阻隔开”和“阻隔关”的对比方案。不用看完整场降雨只看最大水深分布就能发现很多问题。如果关掉阻隔后道路积水反而更深那说明你的阻隔已经把水流憋出问题来了。第三个把建筑分成“完全阻隔”和“半阻隔”两种颜色画在地图上。项目评审时让甲方看一眼图他就知道哪些地方的商铺风险被考虑了哪些没有减少很多来回扯皮。第四个也是最重要的一个不要为了阻隔而阻隔。建筑阻隔只是还原真实世界的手段不是模型的目标。如果一套参数加进去导致路网过流完全变形、风险区布局明显不符合常识那宁可简化处理也不要让模型看起来“精细”却错得离谱。