作者:小卒
GIS在洪涝灾害监测评估中的应用非常广泛,相必大家都比较了解,比如估算财产损失,监测水位高程,模拟淹没分析等等,为抗洪救灾提供了快速、准确的辅助支撑。今天小编在这里为大家介绍一下结合SuperMap iObjects.NET来计算一定区域范围内注水量的高度和水位高程,从而实现iObjects在洪涝灾害中的简单应用。
如果我们有某个地方的dem高程数据,并且知道该地的降水量,那么通过小编的这个程序就可以知道这个地方任何区域范围内注水高度和该范围的水位高程,如果注水高度达到了该范围的警戒高度,说明会有洪灾可能发生,就要安配相关人员做好提前防御措施。那么具体的算法是怎么实现的,跟着小编的思路往下走。
- 首先通过剖面分析得到该区域矢量面边界和dem相交的所有采样点,进而可以确定这些采样点对应的栅格值,然后通过遍历比较得到其中最小的栅格值,即为出水口的高程。
/* 获取面对象边界所相交的栅格的最小栅格值,即为出水口高程*/
private double Getminvalue_l()
{
double minvalue = datasetgrid.GetValue(datasetgrid.XYToGrid(listpoint2d[0]).X, datasetgrid.XYToGrid(listpoint2d[0]).Y);
for (int i = 0; i < listpoint2d.Count; i++)
{
Point point = datasetgrid.XYToGrid(listpoint2d[i]);
double value = datasetgrid.GetValue(point.X, point.Y);
if (value < minvalue)
{
minvalue = value;
}
}
return minvalue;
}
2.获取指定区域范围内的栅格的最小值,即为洼地的底部高程。
// 获取指定区域范围内的栅格的最小值
private double Getminvalue_r()
{
ExtremumInfo exinfo = CalculationTerrain.FindExtremum(datasetgrid, georegion, 1);
return exinfo.MinValue;
}
3.累积计算该区域所有洼地的体积,该体积为该区域的最大储水量,当洼地的体积小于等于要注入雨水的体积的时候,洼地的出水口高程与洼地底部高程的差即为注水的高度,出水口高程为水位高程。主要实现算法如下:
//累积计算该区域所有洼地的体积
private double getGridView(int Gridleft, int Gridright, int Gridtop, int Gridbottom)
{
//获取栅格数据分辨率
Rectangle2D rectangle2DG = datasetgrid.Bounds;
double xF = (rectangle2DG.Right - rectangle2DG.Left) / datasetgrid.Width;
double yF = (rectangle2DG.Top - rectangle2DG.Bottom) / datasetgrid.Height;
//栅格面积
s = xF * yF;
double v = 0;
//出水口高程
l_value = Getminvalue_l();
//遍历得到栅格值
for (int ix = Gridleft; ix <= Gridright; ix++)
{
for (int iy = Gridtop; iy <= Gridbottom; iy++)
{
//判断栅格行列是否在面内
Point2D point2dG = datasetgrid.GridToXY(new Point(ix, iy));
GeoPoint geopoint = new GeoPoint(point2dG.X + xF / 2, point2dG.Y - yF / 2);
if (Geometrist.IsWithin(geopoint, georegion))
{
//处理索引超出的情况
double value = datasetgrid.GetValue(ix, iy);
gridViewList.Add(value);
//每个栅格与出水口的高程差
if (l_value > value)
{
double height = l_value - value;
v = v + (s * height);
}
}
}
}
return v;
}
如果当洼地的体积>注水的体积的时候,循环累积该范围内每个栅格与最底栅格构成的洼地体积,当遍历到体积接近注入量的时候,这个时候的高度就是注水的高度,实现代码如下:
/*当洼地的体积大于水的体积的时候,循环遍历计算洼地的体积,当体积大约等于水的体积的时候,这个时候的高度就是注水的高度*/
else
{
double v = 0;
//对获取到的栅格值进行配需
gridViewList.Sort();
for (int i = 0; i < gridViewList.Count(); i++)
{
double value = gridViewList[i];
//栅格单元的值与指定区域范围内的栅格的最小值之差
double volumeheight = value - minvalue;
//累加统计体积
v = v + (s * volumeheight);
//注水量与累计体积做计算
double n = rainvolume - v;
//用注水量与累计体积的差的正负作为分界点
if (n < 0)
{
//获得到差值为正时的差值
double j1 = Math.Abs(rainvolume - (v - s * (gridViewList[i - 1] - minvalue)));
//获得到差值为负时的差值绝对值
double j2 = Math.Abs(n);
//差值做比较,哪个的值更小,说明该栅格的值更接近水位的高程值
if (j1 >= j2)
{
tb_height.Text = volumeheight.ToString();
tb_value.Text = value.ToString();
return;
}
else
{
tb_height.Text = (gridViewList[i - 1] - minvalue).ToString();
tb_value.Text = gridViewList[i - 1].ToString();
return;
}
}
}
}
以上就是整体的实现思路,希望对感兴趣的同志有所帮助,小编旨在与大家一起探讨学习,如有不足的地方,希望大家献上宝贵的意见,大家相互进行思维的碰撞。最后小编附上程序的运行结果图和源代码下载地址:链接:http://pan.baidu.com/s/1o72Mijo 密码:1c5y