ArcEngine 实现SurfaceAnalysis中的Cut/Fill功能

 /// <summary>
        /// 计算两个表面之间的体积
        /// </summary>
        /// <param name="usfolder">上表面父目录</param>
        /// <param name="usdataset">上表面目录名</param>
        /// <param name="dsfolder">下表面父目录</param>
        /// <param name="dsdataset">下表面目录名</param>
        public void CalculateCutFill(string usfolder,string usdataset,string dsfolder,string dsdataset)
        {
            //设置CutFill分析时的cellSize


            /*object cellsize = 0.345;
            RasterSurfaceOpClass rclass = new RasterSurfaceOpClass();
            rclass.SetCellSize(esriRasterEnvSettingEnum.esriRasterEnvValue, ref cellsize);
            ISurfaceOp psurfaceOp = rclass;*/

         /* ITin pTinUp = GetTinLayer(usfolder, usdataset);
            ITin pTinDown = GetTinLayer(dsfolder, dsdataset);
            IGeoDataset pGeodsUp = pTinUp as IGeoDataset;       //在ArcMap中可以用Tin直接进行CutFill.但是Engine中,只能用Raster作为ISurfaceOp.CutFill的参数
            IGeoDataset pGeodsDown = pTinDown as IGeoDataset;*/ //若使用ITin转成GeodataSet作为参数,提示InvalidInputGeodataset
                                                                //处理方式:先用3DAnalysis的TinToRaster,将两个Tin转成Raster

            ISurfaceOp psurfaceOp = new RasterSurfaceOpClass();
            IGeoDataset pGeodsUp = OpenRasterDataSet(@"E:\ShpForContour\ContourFromShp", "tin2529raster") as IGeoDataset;//ISurfaceOp.CutFill(geods,geods,obj)
            IGeoDataset pGeodsDown = OpenRasterDataSet(@"E:\ShpForContour\ContourFromShp", "tinbottomrar") as IGeoDataset;//geods要求是rasterdataset, Tindataset不行
            
            object zfactor=new object();
            zfactor = 1.0;
            IGeoDataset pGeodsResult = psurfaceOp.CutFill(pGeodsUp, pGeodsDown, ref zfactor);//CutFill分析
            
            //读取Raster的属性表
            IRaster pRaseter = pGeodsResult as IRaster; //IGeoDataset转IRaster
            IRasterBandCollection pRasterBC = pRaseter as IRasterBandCollection;
            IRasterBand pRasterBand = pRasterBC.Item(0);
            ITable pTable = pRasterBand.AttributeTable;

            ICursor pCursor = pTable.Search(null, false);
            IRow pRow = pCursor.NextRow();


            DataTable dt = new DataTable();
             

            for (int i = 0; i < pTable.Fields.FieldCount; i++)
            {
                dt.Columns.Add(pTable.Fields.get_Field(i).Name);
                //MessageBox.Show(pTable.Fields.get_Field(i).Name);    //字段名字
            }

            while (pRow != null)
            {
                //以下显示COUNT字段的值
                DataRow dr = dt.NewRow();
                for (int i = 0; i <= dt.Columns.Count - 1; i++)
                {
                    dr[i] = Convert.ToString(pRow.get_Value(i));
                }
                dt.Rows.Add(dr);
                pRow = pCursor.NextRow();
            }
        }

 

 

 备注:

    在ArcMap中SurfaceAnalysis CutFill分析的结果只能存为可以是ESRI GRID(Raster),TIFF,ERDAS 三种类型。这三种类型都是栅格数据

posted on 2012-04-18 16:47  imihiro  阅读(1662)  评论(0编辑  收藏  举报