数字高程模型(Digital Elevation Model),简称DEM,是通过有限的地形高程数据实现对地面地形的数字化模拟(即地形表面形态的数字化表达),它是用一组有序数值阵列形式表示地面高程的一种实体地面模型,是数字地形模型(Digital Terrain Model,简称DTM)的一个分支,其它各种地形特征值均可由此派生。
一般认为,DTM是描述包括高程在内的各种地貌因子,如坡度、坡向、坡度变化率等因子在内的线性和非线性组合的空间分布,其中DEM是零阶单纯的单项数字地貌模型,其他如坡度、坡向及坡度变化率等地貌特性可在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的降雨淹没算法相关推荐

  1. 洪涝有源淹没算法及淹没结果分析

    洪涝模拟仿真的实现方法主要有两种:一种是基于水动力学的洪水演进模型:另一种是基于DEM的洪水淹没分析.具体分析如下: 我是GIS从业者,从我们的专业角度出发,选择基于DEM的洪水淹没分析来做洪涝的模拟 ...

  2. 有源淹没分析arcgis_洪涝有源淹没算法及淹没结果分析

    洪涝模拟仿真的实现方法主要有两种:一种是基于水动力学的洪水演进模型:还有一种是基于DEM的洪水淹没分析.详细分析例如以下: 我是GIS从业者,从我们的专业角度出发,选择基于DEM的洪水淹没分析来做洪涝 ...

  3. 洪涝有源淹没算法及淹没结果分析【转】

    http://blog.csdn.net/giser_whu/article/details/41288761 洪涝模拟仿真的实现方法主要有两种:一种是基于水动力学的洪水演进模型:另一种是基于DEM的 ...

  4. 基于DEM模拟淹没区域随时间推演算法代码展示

    之前写的一篇博客讲基于dem模拟淹没区域随时间推演的算法:https://blog.csdn.net/wqy248/article/details/81119550 有些朋友留言希望看一下实现源码,所 ...

  5. 洪水填充算法_基于GIS的洪水淹没范围计算

    03 收稿日期 : 2007 2 06 2 21; 修回日期 : 2007 2 07 2 16 作者简介 : 甘郝新 , 男 , 湖北宜昌人 , 主要从事水利信息化系统设计 . 研发工作. 在防洪减灾 ...

  6. PDERL:基于DEM的快速精确通视域分析算法介绍(一)

    PDERL: 基于DEM的快速精确通视域分析算法(精度与R3相同,速度与XDraw接近) 系列文章: PDERL:基于DEM的快速精确通视域分析算法介绍(一) PDERL:基于DEM的快速精确通视域分 ...

  7. 有源淹没分析arcgis_基于ArcGIS的洪水淹没分析与三维模拟

    基于 ArcGIS 的洪水淹没分析与三维模拟 孙 君 , 奚赛英 , 尤 迪 , 郑付涛 [摘 要] 摘 要 : 洪水淹没范围的确定是洪灾损失评估和防洪决策的核心环节 . 基 于 TIN 数据 , 运 ...

  8. java生成三角网_源码:基于离散点的构TIN算法(三角网)

    [实例简介]含实验报告以及测试数据 基于离散点的构TIN算法 一.算法思想 (1)首先,找出离散点集中相距最近的两点,连接这两点形成TI.的初始基线. (2) 然后,找出包含此基线的另外一个点构成三角 ...

  9. 基于DEM的GIS水文分析——河网与集水区域的提取

    基于DEM的GIS水文分析*--河网与集水区域的提取* DEM(Digital Elevation Model),是地表形态高程属性的数字化表达,能够一定分辨率的局部地形特征,包含了丰富的地形地貌.水 ...

最新文章

  1. python序列类型-Python内置序列类型之集合类型详解
  2. python学习之 字符串前'r'的用法
  3. openoffice 安装 linux环境
  4. python爬虫都能干什么用_5 行代码就能写一个 Python 爬虫
  5. 逆天语言模型GPT-2最新开源:345M预训练模型和1.5B参数都来了
  6. weblogic启动后,抛出大量的java.lang.ArrayIndexOutOfBoundsException异常
  7. Android 6.0 扫描不到 Ble 设备需开启位置权限
  8. 图像取证:源识别和伪造检测(Image Forensics: source identification and tampering detection) 续2
  9. IIS发布网站后网页样式丢失
  10. 如何将pdf文件转换成word格式
  11. 为什么别人报价成单,而你不行?
  12. libero-soc许可证申请和环境配置
  13. 手机里面的照片被误删了怎么找回?
  14. 美团外卖API接入(二)
  15. mysql按笔划排序_mysql中怎么按姓氏笔画排序
  16. KNN算法(二) sklearn KNN实践
  17. iftop工具(网卡流量监控软件)的使用
  18. C#已知起点坐标、角度、长度求终点坐标(三角函数)
  19. 医美分期回归理性,这家分期机构如何跑进第一梯队
  20. mongo安装、卸载、备份、还原、分片、复制、监控、CRUD等操作

热门文章

  1. 关于MP4文件格式解析
  2. 别人问你工资多少时,怎么回答!
  3. ElasticSearch如何不分词完全匹配搜索
  4. ubuntu20.04安装宝塔面板 安装nextcloud
  5. php比价源码,定稿毕业论文基于PHP的家电在线比价系统设计与实现喜欢就下吧(资料4)...
  6. 谷歌收购摩托罗拉乱弹
  7. Vue打包后图片路径问题
  8. Kubernetes kubectl命令补全功能
  9. 15、wxapp - 小程序登录以及全局参数 - 微擎小程序模块应用开发
  10. 杂记 SpaceX如何利用人工智能