ArcGIS Pro SDK 003 如何调用Toolbox
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桌面软件上找到该工具,并打开,如下图所示。
点击右上角?号,可以进入该工具的帮助页面,如下图所示。
其中红框中的内容就是工具的名称,我们通过ArcGIS Pro sdk调用的时候,传入该名即可。参数以及设置的顺序可以通过函数参数获取。其中{}内的参数为可选参数。在下面表格中,还有一些参数说明,写的也比较清晰。这样我们就能明白如何设置参数了。
2、不能设置输出文件参数的特殊情况
有些工具是有特殊情况的,例如栅格掩膜工具ExtractByMask。在ArcGIS Pro桌面软件下,其界面如下图所示。
参数包括输入栅格、掩膜数据以及输出栅格等。点击帮助,切换到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类的定义,如下图所示。
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中的界面如下图所示。
这个地方是设置图层名称,而不是存储的数据路径。但实际上,我是想把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的输入指定了这个名称,会从该数据源中取数据。
具体什么原因,目前还不是太清楚,但确实这么处理是成功的。
ArcGIS Pro SDK 003 如何调用Toolbox的更多相关文章
- ArcGIS Pro Add-In插件开发[ArcGIS Pro SDK for .NET]
本文基于 Windows7 + VS2019 + .NET Framework 4.8 + ArcGIS Pro 2.5 开发和撰写. 目录 开发环境配置 获取ArcGIS Pro 安装VS2019 ...
- ArcGIS Pro 二次开发
本文基于 Windows7 + VS2019 + .NET Framework 4.8 + ArcGIS Pro 2.5.22081 开发和撰写. 目录 开发环境配置 获取ArcGIS Pro 安装V ...
- ArcGIS Pro 简明教程(4)工具和模型构建器
ArcGIS Pro 简明教程(4)工具和模型构建器 by 李远祥 工具箱中的工具 ArcGIS Pro 在1.3版本基本上已经继承了ArcMap的所有工具,而且会不断加入一些它自身才有的工具,例如适 ...
- ArcGIS Pro 简明教程(3)数据编辑
ArcGIS Pro 简明教程(3)数据编辑 by 李远祥 数据编辑是GIS中最常用的功能之一,ArcGIS Pro在GIS数据编辑上使用习惯有一定的改变,因此,本章可以重点看看一些编辑工具的使用和使 ...
- ArcGIS Pro 简明教程(2)基础操作和简单制图
ArcGIS Pro 简明教程(2)基础操作和简单制图 By 李远祥 本章主要介绍ArcGIS Pro如何加载数据并进行简单的地图制作,以基本的操作为主. 上一章节介绍过,ArcGIS Pro是可以直 ...
- ArcGIS Pro 简明教程(1)Pro简介
ArcGIS Pro 简明教程(1)Pro简介 ArcGIS Pro已经发布了相当的一段时间了,截至笔者写这系列文章的时候已经是1.3版本了,已经是相当完善的一个版本,基本上已经完成了原来ArcGIS ...
- ArcGIS Runtime SDK是什么?
如上图,Runtime SDK是什么东西?居然还有安卓.苹果手机.Mac.QT的版本? 是不是意味着ArcGIS的编辑数据和空间分析可以通过编程的方法在每个平台上满地跑了? 答案是:是,也不是. 1. ...
- ArcGIS Pro开发Web3D应用(3)——Server/Portal授权服务开发
1.整体环境搭建完成 WebAdaptor.DataStore.Portal for arcgis.arcgis server.arcgis pro都成功部署安装,不管是同服务器还是不同服务器,最好做 ...
- ArcGIS Pro体验04——菜单栏
对菜单栏进行熟悉一下: 1.地图菜单 剪切板(Clipboard):剪切(Cut).复制(Copy).粘贴(Paste),这些不用说了,在ArcMap中是放在"编辑"菜单下面的.当 ...
- ArcGIS Runtime SDK for Android 授权(arcgis android 去除水印)
ArcGIS Runtime SDK for Android 授权 ESRI中国北京 要下载和安装 ArcGIS Runtime SDK for Android,您需要注册开发者账户,进而便拥有了访问 ...
随机推荐
- 社论 22.10.14 区间在线去重k小
浅谈区间在线去重k小 关于讨论 https://www.luogu.com.cn/discuss/509205 本文将描述一种分块做法以及讨论中提出的各种 \(O(n \ \text{polylog} ...
- 在windows下导入react项目并且打包编译后部署到nginx上
在windows下导入react项目并且打包编译后部署到nginx上 一.安装npm 二.创建react项目 三.安装nginx 四.总结 最近接手了公司的一个django项目,这是应该前后端分离的项 ...
- Python开发Brup插件检测SSRF漏洞和URL跳转
作者:馒头,博客地址:https://www.cnblogs.com/mantou0/ 出身: 作为一名安全人员,工具的使用是必不可少的,有时候开发一些自己用的小工具在渗透时能事半功倍.在平常的渗透测 ...
- 五年经验的前端社招被问:CPU 和 GPU 到底有啥区别?
首先来看 CPU 和 GPU 的百科解释: CPU(Central ProcessingUnit,中央处理器):功能主要是解释计算机指令以及处理计算机软件中的数据 GPU(Graphics Proce ...
- Django静态文件配置、form表单、request对象、连接数据库、ORM
目录 静态文件配置 静态文件相关配置 1.接口前缀 浏览器停用缓存 2.接口前缀动态匹配 form表单 action 控制数据提交的地址 method 控制数据提交的方法 请求方法补充 get: 朝服 ...
- python 之匿名函数(lambda)
什么是匿名函数?匿名函数就是不用def关键字,使用lambda关键字定义的一个函数.匿名函数简约而不简单. 匿名函数的格式: lambda[ paramters1, paramters2 , .... ...
- 一个简单的rust字符串时钟
1.简介 用rust写的一个简单的练手的demo,一个字符串时钟,在终端用字符串方式显示当前时间.本质是对图片取灰度,然后每个像素按灰度门限用星号代替灰度值,就把图片变为由星号组成的字符型图案.把 ...
- [OpenCV实战]33 使用OpenCV进行Hough变换
目录 1 什么是霍夫变换 1.1 应用霍夫变换以检测图像中的线条 1.2 累加器 1.3 线条检测 1.4 圆环的检测 2 代码 3 参考 1 什么是霍夫变换 霍夫变换是用于检测图像中的简单形状(诸如 ...
- Java进阶篇——设计模式
设计模式 一.代理模式 使用代理类对真实对象进行代理,包括真实对象方法的调用.功能的扩展等.访问的时候也只能访问到代理对象,既保护了真实对象同时可以在原始对象上进行扩展.类似于中介在卖家和买家之间的角 ...
- ionic+vue+capacitor系列笔记--capacitor3.X和2.X+android自定义capacitor的JSbridge插件注册与使用(不同版本注册方式不同,返回值格式也不同,使用方法也不同)
经过我的多番折腾,终于搞明白了这个东西的用法,不同版本的注册方法,使用方法都不一样,现在把这个折腾的结果记录下来,造福大家~ 首先编写一个类,然后注册,注意,这个和2.x不一样,2.x的时候我们会使用 ...