Arcgis Engine矢量裁剪栅格,调用Mask工具相关代码
2014-12-19 17:08
435 查看
今天试了下arcgis 矢量裁剪栅格,首先在arcmap上面操作,发现有好几种方式都能实现:
方法1,矢量转栅格,把像元值设置1(方法是添加一个字段,将字段值全部赋值1)然后调用toolbox的时候,选择该字段;这样就生成了一个所有cell的值为1的栅格RasterA。
接下来,将RasterA与我们要裁剪的栅格对象RasterB进行栅格计算(栅格计算也用toolbox里面的,不要用菜单里面的,因为我们最后代码里面调用的是toolbox),将RasterA*RasterB就是最终结果啦。
方法2,和方法1的区别就是,不用添加字段,而是重分类一下,Reclassify重分类,将某个字段的值重分类为1。
方法3,也是最屌的方法,直接用Extract by Polygon工具。
3种方法区别:
方法1和方法2算是同一种,他们比方法3稳定,因为他们只是单纯栅格计算,在大数据量的时候比较靠谱。方法3虽然简单,但面对大数据量处理的时候,容易出错,不太稳定。当然小数据的话,还是木有问题的。
下边直接贴代码啦,简单的封装了一个类
下边是调用代码:
方法1,矢量转栅格,把像元值设置1(方法是添加一个字段,将字段值全部赋值1)然后调用toolbox的时候,选择该字段;这样就生成了一个所有cell的值为1的栅格RasterA。
接下来,将RasterA与我们要裁剪的栅格对象RasterB进行栅格计算(栅格计算也用toolbox里面的,不要用菜单里面的,因为我们最后代码里面调用的是toolbox),将RasterA*RasterB就是最终结果啦。
方法2,和方法1的区别就是,不用添加字段,而是重分类一下,Reclassify重分类,将某个字段的值重分类为1。
方法3,也是最屌的方法,直接用Extract by Polygon工具。
3种方法区别:
方法1和方法2算是同一种,他们比方法3稳定,因为他们只是单纯栅格计算,在大数据量的时候比较靠谱。方法3虽然简单,但面对大数据量处理的时候,容易出错,不太稳定。当然小数据的话,还是木有问题的。
下边直接贴代码啦,简单的封装了一个类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.Geoprocessor; using ESRI.ArcGIS.Geoprocessing; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.SpatialAnalystTools; using ESRI.ArcGIS.SpatialAnalyst; using ESRI.ArcGIS.DataSourcesRaster; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.DataSourcesGDB; namespace GPOperator { public class ClipHelper : GPTool { /// <summary> /// 栅格裁剪 /// </summary> /// <param name="inputRaster">要裁剪的栅格(支持对象和栅格文件路径)</param> /// <param name="maskData">掩膜数据(支持对象和shp文件路径)</param> /// <returns></returns> public IGeoDataset ClipRaster2(object inputRaster, object maskData, out string resultInfo) { string outRaster = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "ClipRaster_" +DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss")+ Guid.NewGuid().ToString ("D").Substring(0,4) + ".tif"); //参数:对象或路径都支持 ESRI.ArcGIS.SpatialAnalystTools.ExtractByMask mask = new ESRI.ArcGIS.SpatialAnalystTools.ExtractByMask(inputRaster, maskData, outRaster);//@"C:\tmp\新建文件夹 \ret.tif" bool isok = this.Excute(mask, out resultInfo); //IWorkspaceFactory wsf = new RasterWorkspaceFactory(); //IRasterWorkspace rasterWS = wsf.OpenFromFile(System.IO.Path.GetDirectoryName(outRaster), 0) as IRasterWorkspace; //IRasterDataset rds = rasterWS.OpenRasterDataset(System.IO.Path.GetFileName(outRaster)); IRasterDataset rasterDataset = new RasterDataset(); rasterDataset.OpenFromFile(outRaster); return rasterDataset as IGeoDataset; } /// <summary> /// 栅格裁剪 /// </summary> /// <param name="inputRaster">要裁剪的栅格(支持对象和栅格文件路径)</param> /// <param name="maskData">裁剪多边形</param> /// <returns>裁剪得到的栅格</returns> public IGeoDataset ClipRaster(object inputRaster, IPolygon polygon, out string resultInfo) { var maskData = CreateFeatureClass(polygon); string outRaster = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "ClipRaster_" + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + Guid.NewGuid().ToString ("D").Substring(0, 4) + ".tif"); ESRI.ArcGIS.SpatialAnalystTools.ExtractByMask mask = new ESRI.ArcGIS.SpatialAnalystTools.ExtractByMask(inputRaster, maskData, outRaster); if (this.Excute(mask, out resultInfo)) { return null; } IRasterDataset rasterDataset = new RasterDataset(); try { rasterDataset.OpenFromFile(outRaster); } catch (Exception ex) { resultInfo = ex.ToString(); return null; } finally { try { ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(maskData); } catch { } } return rasterDataset as IGeoDataset; } /// <summary> /// 栅格裁剪 /// Op方法,直接返回对象 /// </summary> /// <param name="inputRaster">要裁剪的栅格</param> /// <param name="maskData">掩膜数据</param> /// <returns></returns> public IGeoDataset ClipRaster3(IGeoDataset inputRaster, IGeoDataset maskData,out string resultInfo) { resultInfo = "执行成功"; IExtractionOp2 op = new RasterExtractionOpClass(); try { return op.Raster(inputRaster, maskData); } catch (Exception ex) { resultInfo = ex.ToString(); return null; } } public IFeatureClass CreateFeatureClass(IPolygon polygon) { IFeatureClassDescription fcDescription = new FeatureClassDescriptionClass(); IObjectClassDescription ocDescription = (IObjectClassDescription)fcDescription; IFeatureClass fc= createFeatureClassInmemeory("temp", "temp", polygon.SpatialReference, esriGeometryType.esriGeometryPolygon, ocDescription.RequiredFields); if (null == fc) { return null; } IFeature f= fc.CreateFeature(); f.Shape = polygon; f.Store(); return fc; } //IFeatureCache /// <summary> /// 在内存中创建临时要素类 /// </summary> /// <param name="DataSetName">数据集名称</param> /// <param name="AliaseName">别名</param> /// <param name="SpatialRef">空间参考</param> /// <param name="GeometryType">几何类型</param> /// <param name="PropertyFields">属性字段集合</param> /// <returns>IfeatureLayer</returns> private IFeatureClass createFeatureClassInmemeory(string DataSetName, string AliaseName, ISpatialReference SpatialRef, esriGeometryType GeometryType, IFields PropertyFields) { IWorkspaceFactory workspaceFactory = new InMemoryWorkspaceFactoryClass(); ESRI.ArcGIS.Geodatabase.IWorkspaceName workspaceName = workspaceFactory.Create("", "MyWorkspace", null, 0); ESRI.ArcGIS.esriSystem.IName name = (IName)workspaceName; ESRI.ArcGIS.Geodatabase.IWorkspace inmemWor = (IWorkspace)name.Open(); IField oField = new FieldClass(); IFields oFields = new FieldsClass(); IFieldsEdit oFieldsEdit = null; IFieldEdit oFieldEdit = null; IFeatureClass oFeatureClass = null; try { oFieldsEdit = oFields as IFieldsEdit; oFieldEdit = oField as IFieldEdit; for (int i = 0; i < PropertyFields.FieldCount; i++) { IField field = PropertyFields.get_Field(i); if (field.Type != esriFieldType.esriFieldTypeGeometry) { oFieldsEdit.AddField(field); } } IGeometryDef geometryDef = new GeometryDefClass(); IGeometryDefEdit geometryDefEdit = (IGeometryDefEdit)geometryDef; geometryDefEdit.AvgNumPoints_2 = 5; geometryDefEdit.GeometryType_2 = GeometryType; geometryDefEdit.GridCount_2 = 1; geometryDefEdit.HasM_2 = false; geometryDefEdit.HasZ_2 = false; geometryDefEdit.SpatialReference_2 = SpatialRef; oFieldEdit.Name_2 = "SHAPE"; oFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry; oFieldEdit.GeometryDef_2 = geometryDef; oFieldEdit.IsNullable_2 = true; oFieldEdit.Required_2 = true; oFieldsEdit.AddField(oField); oFeatureClass = (inmemWor as IFeatureWorkspace).CreateFeatureClass(DataSetName, oFields, null, null, esriFeatureType.esriFTSimple, "SHAPE", ""); (oFeatureClass as IDataset).BrowseName = DataSetName; return oFeatureClass; } catch(Exception ex) { return null; } } } /// <summary> /// GP工具基类,实现执行工具公共方法和释放资源方法的定义。 /// </summary> public class GPTool { private Geoprocessor gp = null; private IGeoProcessorResult gpResult = null; public GPTool() { gp = new Geoprocessor(); gp.OverwriteOutput = true; } /// <summary> /// 释放资源 /// </summary> public void Release() { if (gp != null) { ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(gp); gp = null; } if (gpResult != null) { ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(gpResult); gpResult = null; } } /// <summary> /// 执行已定义参数的GP工具。 /// </summary> protected bool Excute(IGPProcess gpProcess, out string resultInfo) { resultInfo = "执行成功"; gpResult = (IGeoProcessorResult)gp.Execute(gpProcess, null); if (gpResult == null || gpResult.Status != esriJobStatus.esriJobSucceeded) { // 执行错误,输入错误报告。 StringBuilder message = new StringBuilder(gpProcess.ToolName); for (int i = 0; i < gp.MessageCount; i++) { message.AppendLine(gp.GetMessage(i)); } resultInfo = message.ToString(); return false; } ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(gpProcess); return true; } } }
下边是调用代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using ESRI.ArcGIS.esriSystem; using GPOperator; using ESRI.ArcGIS.DataSourcesRaster; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.DataSourcesFile; using ESRI.ArcGIS.Geometry; namespace ConsoleApplication1 { class Program { private static LicenseInitializer m_AOLicenseInitializer = new ConsoleApplication1.LicenseInitializer(); static void Main(string[] args) { //ESRI License Initializer generated code. m_AOLicenseInitializer.InitializeApplication(new esriLicenseProductCode[] { esriLicenseProductCode.esriLicenseProductCodeBasic, esriLicenseProductCode.esriLicenseProductCodeAdvanced }, new esriLicenseExtensionCode[] { esriLicenseExtensionCode.esriLicenseExtensionCodeNetwork, esriLicenseExtensionCode.esriLicenseExtensionCodeSpatialAnalyst, esriLicenseExtensionCode.esriLicenseExtensionCodeSchematics, esriLicenseExtensionCode.esriLicenseExtensionCodeMLE, esriLicenseExtensionCode.esriLicenseExtensionCodeDataInteroperability, esriLicenseExtensionCode.esriLicenseExtensionCodeTracking, esriLicenseExtensionCode.esriLicenseExtensionCodeArcScan, esriLicenseExtensionCode.esriLicenseExtensionCodeBusiness, esriLicenseExtensionCode.esriLicenseExtensionCodeCOGO, esriLicenseExtensionCode.esriLicenseExtensionCodeGeoStats, esriLicenseExtensionCode.esriLicenseExtensionCodePublisher }); //ESRI License Initializer generated code. test(); //Do not make any call to ArcObjects after ShutDownApplication() m_AOLicenseInitializer.ShutdownApplication(); } public static void test() { //准备数据 string polygon = @"D:\quickly\其它\矢量裁剪栅格\shp\LD.shp"; string inputRastger = @"D:\quickly\其它\矢量裁剪栅格\temp\risk11.tif"; ClipHelper c = new ClipHelper();//必须要在打开栅格之前调用,不然打开栅格会出错,还不知道原因。 string errInfo = ""; IRasterDataset rasterDataset = new RasterDataset(); rasterDataset.OpenFromFile(inputRastger); IWorkspaceFactory wsf = new ShapefileWorkspaceFactory(); IFeatureWorkspace fws = wsf.OpenFromFile(System.IO.Path.GetDirectoryName(polygon), 0) as IFeatureWorkspace; IFeatureClass f = fws.OpenFeatureClass("LD"); var feat = f.Search(null, false).NextFeature(); var ret = c.ClipRaster(rasterDataset, feat.Shape as IPolygon, out errInfo); } } }
相关文章推荐
- Arcgis Engine矢量裁剪栅格,调用Mask工具相关代码
- C#+Arcengine实现GP工具中Data Management Tool》raster》raster processing中的clip功能(矢量数据对栅格数据的裁剪)
- C# CLRInsideOut 托管代码与非托管代码互操作,产生相关调用代码的好工具 C++ 头文件转C# 的好工具
- C# CLRInsideOut 托管代码与非托管代码互操作,产生相关调用代码的好工具 C++ 头文件转C# 的好工具(转
- cocos2dx 2.1.4 程序运行脉络解析1— win32版本的相关代码调用流程
- Erdas:将shp文件保存为Erdas中适用的AOI文件 矢量数据裁剪栅格
- linux 为崩溃的程序生成core文件的相关函数,调用代码生成core dump file 但程序不用退出,gdb 分析core
- 代码生成相关工具及技术
- 01-数据库表生成mybatis相关代码的工具
- ArcEngine调用GP工具实现多边形Clip裁剪功能
- (转载)基于ArcGIS Engine编写的ColorRamp对栅格渲染代码
- 使用svcutil工具自动生成wcf调用的客户端代码和配置文件
- 用于分析和生成代码函数调用关系图的相关工具
- Android [应用代码] 简单调用系统的图片裁剪功能
- 使用Progurad工具混淆代码 保留内部类并正常调用
- dede5.6 调用 “相关文章”代码
- C调用Python函数相关代码示例剖析
- 开放源码的对象关系映射工具ORM.NET 查询表 调用存储过程 增加自定义代码