基于数字高程模型
(DEM)
求取给定水位条件下的淹没区域
,
应当区分
“
无源淹没
”
和
“
有源淹
没
”
两种情况
。
0 效果预览
1 无源淹没和有源淹没
在无源淹没中
,
凡是高程低于给定水位的点都
记入淹没区
,
算作被淹没的点
,
这种情形相当于整个
地区大面积均匀降水的情况
,
所有低洼处都可能积水成灾
。
从计算机算法分析的角度看
,
这种情况分
析起来比较简单
,
因为它不涉及到区域连通
、
洼地合并
、
地表径流等复杂问题
。
假设区域降水量为
Dmm,
洼地摄雨口的面积
为
Sm
2
,
洼地当前水位表面积为
sm
2
,
则洼地水位
上涨高度
Δh
可近似表示为:
可以看出
,
当区域内洼地上下底面相差不大时
,
水面上涨高度
Δh
只与降水量
D
相关
。
因此
,
如果从粗略的计算来看
,
在区域大面积降水无
源淹没情况下
,
每个洼地水面上涨的幅度基本上是
一致的
,
也就是整个区域洼地水面均匀抬高
。
产生
淹没时
,
只要是低于水位高度的点都记入淹没点
,
都
会被淹没掉
。
有源淹没情况下
,
水流受到地表起伏特征的影
响
,
在这种情况下
,
即使在低洼处
,
也可能由于地形
的阻挡而不会被淹没
。
造成淹没的原因除了自然降
水外
,
主要包括上游来水
、
洼地溢出水等
。
在实际情
况中
,
有源淹没更为普遍
,
也更为复杂
。
有源淹没涉
及到水流方向
、
地表径流
、
洼地连通等情况的分析
。
2 有源淹没面积计算
采用种子蔓延算法来进行有源淹没面积计算
。
种子蔓延算法是一种基于种子空间特征的扩散探测
算法
,
其核心思想是将给定的种子点作为一个对象
,
赋予特定的属性
,
在某一平面区域上沿四邻域
(
或
八邻域
)
扩散
,
求取满足给定条件
、
符合数据采集分
析精度
,
且具有连通关联分布的点的集合
。
利用种子蔓延算法计算淹没区
,
就是按给定水位条件
,
求取满足精度
、
连通性要求点的集合
,
该集合给出的连续平面就是我们所要求算的淹没区范围
,
而满足水位条件但与种子点不具备连通关联性的其他连续平面
,
将不能进入集合区内
。
淹没区计算的准确性在很大程度上依赖
DEM
的分辨率
。
种子点的起始位置可以选在水库堤坝
、
河岸边界等特征点处
,
一般情况下
,
系统自动地根据
DEM特征点求取
。将满足所有条件的连通关联淹没点存
入缓存区
,
并不断地进行累加
,
从而使淹没区域不断
扩大。
3 部分代码
模型基于通用的SpringBoot开发,不依赖第三方商业软件,如下是部分代码,可在网站上参考效果,截图。
package com.planet.controller;
import com.planet.common.annotations.LimitRequest;
import com.planet.common.enums.ResultCode;
import com.planet.common.rest.result.Result;
import com.planet.controller.base.MyBaseApi;
import com.planet.dto.FloodWrapData;
import com.planet.engine.flood.param.FloodParam;
import com.planet.model.SecurityUser;
import com.planet.model.enums.SimuType;
import com.planet.model.enums.StatusType;
import com.planet.service.FloodSimuService;
import com.planet.service.SimuHistService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* Created by zhang on 2024/8/3
*/
@RestController
@RequestMapping("/api/flood")
@Api(value = "FloodSimuApi", description = "洪水淹没分析模型")
public class FloodSimuApi extends MyBaseApi {
@Autowired
private FloodSimuService floodSimuService;
@Autowired
private SimuHistService simuHistService;
/**
* 无源淹没
*
* @param params
* @return
*/
@LimitRequest
@ResponseBody
@RequestMapping(value = "/passive", method = RequestMethod.POST)
@ApiOperation(value = "洪水无源淹没分析模型")
public Result passiveFloodingSimu(@RequestBody FloodParam params) {
FloodWrapData result = this.floodSimuService.passiveFloodingSimu(params);
// 异步保存历史纪录
SecurityUser securityUser = this.getLoginUser();
String paramsStr = this.getReqParams(params);
this.simuHistService.save(securityUser, SimuType.FLOOD_PASSIVE,
paramsStr, StatusType.SUCCESS.code(), result);
return this.getResult(ResultCode.SUCCESS, result);
}
/**
* 有源淹没
*
* @param params
* @return
*/
@LimitRequest
@ResponseBody
@RequestMapping(value = "/active", method = RequestMethod.POST)
@ApiOperation(value = "洪水有源淹没分析模型")
public Result activeFloodingSimu(@RequestBody FloodParam params) {
FloodWrapData result = this.floodSimuService.activeFloodingSimu(params);
// 异步保存历史纪录
SecurityUser securityUser = this.getLoginUser();
String paramsStr = this.getReqParams(params);
this.simuHistService.save(securityUser, SimuType.FLOOD_ACTIVE,
paramsStr, StatusType.SUCCESS.code(), result);
return this.getResult(ResultCode.SUCCESS, result);
}
}
package com.planet.engine.flood.param;
import lombok.Data;
/**
* 洪水淹没分析
* 运算参数
*/
@Data
public class FloodParam {
/**
* 初始地理范围,geojson格式
*/
private String extent = "\"type\":\"Polygon\",\"coordinates\":[[[109.131575,34.441672],[109.145565,34.44146],[109.14578,34.429426],[109.131403,34.429709],[109.131403,34.429709],[109.131403,34.429709],[109.131575,34.441672]]]}";
/**
* 经纬度坐标系:种子点
*/
private double lon = 109.142818D;
/**
* 经纬度坐标系:种子点
*/
private double lat = 34.434887D;
/**
* 淹没高程值,单位米
*/
private double floodHeight = 360D;
}
4 效果图


1万+

被折叠的 条评论
为什么被折叠?



