洪水淹没模型-使用Java方式实现无源淹没和有源淹没

      基于数字高程模型 (DEM) 求取给定水位条件下的淹没区域 , 应当区分 无源淹没 有源淹
两种情况

    0 效果预览

      GIS动态扩散模型-演示版

    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 效果图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值