基于DEM的降雨淹没算法
因为最近接了一个计算降雨时洼地汇水情况的任务,便苦逼的写下了这个算法。因为对GIS相关知识以前并没有过了解,因此算法可能存在诸多疏漏或错误欢迎评论指正。本算法只是一个理想化模型的demo,不包括地表渗水,蒸发等因素。此外,算法中使用的DEM并不是C#中标准的ArcGis相关类,而是自己写的伪代码(偷点懒,先把算法赶出来再说- -)。
本算法从区域的最低点开始,不断向四周递归的淹没临近栅格。使用List来保存最低点数据(从最低到第二低到第三低....),将本次淹没点周围的栅格加入List,直到已淹没的n个栅格能够容纳该区域内的降水总体积而不溢出。
然后上代码了,转用的话麻烦注明一下出处:
using System;
using System.Collections.Generic;/**
* @author mengwei
* @E-mail:951854219@qq.com
* @version 创建时间:2018/7/3
* 本程序为基于DEM(并不是标准的DEM,DEM部分算是伪代码)的降雨淹没算法,模拟一个小区域内降雨淹没的范围
* 本算法仅作为一个简单的理想化demo,还应考虑渗水量(根据地表类型)等因素
* 如有错误或意见欢迎讨论
*/namespace WaterSpread
{class WaterSpread{public class Point:IComparable<Point>{public int X; //横坐标public int Y; //纵坐标public int h; //高程值public Point(int X,int Y,int h){this.X = X;this.Y = Y;this.h = h;}int IComparable<Point>.CompareTo(Point other){Point otherPoint = (Point)other;return (this.h < otherPoint.h ? -1 : (this.h == otherPoint.h ? 0 : 1));}}private int length; //栅格总长度private int width; //栅格总宽度private bool[,] isFlooded; //栅格是否被淹没private bool[,] borderPoints; //用于标识水位边界点private Point[,] DEM; //dem数据private int waterFall; //降水量private int s; //一个栅格的面积private List<Point> depthList = new List<Point>(); //一个按高程从小到大排列的List//构造函数public WaterSpread(Point[,] dem,int fall,int _s){s = _s;waterFall = fall;DEM = dem;length = dem.GetLength(0);width = dem.GetLength(1);isFlooded = new bool[length, width];borderPoints = new bool[length, width];}/// <summary>/// 种子扩散算法淹没分析/// 起始点为洼地最低点/// </summary>/// <param name="posX">淹没起始点横坐标</param>/// <param name="posY">淹没起始点纵坐标</param>public void waterSpreading(int posX,int posY){//若该点未被淹没if (!isFlooded[posX, posY]){isFlooded[posX, posY] = true;//寻找该点周围未被淹没的栅格加入队列int lowest = int.MaxValue;//取临近的八个栅格,从未淹没的栅格中寻找最低点for(int i = posX - 1; i < posX + 2; i++){for(int j = posY - 1; j < posY + 2; j++){if(i >= 0 && i < length && j >= 0 && j < width)if (!isFlooded[i, j] && !(i == posX && j ==posY)){depthList.Add(DEM[i, j]);depthList.Sort(); //对List进行重排序}}}//若水位线高于临近最低点if (depthList[0] != null)lowest = depthList[0].h;if(lowest < waterDepth()){Point curr = depthList[0];depthList.Remove(curr);//递归继续向List的第一个Point淹没waterSpreading(curr.X,curr.Y);}}}/// <summary>/// 计算当前淹没区域的水位距地平面的距离/// </summary>public int waterDepth(){int n = 0; //淹没栅格总数int h = 0;int totalDepth = 0; //各个已淹没栅格淹没深度之和for(int i = 0; i < length; i++)for(int j=0;j<width;j++){if(isFlooded[i,j] == true){n++;totalDepth += DEM[i, j].h;}}h = (totalDepth * s + length * width * s * waterFall) / (n * s);return h;}public void showFlooded(){for(int i = 0; i < length; i++){for(int j=0;j< width; j++){if (isFlooded[i, j] == true){Console.WriteLine("点("+i+","+j+")已被淹没");}}}}}
}
namespace WaterSpread
{class test{//测试用例static void Main(string[] args){WaterSpread.Point[,] testDEM = new WaterSpread.Point[1, 3];testDEM[0, 0] = new WaterSpread.Point(0, 0, -5);testDEM[0, 1] = new WaterSpread.Point(0, 1, -7);testDEM[0, 2] = new WaterSpread.Point(0, 2, -6);WaterSpread ws = new WaterSpread(testDEM,1,1);ws.waterSpreading(0, 1);ws.showFlooded();}}
}
基于DEM的降雨淹没算法相关推荐
- 洪涝有源淹没算法及淹没结果分析
洪涝模拟仿真的实现方法主要有两种:一种是基于水动力学的洪水演进模型:另一种是基于DEM的洪水淹没分析.具体分析如下: 我是GIS从业者,从我们的专业角度出发,选择基于DEM的洪水淹没分析来做洪涝的模拟 ...
- 有源淹没分析arcgis_洪涝有源淹没算法及淹没结果分析
洪涝模拟仿真的实现方法主要有两种:一种是基于水动力学的洪水演进模型:还有一种是基于DEM的洪水淹没分析.详细分析例如以下: 我是GIS从业者,从我们的专业角度出发,选择基于DEM的洪水淹没分析来做洪涝 ...
- 洪涝有源淹没算法及淹没结果分析【转】
http://blog.csdn.net/giser_whu/article/details/41288761 洪涝模拟仿真的实现方法主要有两种:一种是基于水动力学的洪水演进模型:另一种是基于DEM的 ...
- 基于DEM模拟淹没区域随时间推演算法代码展示
之前写的一篇博客讲基于dem模拟淹没区域随时间推演的算法:https://blog.csdn.net/wqy248/article/details/81119550 有些朋友留言希望看一下实现源码,所 ...
- 洪水填充算法_基于GIS的洪水淹没范围计算
03 收稿日期 : 2007 2 06 2 21; 修回日期 : 2007 2 07 2 16 作者简介 : 甘郝新 , 男 , 湖北宜昌人 , 主要从事水利信息化系统设计 . 研发工作. 在防洪减灾 ...
- PDERL:基于DEM的快速精确通视域分析算法介绍(一)
PDERL: 基于DEM的快速精确通视域分析算法(精度与R3相同,速度与XDraw接近) 系列文章: PDERL:基于DEM的快速精确通视域分析算法介绍(一) PDERL:基于DEM的快速精确通视域分 ...
- 有源淹没分析arcgis_基于ArcGIS的洪水淹没分析与三维模拟
基于 ArcGIS 的洪水淹没分析与三维模拟 孙 君 , 奚赛英 , 尤 迪 , 郑付涛 [摘 要] 摘 要 : 洪水淹没范围的确定是洪灾损失评估和防洪决策的核心环节 . 基 于 TIN 数据 , 运 ...
- java生成三角网_源码:基于离散点的构TIN算法(三角网)
[实例简介]含实验报告以及测试数据 基于离散点的构TIN算法 一.算法思想 (1)首先,找出离散点集中相距最近的两点,连接这两点形成TI.的初始基线. (2) 然后,找出包含此基线的另外一个点构成三角 ...
- 基于DEM的GIS水文分析——河网与集水区域的提取
基于DEM的GIS水文分析*--河网与集水区域的提取* DEM(Digital Elevation Model),是地表形态高程属性的数字化表达,能够一定分辨率的局部地形特征,包含了丰富的地形地貌.水 ...
最新文章
- python序列类型-Python内置序列类型之集合类型详解
- python学习之 字符串前'r'的用法
- openoffice 安装 linux环境
- python爬虫都能干什么用_5 行代码就能写一个 Python 爬虫
- 逆天语言模型GPT-2最新开源:345M预训练模型和1.5B参数都来了
- weblogic启动后,抛出大量的java.lang.ArrayIndexOutOfBoundsException异常
- Android 6.0 扫描不到 Ble 设备需开启位置权限
- 图像取证:源识别和伪造检测(Image Forensics: source identification and tampering detection) 续2
- IIS发布网站后网页样式丢失
- 如何将pdf文件转换成word格式
- 为什么别人报价成单,而你不行?
- libero-soc许可证申请和环境配置
- 手机里面的照片被误删了怎么找回?
- 美团外卖API接入(二)
- mysql按笔划排序_mysql中怎么按姓氏笔画排序
- KNN算法(二) sklearn KNN实践
- iftop工具(网卡流量监控软件)的使用
- C#已知起点坐标、角度、长度求终点坐标(三角函数)
- 医美分期回归理性,这家分期机构如何跑进第一梯队
- mongo安装、卸载、备份、还原、分片、复制、监控、CRUD等操作