Grass Gis 峡谷堰塞湖预测模型r.lake剖析--湖心灌水洪泛算法

Grass Gis 是20世纪80年代初,美国军方建筑工程研究实验室(USA/CERL)的Bill Gorgan负责遴选一款具有土地管理、环境规划、环境评估的GIS软件。它有400多个地质分析模块,今天我们剖析一下r.lake算法。

1. 堰塞湖预测建模r.lake能做什么

如下图1左为一张地形栅格图,也是最常见的2D平面图。从图中可以看到许多的凹地盆地,当有山洪暴雨时就会形成堰塞湖。 Grass Gis 的r.lake就是能够预测堰塞湖形状大小的模块。例如,在图1左所示的红色圆圈位置开始注水当水位海拔高度为113.4米时,形成的堰塞湖的位置形状如图1右所示。Grass可以形成动画动态展示不断的提高水位后堰塞湖形态的变化。

我国长江三峡大坝水位设计海拔185米,蓄水库区淹没129座城镇,淹没耕地1.94万公顷。东起宜昌,西至重庆662.9Km沿长江两岸分水岭范围。在设计时就需要对185米高湖所能淹没的地区有非常精确的预测,如果沿岸有缺口造成计划外的地区被淹没就需要处理缺口。

Grass Gis 的r.lake 就可以完成这个事情,它的核心算法就是“湖心灌水洪泛算法“,它模拟了水在一点不断涌出时淹没了周边地区。

图1 堰塞湖预测模型演示

2. 数据降维简化模型

当一个点开始蓄水时,周边山岭的高度和形态都可以阻挡洪水的进一步蔓延,就像一个围栏一样。那怎样才能根据水位的海拔高度找出这些围栏的位置?首先想到的是三维建模以及空间关系计算等复杂的方式,其实不然。所有复杂的三维空间计算都要降维到二维平面计算,简化计算。

一个地区的遥感影像被处理成高程图也就是栅格图后,就变成了一个标准的M*N的数字矩阵。矩阵的每个点对于地图上的一个矩形区域,该点的值就是该区域的平均高度。图1就是这样的一个二维栅格图,只是每个像素被赋予不同的灰度颜色展现出来。一个复杂的三维地势图化简为矩阵后就变成了如图2a所示的二维数组,图中的数字为某块土地的海拔。

图2 栅格地图数据矩阵

当要求堰塞湖水位海拔9米时,满足条件的区域如图2b所示的三块区域。这样问题好像看起来非常简单了, 就是把数组遍历一遍找出<=9的区域不就行了?但是复杂的问题来了,当洪水爆发点在
6C 点,那9米的水只能在红色区域聚集成堰塞湖,黄色和蓝色都不应该被淹没,因为水被红色区域周围20多米高的地势挡住了。

现在的问题已经被简化成了一个简单的数据结构算法了。以 6C 点逐渐向往扩张,就像湖心有洪水不断涌出直到把周围的相邻8个格子中低于9米的区域淹没。6C为湖心的周边5B,5C,5D,6B,6D,7B,7C,7D被淹没了。接着以它们为湖心重复相同的操作,尝试淹没周围的8个邻居区域。不断重复直到没有新的可淹没区域被找到。这个算法很简单,就不给出代码了。

3.
以一个或多个堰塞湖区为洪水点

Grass
Gis 的r.lake提供了更为复杂的建模。不是以某个点为洪水发生地,而是以某个湖区在涌出洪水,甚至多个湖区一起涌出。这样每次都以上一轮模拟输出的湖区为下次模拟计算的输入,不断增高湖水高度,达到动画效果输出。

这个算法思想和上面单点的算法相似,只是每轮需要扫描M*N个像素点,每次是旁边8个区域只要有一个有水的点就试图向自己淹没,直到一轮没有新的扩张点就停下来。

</pre><p><pre name="code" class="cpp">int pases = (int)(rows * cols) / 2;
int  water_level = .... // 输入的要求的湖面海拔高度
int *in_terran; // row * col 输入的栅格地图,数值为地势的海拔高度
int *in_wanter; // row * col 输入的已经有水的湖区矩阵. 0无水,>0 为湖水平面到湖底的深度
int *out_water; // row * col 输出计算完毕的湖区矩阵. 初始为0无水,>0 为湖水平面到湖底的深度
copy_seed_water(in_wanter, out_water); // 初始输出湖区为输入湖区
int water_window[3][3]; // 某点为中心的3*3矩阵窗口,该窗口沿着地图每个点移动一遍为一趟

for (pass = 0; pass < pases; pass++)
{
	curcount = 0;
	/* 每个点扫描 */
	for (row = 0; row < rows; row++)
	{
	    for (col = 0; col < cols; col++)
		{
			//该点为中心去3*3矩阵
			load_neibour_window_values(out_water, water_window, rows, cols, row, col);
			//该点周围8个邻居是否有水往自己这边淹没
			if (is_near_water(water_window) == 1)
			{
				if (in_terran[row][col] < water_level)
				{
					// 该地势低,被淹没
					out_water[row][col] =  water_level - in_terran[row][col];
					curcount++;
				 }
				 else
				 {
					out_water[row][col] = 0;	/* 该地势比湖水面高 */
				 }
			}
	    }
	}
	if (curcount == lastcount)
	    break;		/* 没有发现新的淹没点,完成. */
	lastcount = curcount;
	curcount = 0;
	}
}

return out_water;

4.
Grass Gis平台提供的服务支持

上面的算法没有看到任何Grass
Gis 平台API的使用。其实栅格数据的输入,输出和图形化显示都是透明的交给了grass 平台了。向湖区的梯度渐变颜色表的建立就是调用API并绑定湖区地图的,但是开发人员并不知道该颜色表是怎样存储并绑定的。它提供的功能包括:

  • 各种地质地图数据文件在内存中的直接访问
  • 处理完成的地质数据向grass数据库的内存直接写
  • 地质地图颜色表的生成并绑定
  • 多个地质地图的三维叠加显示
  • 统一管理用户设定的的数据空间范围

所以使用Grass Gis
平台的优势就是使用它的数据存储基础服务,用户关心的空间范围和显示服务,把所有精力都集中在算法本身上面。对地址空间的处理操作并不提供现成的服务。

版权声明:本文为博主原创文章,未经博主允许不得转载。

版权声明:本文为博主原创文章,未经博主允许不得转载。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-06 03:24:21

Grass Gis 峡谷堰塞湖预测模型r.lake剖析--湖心灌水洪泛算法的相关文章

R语言构建蛋白质网络并实现GN算法

R语言构建蛋白质网络并实现GN算法 1.蛋白质网络的构建 我们使用与人类HIV相关的蛋白质互作数据hunam-HIV PPI.csv来构建这个蛋白质互作网络. 在R中,我们可以从存储在R环境外部的文件读取数据.还可以将数据写入由操作系统存储和访问的文件. R可以读取和写入各种文件格式,如:csv,excel,xml等. 想要读取csv文件,我们需要: 设置工作目录 读取CSV文件 代码如下: setwd("/Users/.../Documents/...") data <- re

x264代码剖析(十七):核心算法之熵编码(Entropy Encoding)

x264代码剖析(十七):核心算法之熵编码(Entropy Encoding) 熵编码是无损压缩编码方法,它生产的码流可以经解码无失真地恢复出原始数据.熵编码是建立在随机过程的统计特性基础上的.本文对熵编码中的CAVLC(基于上下文自适应的可变长编码)和CABAC(基于上下文的自适应二进制算术熵编码)进行简单介绍,并给出x264中熵编码对应的代码分析. 在H.264的CAVLC中,通过根据已编码句法元素的情况,动态调整编码中使用的码表,取得了极高的压缩比.CAVLC用于亮度和色度残差数据的编码,

R语言实现MCMC中的Metropolis–Hastings算法与吉布斯采样

原文:http://tecdat.cn/?p=3772 创建测试数据 作为第一步,我们创建一些测试数据,用于拟合我们的模型.让我们假设预测变量和响应变量之间存在线性关系,因此我们采用线性模型并添加一些噪声. 我将x值平衡在零附近以“去相关”斜率和截距.结果应该看起来像右边的 trueA <- 5 trueB <- 0 trueSd <- 10 sampleSize <- 31   # create independent x-values x <- (-(sampleSize

Java开源GIS系统

uDig 基于Eclipse RCP的uDig开源项目既是一个GeoSpatial应用程序也是一个平台开发者可通过这个平台来创建新的在uDig基础上衍生的应用程序,uDig是Web地理信息系统的一个核心组件. 更多uDig信息 GeoAPI GeoAPI为OGC/ISO标准提供一组Java接口. 更多GeoAPI信息 Geotools Geotools是一个开源的Java GIS工具包,可利用它来开发符合标准的地理信息系统.Geotools提供了OGC(Open Geospatial Conso

开源GIS简介

原文 开源GIS C++开源GIS中间件类库: GDAL(栅格)/OGR(矢量)提供了类型丰富的读写支持 GEOS(Geometry Engine Open Source)是基于C++的空间拓扑分析实现类库,遵循LGPL协议发布.GEOS类库提供了丰富的空间拓扑操作函数,用以判断几何对象间的相互关系,以及空间分析操作之后形成新的几何对象.点.线.面要素的两两相互关系,包括相合.分离.相交.重合.包含.相邻等不同位置关系,都可以通过GEOS类库中提供的函数进行分析和判断.并且GEOS类库提供了缓冲

GIS 网站参考

www.TimeGIS.com 开源GIS网址精选 转至3snewsOpen Source Geospatial Foundation http://osgeo.org/index.htmlMapServer — UMN MapServer http://mapserver.gis.umn.edu/GRASS GIS http://grass.itc.it/GeoTools http://docs.codehaus.org/-display/GEOTOOLS/Home/DM Solutions

开源GIS软件 1

1. 在线地图浏览器 GMap.NET GMap.NET 是一个强大.免费.跨平台.开源的.NET控件,它在Windows Forms 和WPF环境中能够通过Google, Yahoo!, Bing, OpenStreetMap, ArcGIS, Pergo, SigPac等实现寻找路径.地理编码以及地图展示功能,并支持缓存和运行在Mobile环境中. GMap.NET 是一个开源的GEO地图定位和跟踪程序.就像谷歌地图.雅虎地图一样,可以自动计算两地的距离,定位经纬度,与Google地图不同的

开源的GIS软件清单

Awesome GIS Awesome GIS is for collecting the geographic information system (GIS) related sources, including cartographer tools, geoanalysis tools, developing tools, data, conference & communities, news, MOOC's course, some amazing map site, etc. Wel

13 Free GIS Software Options: Map the World in Open Source

13 Free GIS Software Options: Map the World in Open Source A LIST OF FREE OPEN SOURCE MAPPING SOFTWARE 1025 SHARES FacebookTwitterSubscribe Your search for free GIS software is now over You don't have to pay a king's ransom to map the world. This is