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

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

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

  class FloodSimulation{#region 类成员变量//点结构体public struct Point{public int X;          //行号public int Y;          //列号public int Elevation;  //像素值(高程值)public bool IsFlooded; //淹没标记};private bool[,] IsFlood;                //淹没区域标记二维数组,用于标记淹没栅格private List<Point> m_FloodBufferList;  //淹没缓冲区堆栈public Dataset m_DEMDataSet;            //DEM数据集public Dataset m_FloodSimulatedDataSet; //洪涝淹没范围数据集public int m_XSize;                     //数据X方向栅格个数public int m_YSize;                     //数据Y方向栅格个数public OSGeo.GDAL.Driver driver;        //影像格式驱动public int[] m_FloodBuffer;            //填充缓冲区(洪涝淹没范围)public int[] m_DEMdataBuffer;          //DEM数据(存储高程值) public double m_AreaFlooded;            //水面面积public double m_WaterVolume;            //淹没水体体积/* 这里的GeoTransform(影像坐标变换参数)的定义是:通过像素所在的行列值得到其左上角点空间坐标的运算参数例如:某图像上(P,L)点左上角的实际空间坐标为:Xp = GeoTransform[0] + P * GeoTransform[1] + L * GeoTransform[2];Yp = GeoTransform[3] + P * GeoTransform[4] + L * GeoTransform[5];                                                                     */public double[] m_adfGeoTransform;   #endregion//构造函数public FloodSimulation(){m_adfGeoTransform = new double[6];m_FloodBufferList = new List<Point>();}/// <summary>/// 加载淹没区DEM,并创建淹没范围影像/// </summary>/// <param name="m_DEMFilePath">DEM文件路径</param>/// <returns></returns>public void loadDataSet(string m_DEMFilePath){//读取DEM数据m_DEMDataSet = Gdal.Open(m_DEMFilePath, Access.GA_ReadOnly);m_XSize = m_DEMDataSet.RasterXSize;m_YSize = m_DEMDataSet.RasterYSize;//获取影像坐标转换参数m_DEMDataSet.GetGeoTransform(m_adfGeoTransform); //读取DEM数据到内存中Band m_DEMBand = m_DEMDataSet.GetRasterBand(1); //获取第一个波段m_DEMdataBuffer = new int [m_XSize * m_YSize];m_DEMBand.ReadRaster(0, 0, m_XSize, m_YSize, m_DEMdataBuffer, m_XSize, m_YSize, 0, 0);//淹没范围填充缓冲区m_FloodBuffer = new int[m_XSize * m_YSize];IsFlood=new bool[m_XSize,m_YSize];//初始化二维淹没区bool数组for (int i = 0; i < m_XSize; i++){for (int j = 0; j < m_YSize; j++){IsFlood[i, j] = false;}}//创建洪涝淹没范围影像string m_FloodImagePath = System.IO.Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath) + "\\FloodSimulation\\FloodedRegion.tif";if (System.IO.File.Exists(m_FloodImagePath)){System.IO.File.Delete(m_FloodImagePath);}//在GDAL中创建影像,先需要明确待创建影像的格式,并获取到该影像格式的驱动driver = Gdal.GetDriverByName("GTiff");//调用Creat函数创建影像// m_FloodSimulatedDataSet = driver.CreateCopy(m_FloodImagePath, m_DEMDataSet, 1, null, null, null);m_FloodSimulatedDataSet = driver.Create(m_FloodImagePath, m_XSize, m_YSize, 1, DataType.GDT_Float32, null);//设置影像属性m_FloodSimulatedDataSet.SetGeoTransform(m_adfGeoTransform); //影像转换参数m_FloodSimulatedDataSet.SetProjection(m_DEMDataSet.GetProjectionRef()); //投影//m_FloodSimulatedDataSet.WriteRaster(0, 0, m_XSize, m_YSize, m_FloodBuffer, m_XSize, m_YSize, 1, null, 0, 0, 0);//输出影像m_FloodSimulatedDataSet.GetRasterBand(1).WriteRaster(0, 0, m_XSize, m_YSize, m_FloodBuffer, m_XSize, m_YSize, 0, 0);m_FloodSimulatedDataSet.GetRasterBand(1).FlushCache();m_FloodSimulatedDataSet.FlushCache();}/// <summary>/// 种子扩散算法淹没分析/// </summary>/// <param name="m_Lat">种子点纬度</param>/// <param name="m_Log">种子点经度</param>/// <param name="m_FloodLevel">淹没水位</param>public void FloodFill8Direct(double m_Lat,double m_Log,double m_FloodLevel){//首先根据种子点经纬度获取其所在行列号Point pFloodSourcePoint = new Point();int x, y;geoToImageSpace(m_adfGeoTransform, m_Log, m_Lat, out x, out y);pFloodSourcePoint.X = x;pFloodSourcePoint.Y = y;//获取种子点高程值pFloodSourcePoint.Elevation = GetElevation(pFloodSourcePoint);m_FloodBufferList.Add(pFloodSourcePoint);//判断堆栈中时候还有未被淹没点,如有继续搜索,没有则淹没分析结束。while (m_FloodBufferList.Count!=0){Point pFloodSourcePoint_temp = m_FloodBufferList[0];int rowX = pFloodSourcePoint_temp.X;int colmY = pFloodSourcePoint_temp.Y;//标记可淹没,并从淹没堆栈中移出IsFlood[rowX, colmY] = true;m_FloodBuffer[getIndex(pFloodSourcePoint_temp)] = 1;m_FloodBufferList.RemoveAt(0); //向中心栅格单元的8个临近方向搜索连通域for (int i = rowX - 1; i < rowX + 2; i++){for (int j = colmY - 1; j < colmY + 2; j++){//判断是否到达栅格边界if (i<=m_XSize&&j<=m_YSize){Point temp_point = new Point();temp_point.X = i;temp_point.Y = j;temp_point.Elevation = GetElevation(temp_point);//搜索可以淹没且未被标记的栅格单元if ((temp_point.Elevation<m_FloodLevel||temp_point.Elevation <= pFloodSourcePoint_temp.Elevation) && IsFlood[temp_point.X, temp_point.Y] == false){//将符合条件的栅格单元加入堆栈,标记为淹没,避免重复运算m_FloodBufferList.Add(temp_point);IsFlood[temp_point.X, temp_point.Y] = true;m_FloodBuffer[getIndex(temp_point)] = 1;}}}}}//统计淹没网格数int count = 0;for (int i = 0; i < m_XSize; i++){for (int j = 0; j < m_YSize; j++){if (IsFlood[i,j]==true){count++;}}}}/// <summary>/// 输出洪涝淹没范围图/// </summary>public void OutPutFloodRegion(){m_FloodSimulatedDataSet.GetRasterBand(1).WriteRaster(0, 0, m_XSize, m_YSize, m_FloodBuffer, m_XSize, m_YSize, 0, 0);// m_FloodSimulatedDataSet.WriteRaster(0, 0, m_XSize, m_YSize, m_FloodBuffer, m_XSize, m_YSize, 1, null, 0, 0, 0);m_FloodSimulatedDataSet.GetRasterBand(1).FlushCache();m_FloodSimulatedDataSet.FlushCache();}//         public void OutPutFloodedInfo()
//         {
//         }/// <summary>/// 获取第x行第y列栅格索引/// </summary>/// <param name="point">栅格点</param>/// <returns>该点在DEM内存数组中的索引</returns>private int getIndex(Point point){return  point.Y* m_XSize + point.X;}/// <summary>/// 获取高程值/// </summary>/// <param name="m_point">栅格点</param>/// <returns>高程值</returns>private int GetElevation(Point m_point){return m_DEMdataBuffer[getIndex(m_point)];}/// <summary>/// 从像素空间转换到地理空间/// </summary>/// <param name="adfGeoTransform">影像坐标变换参数</param>/// <param name="pixel">像素所在行</param>/// <param name="line">像素所在列</param>/// <param name="x">X</param>/// <param name="y">Y</param>public void imageToGeoSpace(double[] m_GeoTransform, int pixel, int line, out double X, out double Y){X = m_GeoTransform[0] + pixel * m_GeoTransform[1] + line * m_GeoTransform[2];Y = m_GeoTransform[3] + pixel * m_GeoTransform[4] + line * m_GeoTransform[5];}/// <summary>/// 从地理空间转换到像素空间/// </summary>/// <param name="adfGeoTransform">影像坐标变化参数</param>/// <param name="x">X(经度)</param>/// <param name="y">Y(纬度)</param>/// <param name="pixel">像素所在行</param>/// <param name="line">像素所在列</param>public void geoToImageSpace(double[] m_GeoTransform, double x, double y, out int pixel, out int line){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]));pixel = (int)((x - m_GeoTransform[0] - line * m_GeoTransform[2]) / m_GeoTransform[1]);}}

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

欢迎大家留言交流。

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

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

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

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

    http://blog.csdn.net/giser_whu/article/details/41288761 洪涝模拟仿真的实现方法主要有两种:一种是基于水动力学的洪水演进模型:另一种是基于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. php 报错乱码,thinkphp3 phpexcel 导出报错乱码清除ob
  2. 【Linux系统编程】Linux线程浅析
  3. 性能优化实战|使用eBPF代替iptables优化服务网格数据面性能
  4. Python格式化字符串f-string常用用法
  5. 不到一秒卖出一部!荣耀9X系列国内销售29天破300万台
  6. 【es】ES RestHighLevelClient 请求报错:Connection reset by peer
  7. Windows 10 移动版正式结束支持
  8. php 调用cron jobs,在CentOS 6.4中使用CronJobs执行PHP不起作用?
  9. 《深入学习 Golang》并发编程
  10. 服务器性能考察指标,服务器性能考察指标
  11. js中判断变量不为空或null
  12. linux内存管理实验,Linux内存管理机制研究
  13. 最新YYCMS影视源码_比米酷好用_模板超好看
  14. java读取pdf的文字、图片、线条和对应坐标
  15. 消费者行为分析包含了哪些内容?
  16. centos6添加系统服务
  17. vb.net 教程 3-4 窗体编程 公共控件7 DateTimePicker MonthCalendar
  18. J3061《信息物理融合系统网络安全指南》
  19. mui 页面无法下滑拖拽 主要体现在华为手机浏览器
  20. 30款Linux 高性能网络开发库开源软件

热门文章

  1. 前端教程:LAMP是什么意思?做什么的?有什么特点?
  2. 【UI】锤子手机-坚果手机-文艺青年版-配色色号
  3. 本体李俊火星大学最新演讲:从区块链核心价值谈金融场景应用
  4. 运营管理整改报告范文_快递整改报告怎么写
  5. R提示ERROR: dependencies ‘caret’ are not available for package ‘XXX’ 和MethylCIBERSORT的R包安装
  6. 联想台式计算机重装系统教程,联想台式机重装系统win7图文教程
  7. 冲量在线当选中关村数字经济产业联盟理事单位
  8. html需要电脑什么配置,买电脑主要看什么配置和参数
  9. 抖音直播带货数据在哪里看?有哪些考核指标?
  10. AXI总线详解-AXI4读写操作时序及AXI4猝发地址及选择