最近在项目里面有几处要用到调用GP工具,之前没咋用过,后来用的时候发现了很多的问题,现在记下来留给以后使用或者有问题的朋友可以看看。一般调用GP工具都是这个错误
"对 COM 组件的调用返回了错误 HRESULT E_FAIL",
出现这个错误主要的原因大致可以概括为以下:
1.参数缺少或者参数类型不正确,这是最容易解决的,改变正确的参数类型即可:
解决方法:一般我们在调用GP时都会在GIS里面先使用一遍,看看用到哪些变量,
例如 以这个 ESRI.ArcGIS.AnalysisTools.Update updateTool = new ESRI.ArcGIS.AnalysisTools.Update();叠加分析中的更新工具为例
在这个界面里面有三个必须选择的参数, updateTool.in_features = inputLayer.FeatureClass;
updateTool.update_features = updateFeaturelayer.FeatureClass;
updateTool.out_feature_class =this.OutputPath;
这三个参数是必须的,但是有人会问怎么判断输入的参数是对的呢,不急,在上面的红色箭头上,TOOL Help,点击就会进入
往下看,有Data Type.这就是在说明输入的类型
这就解决了参数的问题
2.参数路径不正确,或者gp的overwrite属性未设置,例如一个不存在的路径或者该路径下已有同名文件,这个问题就需要设置overwrite属性为true,(个人认为这点不是太重要,先写下了).
3.这个是最重要的,也是重点了。就是Arcengine授权的问题,自从10.1之后,在授权没了arcinfo这个授权选项了,换成了如下:
这是一个license控件,用控件讲解方便,但是我们在程序中,还是推荐用代码授权,控件会随着版本的更替不稳定。
从上到下,权限递增,但是只能选择一个,勾选上面的权限优先使用,明白了吧,就是你都选了,权限也只是上面的ArcGis Engine
针对于上面的GP工具这个权限要高点,使用advanced。
将这段代码加载你的程序InitializeComponent()方法之前就可以了,就是代码授权。
代码: ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);
IAoInitialize aoInitialize = new AoInitialize();
esriLicenseStatus licenseStatus = esriLicenseStatus.esriLicenseUnavailable;
licenseStatus = aoInitialize.Initialize(esriLicenseProductCode.esriLicenseProductCodeAdvanced);
但是你有得的分析操作需要用到扩展功能,类似于你用arcmap的时候,某个模块需要扩展,用法就是在
你要勾选里面的具体分析,比如你想利用GP工具实现,由点创建TIN的功能,你就要用到3DAnalystTool里面的功能,就要把这个扩展模块加进来。
aoInitialize.CheckOutExtension(esriLicenseExtensionCode.esriLicenseExtensionCode3DAnalyst)
就这样。
4.这是我在后来的工作中遇见的,加进来了,算是个比较需要细心得问题,我在做TIN转DEM的时候,ESRI.ArcGIS.Analyst3DTools.TerrainToRaster和ESRI.ArcGIS.Analyst3DTools.TinRaster,这两个GP工具非常像,里面的参数都差不多一致的,自己在做这个功能的时候搞了半天,才发现。