您的位置:首页 > 编程语言 > C#

C#+Arcengine实现GP工具中Data Management Tool》raster》raster processing中的clip功能(矢量数据对栅格数据的裁剪)

2015-01-28 19:49 543 查看
Arcgisdesktop中Data Management Tool中有一个clip的功能,即可以实现根据矢量数据的范围对栅格数据的裁剪的功能,在这里它有一个可选项use input features for Clipping Geometry,即是否按照所输入shp数据的图形范围对栅格数据进行裁剪,根据其是否勾选,clip有两种实现方法,具体如下:

1,、勾选,即按照矢量数据的范围对栅格数据进行裁剪(裁剪后输出范围和输入的shp相同):

/// <summary>

/// 按shp范围裁剪Raster数据

/// </summary>

/// <param name="inShp">输入shp数据</param>

/// <param name="inRaster">输入Raster数据</param>

private string ClipDem(string inShp, string inRaster)

{

try

{

//调用GP工具

Geoprocessor clipGeoprocessor = new Geoprocessor();

//这个工作空间大家电脑上都有,可以都写这个,不必更换路径(只要你装了arcgis)

clipGeoprocessor.SetEnvironmentValue("workspace", @"C:\Users\TOMATO\Documents\ArcGIS\Default.gdb");

clipGeoprocessor.OverwriteOutput = true;

//要保存的裁剪raster名称

string clipRasterName = "clipRaster.tif";

//路径+raster名称(newFolder是你想保存裁剪影像的路径)

string clipRaster = newFolder + "\\" + clipRasterName;

//判断此栅格文件是否存在,若存在,删除

if (File.Exists(clipRaster))

{

File.Delete(clipRaster);

}

//初始化clip工具

Clip newClipRaster = new Clip()

{

in_raster = inRaster, // 输入栅格数据(路径+名称)

out_raster = clipRaster, //要输出的裁剪栅格数据的路径+名称

clipping_geometry = "ClippingGeometry", //注意,此处就是arcgis中use input features for Clipping Geometry勾选的状态,不勾选为none

rectangle = "#", //此处为输出矩形的范围,注意,这里若给出范围,则裁剪图像按给出的范围输出,不管你上面的勾是否勾选

in_template_dataset = inShp // 输入的矢量数据的路径+名称(应该必须为polygon,未验证)


};

IGeoProcessorResult result = (IGeoProcessorResult)clipGeoprocessor.Execute(newClipRaster, null);

//判断是否裁剪成功

if (!File.Exists(clipRaster))

{

return null;

}

return clipRaster;

}

catch (Exception ex)

{

Console.WriteLine(ex.Message);

return null;

}

}

2、不勾选,即按照矢量数据的外包矩形的范围对栅格数据进行裁剪(裁剪后输出的范围是输入shp图像的外包矩形的范围):

/// <summary>

/// 按shp外包矩形范围裁剪Raster数据

/// </summary>

/// <param name="inShp">输入shp数据</param>

/// <param name="inRaster">输入Raster数据</param>

private string ClipDem(string inShp, string inRaster)

{

try

{

//调用GP工具

Geoprocessor clipGeoprocessor = new Geoprocessor();

clipGeoprocessor.OverwriteOutput = true;

//创建工作空间

IWorkspaceFactory workspaceFactory = new ShapefileWorkspaceFactoryClass();

IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspaceFactory.OpenFromFile(shapefilePath, 0);



////得到用户所选shp文件中的featureClass

IFeatureClass featureClass = featureWorkspace.OpenFeatureClass(System.IO.Path.GetFileNameWithoutExtension(inShpName));



//得到feature,进而得到shp外包矩形的范围

IFeatureCursor featureCursor = featureClass.Search(null, false);

IFeature feature = featureCursor.NextFeature();

while (feature != null)

{

//此处即为shp外包矩形的范围

rectangle = string.Format("{0} {1} {2} {3}", feature.ShapeCopy.Envelope.XMin, feature.ShapeCopy.Envelope.YMin, feature.ShapeCopy.Envelope.XMax, feature.ShapeCopy.Envelope.YMax);

feature = featureCursor.NextFeature();

}

string clipRasterName = "clipRaster.tif";//要输出的裁剪raster名称

string outputrasterpath = staruoPath + "\\" + clipRasterName; //路径+raster名称

//判断此文件是否存在,若存在,删除

if (File.Exists(outputrasterpath))

{

File.Delete(outputrasterpath);

}

//初始化clip工具

Clip clipRaster = new Clip()

{

in_raster = inRaster,//同上

out_raster = outputrasterpath,//同上

clipping_geometry = "none",//此处即为不勾选的情况

rectangle =rectangle //输出范围为外包矩形




};

IGeoProcessorResult result = (IGeoProcessorResult)clipGeoprocessor.Execute(clipRaster, null);

if (File.Exists(outputrasterpath))

{

MessageBox.Show("裁剪成功!");

}

}





}

catch (Exception ex)

{

MessageBox.Show("失败!");

Console.WriteLine(ex.Message);

}

}

注意,输入shp文件的路径+名称和要输入栅格数据的路径+名称,一定要写正确,不然GP工具调用的时候容易报出“对com组建的调用返回了错误的HRESULT_FAIL”这个错误,如确定输入路径正确,还是报错,可以参考http://llsshh1985.blog.163.com/blog/static/14006860320145174550560/(arcgisengine中调用GP报错的问题)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐