http://blog.csdn.net/giser_whu/article/details/41288761

洪涝模拟仿真的实现方法主要有两种:一种是基于水动力学的洪水演进模型;另一种是基于DEM的洪水淹没分析。具体分析如下:

我是GIS从业者,从我们的专业角度出发,选择基于DEM的洪水淹没分析来做洪涝的模拟仿真。而基于DEM的洪水淹没分析方法主要分为有源淹没和无源淹没。

本篇博客采用有源淹没算法实现洪涝的模拟,算法为八领域种子扩散算法。采用C#版本GDAL编写了FloodSimulation类,下面给出全部源代码:

[csharp] view plain copy
  1. class FloodSimulation
  2. {
  3. #region 类成员变量
  4. //点结构体
  5. public struct Point
  6. {
  7. public int X;          //行号
  8. public int Y;          //列号
  9. public int Elevation;  //像素值(高程值)
  10. public bool IsFlooded; //淹没标记
  11. };
  12. private bool[,] IsFlood;                //淹没区域标记二维数组,用于标记淹没栅格
  13. private List<Point> m_FloodBufferList;  //淹没缓冲区堆栈
  14. public Dataset m_DEMDataSet;            //DEM数据集
  15. public Dataset m_FloodSimulatedDataSet; //洪涝淹没范围数据集
  16. public int m_XSize;                     //数据X方向栅格个数
  17. public int m_YSize;                     //数据Y方向栅格个数
  18. public OSGeo.GDAL.Driver driver;        //影像格式驱动
  19. public int[] m_FloodBuffer;            //填充缓冲区(洪涝淹没范围)
  20. public int[] m_DEMdataBuffer;          //DEM数据(存储高程值)
  21. public double m_AreaFlooded;            //水面面积
  22. public double m_WaterVolume;            //淹没水体体积
  23. /* 这里的GeoTransform(影像坐标变换参数)的定义是:通过像素所在的行列值得到其左上角点空间坐标的运算参数
  24. 例如:某图像上(P,L)点左上角的实际空间坐标为:
  25. Xp = GeoTransform[0] + P * GeoTransform[1] + L * GeoTransform[2];
  26. Yp = GeoTransform[3] + P * GeoTransform[4] + L * GeoTransform[5];                                                                     */
  27. public double[] m_adfGeoTransform;
  28. #endregion
  29. //构造函数
  30. public FloodSimulation()
  31. {
  32. m_adfGeoTransform = new double[6];
  33. m_FloodBufferList = new List<Point>();
  34. }
  35. /// <summary>
  36. /// 加载淹没区DEM,并创建淹没范围影像
  37. /// </summary>
  38. /// <param name="m_DEMFilePath">DEM文件路径</param>
  39. /// <returns></returns>
  40. public void loadDataSet(string m_DEMFilePath)
  41. {
  42. //读取DEM数据
  43. m_DEMDataSet = Gdal.Open(m_DEMFilePath, Access.GA_ReadOnly);
  44. m_XSize = m_DEMDataSet.RasterXSize;
  45. m_YSize = m_DEMDataSet.RasterYSize;
  46. //获取影像坐标转换参数
  47. m_DEMDataSet.GetGeoTransform(m_adfGeoTransform);
  48. //读取DEM数据到内存中
  49. Band m_DEMBand = m_DEMDataSet.GetRasterBand(1); //获取第一个波段
  50. m_DEMdataBuffer = new int [m_XSize * m_YSize];
  51. m_DEMBand.ReadRaster(0, 0, m_XSize, m_YSize, m_DEMdataBuffer, m_XSize, m_YSize, 0, 0);
  52. //淹没范围填充缓冲区
  53. m_FloodBuffer = new int[m_XSize * m_YSize];
  54. IsFlood=new bool[m_XSize,m_YSize];
  55. //初始化二维淹没区bool数组
  56. for (int i = 0; i < m_XSize; i++)
  57. {
  58. for (int j = 0; j < m_YSize; j++)
  59. {
  60. IsFlood[i, j] = false;
  61. }
  62. }
  63. //创建洪涝淹没范围影像
  64. string m_FloodImagePath = System.IO.Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath) + "\\FloodSimulation\\FloodedRegion.tif";
  65. if (System.IO.File.Exists(m_FloodImagePath))
  66. {
  67. System.IO.File.Delete(m_FloodImagePath);
  68. }
  69. //在GDAL中创建影像,先需要明确待创建影像的格式,并获取到该影像格式的驱动
  70. driver = Gdal.GetDriverByName("GTiff");
  71. //调用Creat函数创建影像
  72. // m_FloodSimulatedDataSet = driver.CreateCopy(m_FloodImagePath, m_DEMDataSet, 1, null, null, null);
  73. m_FloodSimulatedDataSet = driver.Create(m_FloodImagePath, m_XSize, m_YSize, 1, DataType.GDT_Float32, null);
  74. //设置影像属性
  75. m_FloodSimulatedDataSet.SetGeoTransform(m_adfGeoTransform); //影像转换参数
  76. m_FloodSimulatedDataSet.SetProjection(m_DEMDataSet.GetProjectionRef()); //投影
  77. //m_FloodSimulatedDataSet.WriteRaster(0, 0, m_XSize, m_YSize, m_FloodBuffer, m_XSize, m_YSize, 1, null, 0, 0, 0);
  78. //输出影像
  79. m_FloodSimulatedDataSet.GetRasterBand(1).WriteRaster(0, 0, m_XSize, m_YSize, m_FloodBuffer, m_XSize, m_YSize, 0, 0);
  80. m_FloodSimulatedDataSet.GetRasterBand(1).FlushCache();
  81. m_FloodSimulatedDataSet.FlushCache();
  82. }
  83. /// <summary>
  84. /// 种子扩散算法淹没分析
  85. /// </summary>
  86. /// <param name="m_Lat">种子点纬度</param>
  87. /// <param name="m_Log">种子点经度</param>
  88. /// <param name="m_FloodLevel">淹没水位</param>
  89. public void FloodFill8Direct(double m_Lat,double m_Log,double m_FloodLevel)
  90. {
  91. //首先根据种子点经纬度获取其所在行列号
  92. Point pFloodSourcePoint = new Point();
  93. int x, y;
  94. geoToImageSpace(m_adfGeoTransform, m_Log, m_Lat, out x, out y);
  95. pFloodSourcePoint.X = x;
  96. pFloodSourcePoint.Y = y;
  97. //获取种子点高程值
  98. pFloodSourcePoint.Elevation = GetElevation(pFloodSourcePoint);
  99. m_FloodBufferList.Add(pFloodSourcePoint);
  100. //判断堆栈中时候还有未被淹没点,如有继续搜索,没有则淹没分析结束。
  101. while (m_FloodBufferList.Count!=0)
  102. {
  103. Point pFloodSourcePoint_temp = m_FloodBufferList[0];
  104. int rowX = pFloodSourcePoint_temp.X;
  105. int colmY = pFloodSourcePoint_temp.Y;
  106. //标记可淹没,并从淹没堆栈中移出
  107. IsFlood[rowX, colmY] = true;
  108. m_FloodBuffer[getIndex(pFloodSourcePoint_temp)] = 1;
  109. m_FloodBufferList.RemoveAt(0);
  110. //向中心栅格单元的8个临近方向搜索连通域
  111. for (int i = rowX - 1; i < rowX + 2; i++)
  112. {
  113. for (int j = colmY - 1; j < colmY + 2; j++)
  114. {
  115. //判断是否到达栅格边界
  116. if (i<=m_XSize&&j<=m_YSize)
  117. {
  118. Point temp_point = new Point();
  119. temp_point.X = i;
  120. temp_point.Y = j;
  121. temp_point.Elevation = GetElevation(temp_point);
  122. //搜索可以淹没且未被标记的栅格单元
  123. if ((temp_point.Elevation<m_FloodLevel||temp_point.Elevation <= pFloodSourcePoint_temp.Elevation) && IsFlood[temp_point.X, temp_point.Y] == false)
  124. {
  125. //将符合条件的栅格单元加入堆栈,标记为淹没,避免重复运算
  126. m_FloodBufferList.Add(temp_point);
  127. IsFlood[temp_point.X, temp_point.Y] = true;
  128. m_FloodBuffer[getIndex(temp_point)] = 1;
  129. }
  130. }
  131. }
  132. }
  133. }
  134. //统计淹没网格数
  135. int count = 0;
  136. for (int i = 0; i < m_XSize; i++)
  137. {
  138. for (int j = 0; j < m_YSize; j++)
  139. {
  140. if (IsFlood[i,j]==true)
  141. {
  142. count++;
  143. }
  144. }
  145. }
  146. }
  147. /// <summary>
  148. /// 输出洪涝淹没范围图
  149. /// </summary>
  150. public void OutPutFloodRegion()
  151. {
  152. m_FloodSimulatedDataSet.GetRasterBand(1).WriteRaster(0, 0, m_XSize, m_YSize, m_FloodBuffer, m_XSize, m_YSize, 0, 0);
  153. // m_FloodSimulatedDataSet.WriteRaster(0, 0, m_XSize, m_YSize, m_FloodBuffer, m_XSize, m_YSize, 1, null, 0, 0, 0);
  154. m_FloodSimulatedDataSet.GetRasterBand(1).FlushCache();
  155. m_FloodSimulatedDataSet.FlushCache();
  156. }
  157. //         public void OutPutFloodedInfo()
  158. //         {
  159. //         }
  160. /// <summary>
  161. /// 获取第x行第y列栅格索引
  162. /// </summary>
  163. /// <param name="point">栅格点</param>
  164. /// <returns>该点在DEM内存数组中的索引</returns>
  165. private int getIndex(Point point)
  166. {
  167. return  point.Y* m_XSize + point.X;
  168. }
  169. /// <summary>
  170. /// 获取高程值
  171. /// </summary>
  172. /// <param name="m_point">栅格点</param>
  173. /// <returns>高程值</returns>
  174. private int GetElevation(Point m_point)
  175. {
  176. return m_DEMdataBuffer[getIndex(m_point)];
  177. }
  178. /// <summary>
  179. /// 从像素空间转换到地理空间
  180. /// </summary>
  181. /// <param name="adfGeoTransform">影像坐标变换参数</param>
  182. /// <param name="pixel">像素所在行</param>
  183. /// <param name="line">像素所在列</param>
  184. /// <param name="x">X</param>
  185. /// <param name="y">Y</param>
  186. public void imageToGeoSpace(double[] m_GeoTransform, int pixel, int line, out double X, out double Y)
  187. {
  188. X = m_GeoTransform[0] + pixel * m_GeoTransform[1] + line * m_GeoTransform[2];
  189. Y = m_GeoTransform[3] + pixel * m_GeoTransform[4] + line * m_GeoTransform[5];
  190. }
  191. /// <summary>
  192. /// 从地理空间转换到像素空间
  193. /// </summary>
  194. /// <param name="adfGeoTransform">影像坐标变化参数</param>
  195. /// <param name="x">X(经度)</param>
  196. /// <param name="y">Y(纬度)</param>
  197. /// <param name="pixel">像素所在行</param>
  198. /// <param name="line">像素所在列</param>
  199. public void geoToImageSpace(double[] m_GeoTransform, double x, double y, out int pixel, out int line)
  200. {
  201. line = (int)((y * m_GeoTransform[1] - x * m_GeoTransform[4] + m_GeoTransform[0] * m_GeoTransform[4] - m_GeoTransform[3] * m_GeoTransform[1]) / (m_GeoTransform[5] * m_GeoTransform[1] - m_GeoTransform[2] * m_GeoTransform[4]));
  202. pixel = (int)((x - m_GeoTransform[0] - line * m_GeoTransform[2]) / m_GeoTransform[1]);
  203. }
  204. }

模拟结果在ArcGlobe中的显示效果图:

欢迎大家留言交流。

洪涝有源淹没算法及淹没结果分析【转】相关推荐

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

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

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

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

  3. 基于DEM的降雨淹没算法

    数字高程模型(Digital Elevation Model),简称DEM,是通过有限的地形高程数据实现对地面地形的数字化模拟(即地形表面形态的数字化表达),它是用一组有序数值阵列形式表示地面高程的一 ...

  4. 图像处理中,SIFT,FAST,MSER,STAR等特征提取算法的比较与分析(利用openCV实现)

    图像处理中,SIFT,FAST,MSER,STAR等特征提取算法的比较与分析(利用openCV实现) 本文实验为自己原创,转载请注明出处. 本人为研究生,最近的研究方向是物体识别.所以就将常用的几种特 ...

  5. SURF算法与源码分析、下

    FROM: http://www.cnblogs.com/ronny/p/4048213.html 上一篇文章 SURF算法与源码分析.上 中主要分析的是SURF特征点定位的算法原理与相关OpenCV ...

  6. 动图图解C语言插入排序算法,含代码分析

    C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...

  7. 动图图解C语言选择排序算法,含代码分析

    C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...

  8. c语言将十进制转化为二进制算法_base64算法初探即逆向分析

    算法分析 虽说base64严格意义上来说并不能算是加密算法,但的确应用方面来说还算是比较广,在CTF的算法逆向中Base系列算是也比较常见的,萌新刚开始学算法,就以base64为例,对该算法进行一个简 ...

  9. 数据结构与算法--代码鲁棒性案例分析

    代码鲁棒性 鲁棒是robust的音译,就是健壮性.指程序能够判断输入是否符合规范,对不合要求的输入能够给出合理的结果. 容错性是鲁棒的一个重要体现.不鲁棒的代码发生异常的时候,会出现不可预测的异常,或 ...

最新文章

  1. iis多进程下的全局变量_Linux下c程序的内存映像
  2. 让你的AI绿起来,艾伦研究所提出深度学习效率评估标准Green AI
  3. python【数据结构与算法】多字段条件排序
  4. Dataset:GiveMeSomeCredit数据集的简介、下载、使用方法之详细攻略
  5. flex4.6 保留自动产生的actionscript代码的编译选项
  6. Spring JdbcTemplate+JdbcDaoSupport实例
  7. 各个版本spring的jar包以及源码下载地址
  8. AHU_OJ 434
  9. 【BZOJ2330】【tyvj1785】【codevs2404】糖果,第一次的差分约束
  10. mysql error innodb_MySQL无法启动: InnoDB Error:unable to create temporary file
  11. asp脚本和php脚本,有经典ASP的缓存脚本吗?
  12. 深度比较Map的遍历
  13. 前端开发 Grunt 之 Connect
  14. 考研英语近义词与反义词·四
  15. linux无法访问移动硬盘,移动硬盘“无法访问”的解决方案
  16. 移远NBIOT模块选型指南
  17. 为什么使用计算机网络连接,为什么无线网络连接上却不能上网,教您电脑连上无线网却不能上网怎么办...
  18. 计算机视觉--CV技术指南文章汇总
  19. XML, XMLHttpRequest
  20. 微型计算机之哈佛架构是什么?

热门文章

  1. 安川e7变频器接线_西安安川变频器接线图
  2. 企业网站搭建的流程及方法
  3. Synaptics 蠕虫病毒解决方法
  4. 台式计算机的选购注意事项,笔记本电脑选购注意事项大全
  5. 黑吧安全网--古墓探秘
  6. 3万多条对联春联门联ACCESS数据库
  7. html5仿蚂蚁森林效果代码,vue仿支付宝蚂蚁森林水滴
  8. 苹果处理器性能突破天际,安卓已望尘莫及
  9. 不洁尸体的“诅咒”:靠死者的馈赠长高,却换来了另一种怪病
  10. cookie模拟登陆爬取药智网中药材数据库数据