ArcEngine开发:通过两点构成正方形为范围去裁剪栅格数据

如题,通过两点的坐标,构成正方形来剪裁栅格。frontPoint是较小的 x y值,backPoint是较大的x y值。最后保存栅格数据,并输出到文件。因为将数据变量及时回收了,所以在输出到文件后,也可以马上调用,不会出现问题。

public static void ReClipRaster(IRasterLayer rasterlayer, double[] frontPoint, double[] backPoint, string fileName)
        {
            try
            {
                //将polygon的外包矩形转化为一个新的IPolygon
                IRaster pRaster = rasterlayer.Raster;
                IRasterProps pProps = pRaster as IRasterProps;
                //double cellSizeProvider = pProps.MeanCellSize().X;
                IEnvelope envelop = new EnvelopeClass();
                //envelop.XMin = frontPoint.X;
                //envelop.YMin = frontPoint.Y;
                //envelop.XMax = backPoint.X;
                //envelop.YMax = backPoint.Y;

                envelop.XMin = frontPoint[0];
                envelop.YMin = frontPoint[1];
                envelop.XMax = backPoint[0];
                envelop.YMax = backPoint[1];

                //envelop.Envelope.XMin = frontPoint.X;
                //envelop.Envelope.YMin = frontPoint.Y;
                //envelop.Envelope.XMax = backPoint.X;
                //envelop.Envelope.YMax = backPoint.Y;
                //envelop.XMax = polygon.Envelope.XMax + cellSizeProvider;
                //envelop.YMax = polygon.Envelope.YMax + cellSizeProvider;
                IPointCollection pPointCollection = new PolygonClass();
                object missing = Type.Missing;
                pPointCollection.AddPoint(envelop.LowerLeft, ref missing, ref missing);
                pPointCollection.AddPoint(envelop.LowerRight, ref missing, ref missing);
                pPointCollection.AddPoint(envelop.UpperRight, ref missing, ref missing);
                pPointCollection.AddPoint(envelop.UpperLeft, ref missing, ref missing);
                IPolygon pRectPolygon = (IPolygon)pPointCollection;
                pRectPolygon.SimplifyPreserveFromTo();

                IRaster pRectRaster = RasterClip(rasterlayer, /*pPolygon*/pRectPolygon);
                SaveRaster(pRectRaster, fileName);
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message, "SaveRaster Error");
            }
        }

        public static IRaster RasterClip(IRasterLayer pRasterLayer, IPolygon clipGeo)
        {
            if (clipGeo == null) return null;

            IRaster clipRaster = null;

            IRaster pRaster = pRasterLayer.Raster;
            IRasterProps pProps = pRaster as IRasterProps;
            object cellSizeProvider = pProps.MeanCellSize().X;
            IGeoDataset pInputDataset = pRaster as IGeoDataset;
            IExtractionOp pExtractionOp = new RasterExtractionOpClass();
            IRasterAnalysisEnvironment pRasterAnaEnvir = pExtractionOp as IRasterAnalysisEnvironment;
            pRasterAnaEnvir.SetCellSize(esriRasterEnvSettingEnum.esriRasterEnvValue, ref cellSizeProvider);
            object extentProvider = clipGeo.Envelope;
            object snapRasterData = Type.Missing;
            pRasterAnaEnvir.SetExtent(esriRasterEnvSettingEnum.esriRasterEnvValue, ref extentProvider, ref snapRasterData);
            IGeoDataset pOutputDataset = pExtractionOp.Polygon(pInputDataset, clipGeo as IPolygon, true);

            if (pOutputDataset is IRasterLayer)
            {
                IRasterLayer rasterLayer = pOutputDataset as IRasterLayer;
                clipRaster = rasterLayer.Raster;
            }
            else if (pOutputDataset is IRasterDataset)
            {
                IRasterDataset rasterDataset = pOutputDataset as IRasterDataset;
                clipRaster = rasterDataset.CreateDefaultRaster();
            }
            else if (pOutputDataset is IRaster)
            {
                clipRaster = pOutputDataset as IRaster;
            }

            return clipRaster;
        }
        private static void SaveRaster(IRaster outputRaster, string fileName)
        {
            try
            {
                string RasterFolder = System.IO.Path.GetDirectoryName(fileName);
                string name = System.IO.Path.GetFileNameWithoutExtension(fileName);
                IWorkspaceFactory pWKSF = new RasterWorkspaceFactoryClass();
                IWorkspace pWorkspace = pWKSF.OpenFromFile(RasterFolder, 0);
                ISaveAs pSaveAs = outputRaster as ISaveAs;

                if(System.IO.File.Exists(fileName))
                {
                    System.IO.File.Delete(fileName);
                }
                pSaveAs.SaveAs(fileName, pWorkspace, "TIFF");
                if (pSaveAs != null)
                {
                    Marshal.FinalReleaseComObject(pSaveAs);
                    pSaveAs = null;
                }
                GC.Collect();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

也可以使用任意shp形式的数据去裁剪,需要在此基础上,稍加修改代码。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值