基于ArcGIS Engine的DEM水文分析——影像提取工具
前段时间在做一个项目,主要是关于如何利用ArcGIS Engone进行DEM水文分析的项目,项目虽然不大,但是涉及的东西还是蛮多的,现在做一个总结,虽然不敢说,自己的项目做的如何完美,但是基本上解决了客户的实际需要,拿出部分和大家分享,希望各位能够拍砖,有更好的解决方案的同道之人,还望能够起到抛砖引玉的作用,废话上说,上正文了!
在这一次的项目里面,主要是解决DEM数据的存储方案,我们决定采用Raster Dataset的方式存储项目需要的DEM数据,Grid文件和其它方式的存储方式可能在某些方面更利于后期的数据分析,但是考虑到共享以及重复利用,以及数据安全性等几个因素,就决定采用ArcSDE进行DEM数据存储。这就需要对按照图幅分幅的DEM数据进行拼接整理,形成一个全区域的数字地表高程模型数据库。(在这个过程中也花费了不少周折,主要是用户方提供DEM数据没有统一规范,主要是表现在DEM的数据格式和内容上面。1、高程数据在不同的区域可能存在放大的问题;2、存在e00和dem两种类型数据的格式;3、同时存在坐标偏移的问题。)
形成全区域的DEM数据后,新的问题也接踵而至,如果所有的功能都基于全区域来做的话,那个速度,是个人恐怕都不能忍受的(有点严重了),而且用户真正关心的区域可能并不是全局,往往带来资源的巨大浪费,所以我们需要提取所关心的区域进行分析,这也是我在这篇文章需要讲到的东西——栅格数据提取工具。
上个图片先:
在该工具可以实现矩形裁剪、多边形裁剪、圆形裁剪,不光是对DEM数据有效,对栅格影像类的数据的裁剪都可以用该工具来实现。
///<summary>
///影像提取
/// 0 ---默认格式:GRID
/// 1 ---TIFF
/// 2 ---IMAGINE image
///</summary>
///<param name="pRaster"></param>
public static IRaster GetNewRasterProps(IRaster pRaster,string outPath,int format,string sOutName,IEnvelope pEnvelope)
{
IRasterWorkspace rasterWorkspace;
string sFormat = "GRID";
if (format == 1)
{
sFormat = "TIFF";
sOutName = sOutName + ".tiff";
}
else if (format == 2)
{
sFormat = "IMAGINE Image";
sOutName = sOutName + ".img";
}
else
{
sFormat = "GRID";
}
if(pRaster == null) return null;
IRasterBandCollection pRasterCol = new MosaicRasterClass() as IRasterBandCollection;
IRasterProps pRasterProps = pRaster as IRasterProps;
IClone pClone = pRaster as IClone;
pRasterProps = pClone.Clone() as IRasterProps;
int cellSize = GetCellSize(pRaster);
pRasterProps = NewRasterProps(pEnvelope,pRasterProps,cellSize,true);
IRaster pRaster1 = pRasterProps as IRaster;
pRasterCol = pRaster1 as IRasterBandCollection;
rasterWorkspace = RasterUtilityClass.GetRasterWorkspace(outPath);
pRasterCol.SaveAs(sOutName, rasterWorkspace as IWorkspace, sFormat);
return pRaster1;
}
///<summary>
///重新定义Raster参数
///</summary>
///<param name="pExtent">切割区域</param>
///<param name="pRasterProp">原有Raster属性</param>
///<param name="iCellSize">Raster单元大小</param>
///<param name="bDemSize">是否按照栅格单元进行切割</param>
///<returns></returns>
private static IRasterProps NewRasterProps(IEnvelope pEnvelope,IRasterProps pRasterProp,int iCellSize,bool bDemSize)
{
try
{
int iCol=Convert.ToInt32((pEnvelope.XMax-pEnvelope.XMin)/iCellSize);
int iRow=Convert.ToInt32((pEnvelope.YMax-pEnvelope.YMin)/iCellSize);
//
if(iCol==0||iRow==0)
{
return null;
}
//
IPoint pLL=new PointClass();
IPoint pUR=new PointClass();
if(bDemSize)
{
pLL.X=pRasterProp.Extent.XMin+Math.Floor((pEnvelope.LowerLeft.X-pRasterProp.Extent.XMin)/iCellSize)*iCellSize;
pLL.Y=pRasterProp.Extent.YMin+Math.Floor((pEnvelope.LowerLeft.Y-pRasterProp.Extent.YMin)/iCellSize)*iCellSize;
}
else
{
pLL=pEnvelope.LowerLeft;
}
pUR.X=pLL.X+iCol*iCellSize;
pUR.Y=pLL.Y+iRow*iCellSize;
IEnvelope tempExtent =new EnvelopeClass();
tempExtent.LowerLeft=pLL;
tempExtent.UpperRight=pUR;
//定义新的Raster区域
pRasterProp.Extent=tempExtent;
pRasterProp.Height=iRow;
pRasterProp.Width=iCol;
return pRasterProp;
}
catch
{
return null;
}
}
接下来我们就可以围绕着我们提取出来的高程DEM数据,进行我们的水文分析了,要是大家有更好的方法,请指正哦!在下一篇的文章里面,我将写写如何实现类似ArcGIS中的栅格计算器的功能。