基于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中的栅格计算器的功能。

posted @ 2008-07-02 22:34  nationing  阅读(3006)  评论(1编辑  收藏  举报