如题,通过两点的坐标,构成正方形来剪裁栅格。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形式的数据去裁剪,需要在此基础上,稍加修改代码。