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. 【前端必会】webpack 插件,前进路绕不过的障碍

    背景 webpack的使用中我们会遇到各种各样的插件.loader. webpack的功力主要体现在能理解各个插件.loader的数量上.理解的越多功力越深 开始 https://webpack.do ...

  2. 制造企业有可能自行开发ERP系统吗?

    当然可以啊! 生产企业对于ERP的需求是一直存在的,但市场上多为标准化的产品,与企业的个性化需求矛盾着. 有很多制造企业自行开发ERP系统啊!只是各个企业成效不同而已,毕竟不同企业的IT开发能力不同而 ...

  3. 获取cpu的核数

    //获取cpu的核数 System.out.println(Runtime.getRuntime().availableProcessors());

  4. 关于针对XSS漏洞攻击防范的一些思考

    众所周知,XSS几乎在最常见.危害最大的WEB漏洞.针对这个危害,我们应该怎么防范呢. 下面简单说一下思路. 作者:轻轻的烟雾(z281099678) 一.XSS漏洞是什么 XSS漏洞网上的资料太多, ...

  5. 抛砖系列之redis监控命令

    前言 redis是一款非常流行的kv数据库,以高性能著称,其高吞吐.低延迟等特性让广大开发者趋之若鹜,每每看到别人发出的redis故障报告都让我产生一种居安思危,以史为鉴的危机感,恰逢今年十一西安烟雨 ...

  6. 7.httpie

    可以使用curl或httpie测试我们的服务器.Httpie是用Python编写的用户友好的http客户端   安装:pip3 install httpie #get请求示例 输入命令:http ht ...

  7. 前后端分离项目(九):实现"添加"功能(后端接口)

    好家伙,来了来了,"查"已经完成了,现在是"增" 前端的视图已经做好了,现在我们来完善后端 后端目录结构   完整代码在前后端分离项目(五):数据分页查询(后端 ...

  8. JavaWeb3

    1. 会话技术 会话:一次会话中包含多次请求和响应 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止 功能:在一次会话的范围内的多次请求间共享数据 方式: 客户端会话技术:Co ...

  9. Windows骚操作

    电脑常用的快捷键 键盘功能健:Tab.Shift.Ctrl.Alt.Windows.Enter.空格.上下左右健.CapsLock(大小写转换).NumLock(对小键盘控制开/关) 键盘快捷键:全选 ...

  10. java将流量KB转换为GB、MB、KB格式

    /** * 转换流量格式为xxGBxxMBxxKB * @param flow 156165(xxxxxx) */ public String changeFlowFormat(String flow ...