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的更多相关文章

  1. ArcGIS Pro Add-In插件开发[ArcGIS Pro SDK for .NET]

    本文基于 Windows7 + VS2019 + .NET Framework 4.8 + ArcGIS Pro 2.5 开发和撰写. 目录 开发环境配置 获取ArcGIS Pro 安装VS2019 ...

  2. ArcGIS Pro 二次开发

    本文基于 Windows7 + VS2019 + .NET Framework 4.8 + ArcGIS Pro 2.5.22081 开发和撰写. 目录 开发环境配置 获取ArcGIS Pro 安装V ...

  3. ArcGIS Pro 简明教程(4)工具和模型构建器

    ArcGIS Pro 简明教程(4)工具和模型构建器 by 李远祥 工具箱中的工具 ArcGIS Pro 在1.3版本基本上已经继承了ArcMap的所有工具,而且会不断加入一些它自身才有的工具,例如适 ...

  4. ArcGIS Pro 简明教程(3)数据编辑

    ArcGIS Pro 简明教程(3)数据编辑 by 李远祥 数据编辑是GIS中最常用的功能之一,ArcGIS Pro在GIS数据编辑上使用习惯有一定的改变,因此,本章可以重点看看一些编辑工具的使用和使 ...

  5. ArcGIS Pro 简明教程(2)基础操作和简单制图

    ArcGIS Pro 简明教程(2)基础操作和简单制图 By 李远祥 本章主要介绍ArcGIS Pro如何加载数据并进行简单的地图制作,以基本的操作为主. 上一章节介绍过,ArcGIS Pro是可以直 ...

  6. ArcGIS Pro 简明教程(1)Pro简介

    ArcGIS Pro 简明教程(1)Pro简介 ArcGIS Pro已经发布了相当的一段时间了,截至笔者写这系列文章的时候已经是1.3版本了,已经是相当完善的一个版本,基本上已经完成了原来ArcGIS ...

  7. ArcGIS Runtime SDK是什么?

    如上图,Runtime SDK是什么东西?居然还有安卓.苹果手机.Mac.QT的版本? 是不是意味着ArcGIS的编辑数据和空间分析可以通过编程的方法在每个平台上满地跑了? 答案是:是,也不是. 1. ...

  8. ArcGIS Pro开发Web3D应用(3)——Server/Portal授权服务开发

    1.整体环境搭建完成 WebAdaptor.DataStore.Portal for arcgis.arcgis server.arcgis pro都成功部署安装,不管是同服务器还是不同服务器,最好做 ...

  9. ArcGIS Pro体验04——菜单栏

    对菜单栏进行熟悉一下: 1.地图菜单 剪切板(Clipboard):剪切(Cut).复制(Copy).粘贴(Paste),这些不用说了,在ArcMap中是放在"编辑"菜单下面的.当 ...

  10. ArcGIS Runtime SDK for Android 授权(arcgis android 去除水印)

    ArcGIS Runtime SDK for Android 授权 ESRI中国北京 要下载和安装 ArcGIS Runtime SDK for Android,您需要注册开发者账户,进而便拥有了访问 ...

随机推荐

  1. 【devexpress】spinEdit控件如何设置只能输入两位小数

    只需设置对应的正则表达式即可,我这里设置的是n2意思就是两位小数的意思 效果如下

  2. ValueError: Detected newline in header value. This is a potential security problem

    原因 flask框架进行重定向的url中包含 换行符\n或\r 解决方法 使用 strip() 函数去除行首或行尾的换行符(如果你url中间包含这些符号replace函数替换, 但是如果中间包含只能说 ...

  3. 在 win11 下搭建并使用 ubuntu 子系统(同时测试 win10)——(附带深度学习环境搭建)

    对于一个深度学习从事者来说,Windows训练模型有着诸多不便,还好现在Windows的Ubuntu子系统逐渐完善,近期由于工作需求,配置了Windows的工作站,为了方便起见,搭建了Ubuntu子系 ...

  4. mq中如何保证消息的顺序性

    先说结论 不建议在mq当中使用消息的投递顺序来保证消息的顺序一致性 反思为什么需要保留消息的顺序性 日常思维中,顺序大部分情况会和时间关联起来,即时间的先后表示事件的顺序关系.消息队列中的若干消息如果 ...

  5. 【每日一题】2021年12月14日-82. 删除排序链表中的重复元素 II

    存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字. 返回同样按升序排列的结果链表. 来源:力扣(LeetCo ...

  6. python基础语法&数据类型&运算符

    1.标识符 # -*- coding:utf-8 -*- # @Time :2021/1/16 10:28 # @Author :QAbujiaban # @Email :wbxztoo@163.co ...

  7. TortoiseGit (小乌龟安装配置及使用)

    TortoiseGit 使用教程 (图文详解) 第一步 下载Git:下载地址:https://gitforwindows.org 第二步 下载TortoiseGit 以及 汉化包 (安装教程这里就不详 ...

  8. JavaScript:对象:如何创建对象?

    JS是面向对象的语言,除开基础数据类型,其他所有的数据类型都是对象,包括函数. 如何去理解对象,什么是对象呢? 举个例子,比如我们将日常生活中见到的猫这种动物,抽象成一个类Cat,这里不去谈类是什么概 ...

  9. 使用 Helm 安装 MQTT 服务器-EMQX

    EMQX ️ Info: 使用 EMQX 通过 Helm3 在 Kubernetes 上部署 EMQX 4.0 集群 | EMQ emqx/deploy/charts/emqx at main-v4. ...

  10. 洛谷P1496 火烧赤壁【题解】

    事先声明 本题解文字比较多,较为详细,算法为离散化和差分,如会的大佬可以移步去别处看这道题的思路(因为作者比较懒,不想新开两个专题). 题目简要 给定每个起火部分的起点和终点,请你求出燃烧位置的长度之 ...