1、Geoprocessor和IGPProcess

Geoprocessor是ArcObjects SDK中定义Tool执行器。IGPProcess接口是ArcObjects SDK中定义的ArcTool接口。也就是说ArcObjects SDK定义的ArcTool都会继承该接口实现。理论上,在ArcToolbox的出现的系统工具都应该可以在SDK中找到。

Geoprocessor如何使用呢?参考下面的代码。

private static Geoprocessor _Geoprocessor = null;
/// <summary>
/// 实际的地理处理器
/// </summary>
public Geoprocessor Geoprocessor
{
get
{
if (_Geoprocessor == null)
{
_Geoprocessor = new Geoprocessor
{
OverwriteOutput = true
};
}
return _Geoprocessor;
}
}
public object ExecuteByGP(IGPProcess pGPProcess)
{
try
{
return Geoprocessor.Execute(pGPProcess, null);
}
catch
{
object mySeverity = null;
string myMessage = Geoprocessor.GetMessages(ref mySeverity);
throw new Exception(myMessage);
}
}

2、以Buffer为例

ArcToolBox的对应的类在SDK中找不到,我们一般从ArcMap上着手。首先先在ArcMap上的Toolbox中找到Buffer工具,并打开。如下图所示。

我们可以通过点击Tool Help按钮,查看该工具的具体用法。特别是参数说明部分。通过帮助中的信息,分析出属于那个dll文件,如果没有引用的话,引用下。如下图所示。

后面有个Analysis,那么该功能在ArcObjects SDK中是被定义在ESRI.ArcGIS.AnalysisTools.dll中的。例如Dissolve工具,后面的括号内是Data Management,那么该工具被定义到了ESRI.ArcGIS.DataManagementTools.dll中。

我们到SDK中看下Buffer是怎么定义的。

using System.IO;
using System.Reflection;
using System.Xml;
using ESRI.ArcGIS.Geoprocessor; namespace ESRI.ArcGIS.AnalysisTools
{
public class Buffer : IGPProcess
{
private object[] m_gpParameters; private string m_ToolboxDirectory; public object in_features
{
get
{
return m_gpParameters[0];
}
set
{
m_gpParameters[0] = value;
}
} public object out_feature_class
{
get
{
return m_gpParameters[1];
}
set
{
m_gpParameters[1] = value;
}
} public object buffer_distance_or_field
{
get
{
return m_gpParameters[2];
}
set
{
m_gpParameters[2] = value;
}
} public string line_side
{
get
{
return m_gpParameters[3] as string;
}
set
{
m_gpParameters[3] = value;
}
} public string line_end_type
{
get
{
return m_gpParameters[4] as string;
}
set
{
m_gpParameters[4] = value;
}
} public string dissolve_option
{
get
{
return m_gpParameters[5] as string;
}
set
{
m_gpParameters[5] = value;
}
} public object dissolve_field
{
get
{
return m_gpParameters[6];
}
set
{
m_gpParameters[6] = value;
}
} public string ToolboxDirectory
{
get
{
return m_ToolboxDirectory;
}
set
{
m_ToolboxDirectory = value;
}
} public string ToolboxName => "Analysis Tools.tbx"; public string ToolName => "Buffer"; public string Alias => "analysis"; public object[] ParameterInfo => m_gpParameters; public Buffer()
{
m_gpParameters = new object[7];
m_ToolboxDirectory = ResolveDirectory();
} public Buffer(object in_features, object out_feature_class, object buffer_distance_or_field)
{
m_gpParameters = new object[7];
m_ToolboxDirectory = ResolveDirectory();
this.in_features = in_features;
this.out_feature_class = out_feature_class;
this.buffer_distance_or_field = buffer_distance_or_field;
} private string ResolveDirectory()
{
string result = "[SYSTEMTOOLBOXLOCATION]";
Assembly executingAssembly = Assembly.GetExecutingAssembly();
string text = executingAssembly.Location + ".config";
FileInfo fileInfo = new FileInfo(text);
if (fileInfo.Exists)
{
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(text);
XmlNode xmlNode = xmlDocument.SelectSingleNode("configuration/toolbox");
if (xmlNode != null)
{
result = xmlNode.Attributes["directory"].Value;
}
} return result;
}
}
}

有些参数设置比较好理解,例如in_features,可以设置一个shape文件路径、IFeatureClass对象、IFeatureLayer对象或者.Lyr文件路径等。但为了运行稳定,保险期间,我一般都设置文件路径。

out_feature_class参数也比较好理解,设置一个输出的Shape文件路径即可。

后面的line_side、line_end_type、dissolve_option都是字符串类型的可选参数,这种一般还比较简单写,看帮助中的参数列表部分,基本上可以解决我们的问题。

还有两个参数buffer_distance_or_field和dissolve_field,这两个比较难设置。dissolve_field还好,是一个可选参数,我之前也没用过,可以先不管。但buffer_distance_or_field参数,看到这个名字就知道这个参数非常重要。按正常理解的话,这个参数应该是一个数字类型的参数,用来设置缓冲距离。我们再看下帮助是如何描述这个参数的。

这个字段可识别的类型有字段和线性单位,通过描述可以知道,参数可以传数字+单位以及字段名称。如果只传一个数字,那么就按照该数字以及数据本身的单位进行缓冲区分析;如果传数字+单位,就按照传入的数字和单位进行缓冲区分析;如果传字段名称,就按照该字段的值进行缓冲区分析。就是说,我们设置数字100、字符串”100 Meters”或者一个数字类型的字段名称均是可以的。

但如果传字段,字段类型是字符串,里面的值为数字+单位的格式是否识别?或者该参数传一个IField对象是不是可以识别?再或者字段是数字类型,我们传字段名称+单位是不是也可以?因为这些在实际应用中,没有应用过,所以并没有进行验证。如果有需要这么处理的,可以去验证下。

如果还不知道这个参数如何参数,那么还有一个更直观的办法。先用自己想设置的参数在ArcMap中运行一下。如下图所示。

点击OK按钮执行,之后后,去Toolbox的Result模块查看执行的py脚本。如下图所示。

拷贝后,可以把脚本放到记事本里。如下图所示。

这样我们是不是就可以知道buffer_distance_or_field参数要怎么设置了?dissolve_field参数更复杂,但通过这样的方法,也可以获取该参数的设置格式。

3、ArcObject SDK 调用Toolbox的技巧

熟练使用ArcToolbox以及会看Toolbox的帮助;

善于能把各类Tool串起来,完成一个完整的业务模块

先用数据在ArcMap的ArcToolbox上做验证;

Tool设置参数的时候,数据尽量用路径,路径尽量不要有汉字、空格等,传入的参数路径名称尽量以字母开头;

在代码中调用报错,用同样的数据、同样的参数,在ArcMap里面去运行一下,一般两者是没什么差别的,在ArcMap找到什么原因后,再去修改代码;

设置参数的时候,结合Arcpy去分析可接受参数的格式。

ArcObjects SDK开发 017 在ArcObject SDK 中使用Toolbox的更多相关文章

  1. ESP8266 RTOS SDK开发

    ESP8266 RTOS SDK开发 目录 ESP8266 RTOS SDK开发 一.源码RTOS SDK包的下载和编译 二.固件烧录 1.管脚定义 三.程序例程 ## 1.PWM设置 连接MQTT ...

  2. 插件化技术在安卓sdk开发中实际应用

    笔者从 2016 年初就因为公司业务需求转战 android sdk 开发, 应用插件化技术将公司 android sdk 重新翻版.先来说说需求. 由于笔者所在一家创业公司, android sdk ...

  3. 继《关于讯飞语音SDK开发学习》之打包过程中遇到小问题

    关于讯飞语音SDK开发学习 使用vs自带打包,具体怎么操作就不说了,网上关于这方面的资料挺多的.例如:winform 打包部署,VS2010程序打包操作(超详细的),关键是桌面上创建快捷方式中的&qu ...

  4. Kinect for Windows SDK开发学习相关资源

    Kinect for Windows SDK(K4W)将Kinect的体感操作带到了平常的应用学习中,提供了一种不同于传统的鼠标,键盘及触摸的无接触的交互方式,在某种程度上实现了自然交互界面的理想,即 ...

  5. 手机sdk 开发

    题记:很多做游戏开发的人,估计都或多或少地接过渠道SDK,什么UC,当乐,91,小米,360......据统计国内市场当前不下于100家渠道,还包括一些没有SDK的小渠道.每个渠道SDK接入的方法呢, ...

  6. 微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引

    Senparc.Weixin.MP SDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到比较稳定的版本,这个过程中我觉得有必要整理一些思路和经验,和大家一起分享. ...

  7. TortoiseSVN安装以及淘宝 TAE SDK 开发环境的搭建

    一.TortoiseSVN 的下载和安装 1.进入TortoiseSVN 官网下载地址http://tortoisesvn.net/downloads.html,根据自己的操作系统位数下载相应最新版本 ...

  8. SDK开发断点失效

    做SDK开发,一般会创建一个静态库工程,然后添加一个app的Target 可是,Xcode7创建的工程,app的Target中断点有效,能断住,为什么静态库的Target中的断点断不住呀. 断点断住发 ...

  9. Vmware Vsphere WebService SDK开发(第一讲)-基本知识学习

    刚开始这方面开发的时候,不知道如何下手,能够查到的资料特别少,而且看到很多网友和我一样也在找这方面的资料.接下来的一段时间我就结合自己所参与的项目,完成关于Vmware Vsphere WebServ ...

  10. 【转】微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引

    微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引 Senparc.Weixin.MP SDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到 ...

随机推荐

  1. 如何通过 Java 代码隐藏 Word 文档中的指定段落

    在编辑Word文档时,我们有时需要将一些重要信息保密. 因此,可以隐藏它们以确保机密性. 在本文中,将向您介绍如何通过 Java 程序中的代码隐藏 Word 文档中的特定段落.下面是我整理的具体步骤, ...

  2. sql语句的组成

    数据定义语言(DDL,Data Definition Language):包括CREATE(创建)ALTER(修改)DROP(删除)等. 数据操纵语言(DML,Data Manipulation La ...

  3. .NET 5 设计 API (资源站)

    跟新于 2022-11日 数据抓取端 随着数据的增多,问题也越来越多 用redis 主要是为了 以后进行,多个数据库写入. 例如我搭建一个 别的数据库论坛,我直接拿数据去redis里面拿,就不用跨库查 ...

  4. Vue中使用Switch开关用来控制商品的上架与下架情况、同时根据数据库商品的状态反应到前台、前台修改商品状态保存到数据库

    一般后台对商品的信息管理.包含商品的上架与下架.为了提高用户的体验.将商品上下架的操作做成开关的形式.同时后台数据库中保存的商品状态能够根据开关状态改变. 1.效果展示 这种效果:== 当开关是开启状 ...

  5. 不妨试试更快更小更灵活Java开发框架Solon

    @ 目录 概述 定义 性能 架构 实战 Solon Web示例 Solon Mybatis-Plus示例 Solon WebSocket示例 Solon Remoting RPC示例 Solon Cl ...

  6. R数据分析:扫盲贴,什么是多重插补

    好多同学跑来问,用spss的时候使用多重插补的数据集,怎么选怎么用?是不是简单的选一个做分析?今天写写这个问题. 什么时候用多重插补 首先回顾下三种缺失机制或者叫缺失类型: 上面的内容之前写过,这儿就 ...

  7. JK触发器与模12计数器

    JK触发器 JK触发器具有保持,置0,置1和翻转四个功能. 则可得出次态方程:\(Q_{n+1} = JQ_n'+K'Q_n\) Design `timescale 1ns / 1ps module ...

  8. HPL Study 1

    1.安装Linux系统 在虚拟机Vmware上安装CentOS 7系统 2.安装OneApi 安装的时候将文件从桌面拖动到虚拟机安装的时候报错:archive corrupted 解决方法:大文件应采 ...

  9. Pycharm自定义实时模板

    pycharm添加模板 添加装饰器模板 # 1.file-->Setting-->Editor-->Code Style -->Live Templates# 2." ...

  10. ubuntu20.04修改静态ip不生效问题

    一.前言 最近从头开始配置hadoop的时候,由于想切换到NAT模式下配置hadoop,但在修改ip的时候发现设置了静态ip,但ip不生效,查了很多资料,发现由于配置信息写错了. 二.解决问题 ifc ...