首页 > 其他分享 >ArcGIS Pro SDK 003 如何调用Toolbox

ArcGIS Pro SDK 003 如何调用Toolbox

时间:2023-02-22 14:55:31浏览次数:37  
标签:Pro 003 ArcGIS 参数 Geoprocessing 工具 SDK

1、如何调用普通的Tool

ArcGIS中的Toolbox非常强大,做二次开发的时候,必不可少的会调用,在ArcObjects SDK中,每个Tool都会有自定义的类对应,例如栅格转矢量数据,定义在ESRI.ArcGIS.ConversionTools.dll程序集中,对用的类为RasterToPolygon。而在ArcGIS Pro SDK中就没这样的类定义了,就需要传入字符串格式的工具名称,指定执行哪个工具。参数也无法使用对象.属性的方式设置,而是以数组的方式设置。

我们在ArcObjects SDK中,调用栅格转矢量工具的代码如下。

var myRasterToPolygon = new RasterToPolygon
{
    in_raster = myWatershed.out_raster,
    out_polygon_features = FilePathHelper.GetTempShapeFilePath("RasterToPolygon_")
};
myGPEx.Execute(myRasterToPolygon);

在ArcGIS Pro SDK中,调用该工具的方法如下所示。

myParameters = Geoprocessing.MakeValueArray(myWatershedOutFile, myWatershedPolygonOutFile, "Value");
myGPResult = await Geoprocessing.ExecuteToolAsync("conversion.RasterToPolygon", myParameters);

Geoprocessing.MakeValueArray用来设置参数,Geoprocessing.ExecuteToolAsync函数用来执行工具。该函数的第一个参数就是工具的名称,第二个参数是执行工具设置的参数信息,还有第三个参数是对环境的设置,如果不需要对环境进行特殊设置,忽略该参数即可。

因为没有类定义,并不好确认要传入的工具名称、到底要设置哪些参数、参数的顺序以及是否要进行环境设置等信息。此时我们就要借助ArcGIS Pro桌面软件、帮助甚至ArcObjects SDK中对应工具的定义。

还是以RasterToPolygon为例,我们可以先在ArcGIS Pro桌面软件上找到该工具,并打开,如下图所示。

截图.png

点击右上角?号,可以进入该工具的帮助页面,如下图所示。

截图.png

其中红框中的内容就是工具的名称,我们通过ArcGIS Pro sdk调用的时候,传入该名即可。参数以及设置的顺序可以通过函数参数获取。其中{}内的参数为可选参数。在下面表格中,还有一些参数说明,写的也比较清晰。这样我们就能明白如何设置参数了。

2、不能设置输出文件参数的特殊情况

有些工具是有特殊情况的,例如栅格掩膜工具ExtractByMask。在ArcGIS Pro桌面软件下,其界面如下图所示。

截图.png

参数包括输入栅格、掩膜数据以及输出栅格等。点击帮助,切换到Python下,看到的代码如下所示。

ExtractByMask(in_raster, in_mask_data, {extraction_area}, {analysis_extent})

这个就比较特殊了,感觉也有可能是帮助没有写好,缺参数,输出栅格数据在哪设置?并且工具名称前也没有加模块的名称,这样我们就不知道怎么调用了。

再接着看下面的python例子代码,如下所示。

import arcpy
from arcpy import env
from arcpy.sa import *
env.workspace = "C:/sapyexamples/data"
outExtractByMask = ExtractByMask("elevation", "mask.shp", "INSIDE")
outExtractByMask.save("C:/sapyexamples/output/maskextract")

这样就清楚一些了,ExtractByMask工具输入sa模块,我们调用的时候,工具名称写sa.ExtractByMask。执行的时候,并没有设置输出文件存储的目录,而是返回输出结果,调用输出结果的save函数保存处理的结果数据。这不太符合我们的使用习惯,获取在ArcGIS Pro SDK中,也这样设置参数,最后用GPResult可以把输出结果保存起来。

但我没有做这样的测试,是否可行也不清楚。

我感觉还是可以在参数里面设置输出结果文件路径的,于是我去ArcObjects SDK中去查找ExtractByMask类的定义,如下图所示。

截图.png

ArcObjects SDK中的ExtractByMask只有三个参数,看来ArcGIS Pro对该工具进行了扩展,增加了一些参数。既然第三个参数是输出的栅格数据,那么我们也在ArcGIS Pro SDK中的ExtractByMask第三个参数设置输出栅格数据试试。代码如下。

string myExtractByMaskOutFile = this._TempFolder.GetTempFilePath(".tif", "ExtractByMask_");
myParameters = Geoprocessing.MakeValueArray(this.DEMFilePath, this.ClipFile, myExtractByMaskOutFile);
myGPResult = await Geoprocessing.ExecuteToolAsync("sa.ExtractByMask", myParameters);

执行了一下,可以正确执行,输出结果也出来了。这就感觉比较奇怪,看帮助的话,第三个参数应该是可选参数extraction_area,感觉帮助和实际功能有些不一致,不过出来就可以了,没再深究问题出在哪里。

如果实在出不来的话,估计我就要想办法看怎么通过GPResult把结果存储成文件,或者直接写pothon代码去执行了。

3、输出数据只能设置名称的情况

这种情况是我在调用MakeXYEventLayer时候遇到的,其在ArcGIS Pro中的界面如下图所示。

截图.png

这个地方是设置图层名称,而不是存储的数据路径。但实际上,我是想把XY数据,导出成Shape文件保存下来的。如果在ArcGIS pro中操作,默认会把结果作为图层添加到地图上,我们再把该图层导出成Shape文件就可以了。

如果在SDK中,该如何处理呢?

该工具python相关的帮助中的python代码如下。

import arcpy
arcpy.env.workspace = "C:/data"
arcpy.MakeXYEventLayer_management("firestations.dbf", "POINT_X", "POINT_Y","firestations_points", "", "POINT_Z")

我在测试的时候,后面是跟了一个CopyFeatures工具,就是把MakeXYEventLayer输出的图层,保存到指定目录下,并且为.shp格式。没注意到底是否生成成功。

后面检查的时候,发现我在MakeXYEventLayer工具中指定输出的文件并没有生成成功,但CopyFeatures的输出确是存在的。后来发现只要把设置一个随机的图层名称,在CopyFeatures调用的时候,输入这个随机名称,就可以运行成功,代码如下所示。

string myOutLyrName = "XY_" + Guid.NewGuid().ToString();
myParameters = Geoprocessing.MakeValueArray(myOutTableFile, "NEAR_X", "NEAR_Y", myOutLyrName);
myGPResult = await Geoprocessing.ExecuteToolAsync("management.MakeXYEventLayer", myParameters);
if (myGPResult.IsFailed)
{
    throw new ArgumentException("生成图层," + myGPResult.ErrorMessages.First().Text);
}
//拷贝要素
pProcessInfo.SetProcess(98, "正在拷贝结果数据...");
myParameters = Geoprocessing.MakeValueArray(myOutLyrName, this.OutputPointFile);
myGPResult = await Geoprocessing.ExecuteToolAsync("management.CopyFeatures", myParameters);
if (myGPResult.IsFailed)
{
    throw new ArgumentException("拷贝结果," + myGPResult.ErrorMessages.First().Text);
}

对这个问题,我没太往下深入研究,感觉应该是系统把数据生成到了一个默认工作空间下,CopyFeatures的输出指定了这个名称,从默认工作空间下去找这个数据,但我再默认的gdb下并没有找到。

也可能是,该结果图层数据以内存的形式存在了ArcGIS pro当前缺省的地图数据源中,CopyFeatures的输入指定了这个名称,会从该数据源中取数据。

具体什么原因,目前还不是太清楚,但确实这么处理是成功的。

标签:Pro,003,ArcGIS,参数,Geoprocessing,工具,SDK
From: https://www.cnblogs.com/mytudousi/p/17144300.html

相关文章

  • props子父传值
     父组件:<propss:pos='persons'></propss>//引入子组件 importpropssfrom'./props.vue';data(){return{inHot:true,......
  • Vue配置文件中的proxy配置
    Vue配置文件中的proxy配置https://huaweicloud.csdn.net/638eec24dacf622b8df8dafa.html?spm=1001.2101.3001.6650.11&utm_medium=distribute.pc_relevant.none-task-blog......
  • Prometheus 安装和配置
    安装Prometheus之前必须要先安装ntp时间同步,因为prometheusserver对系统时间的准确性要求很高,必须保证本机时间实时同步。这里我们以Centos7为例,先执行时间同步,执行如下......
  • prometheus基础介绍
    Prometheus简介Prometheus是一套开源的系统监控报警框架,作为新一代的云原生监控系统,目前已经有上千个贡献者参与到Prometheus的研发工作上,并且超过120+项的第三方集成。P......
  • 安装配置HAProxy
    HAProxy安装过程与日志输出配置先安装LUA$yum-yinstallzlibgccgcc-c++libgcczlib-develpcrepcre-developensslopenssl-devel$yuminstall-ylibnllibnl-......
  • 自然语言处理之Prompt Ensembling
    Promptensembling是指将多个不同的提示(prompts)应用于同一个模型,从而提高模型的性能和鲁棒性。提示是一种用于指导模型生成预测的文本片段,通常是问题或任务描述。在Prompt......
  • 深入理解Promise
    Promise的前提概念Promise是一个构造函数,用来生成Promise实例Promise构造函数接受一个函数作为参数,该函数有两个参数,分别是resolve和rejectresolve:成功时的回调reject:......
  • NProgress进度条简单使用
    安装//npmnpminstall--savenprogress//Yarnyarnaddnprogress直接引入js、css或者通过cdn引入<scriptsrc='nprogress.js'></script><linkrel='stylesheet'......
  • vue-cli安装依赖 props属性三种方式 混入迷信 插件 elementUI vuex vue Routerd local
    目录回顾vue-cli安装依赖props属性三种方式总结混入mixin插件elementuielementui的使用vuex使用步骤vueRouter基本使用点击跳转路由两种方式路由跳转,携带数据的两种方式区......
  • props,混入mixin,插件,elementui使用(重点),vuex,vue Router, localStorage系列
    props,混入mixin,插件,elementui使用(重点),vuex,vueRouter,localStorage系列props1.方式一:使用数组props:['msg']2.方式二:使用对象props:[msg:String]3.方式三:使用对......