ArcEngine——异步执行GP工具(Background geoprocessing)

从ArcGIS 10开始,ArcGIS开始支持后台地理处理。使用Geoprocessor.ExecuteAsync()方法,可以在ArcGIS应用程序的后台执行工具或模型工具。也就是说当工具在后台进程中执行时,ArcGIS控件(例如,MapControl、PageLayoutControl、GlobeControl或SceneControl)保持对用户交互的响应。换句话说,可以在工具执行时查看和查询数据。
使用后台地理处理来执行一个工具,需要以下操作:

  1、注册事件
  2、提交工具执行。

1:Geoprocessor方式

  Geoprocessor类提供了以下5种事件:

  • MessagesCreated
  • ProgressChanged
  • ToolboxChanged
  • ToolExecuted
  • ToolExecuting

  本文主要介绍ToolExecuting和ToolExecuted事件。

  1. 实例化Geoprocessor类

Geoprocessor gp = new GeoProcessor();
gp.OverwriteOutput = true;  

  2.注册事件

  这里根据需求,用到哪些事件就注册哪些事件。

gp.ToolExecuting += new EventHandler<ToolExecutingEventArgs>(gp_ToolExecuting);
gp.ToolExecuted += new EventHandler<ToolExecutedEventArgs>(gp_ToolExecuted);

  3.创建一个队列用于存放gp工具

private Queue<IGPProcess> _myGPToolsToExecute = new Queue<IGPProcess>();

  4.事件处理函数

//此处只是为了演示,具体内容可以实际需求编写,例如执行完毕后将结果加载到MapControl中
private void gp_ToolExecuted(object sender, ToolExecutedEventArgs e)
{
    IGeoProcessorResult2 gpResult = (IGeoProcessorResult2)e.GPResult;

    if (gpResult.Status == esriJobStatus.esriJobSucceeded)
    {
        Console.WriteLine(gpResult.Process.ToolName.ToString() + "执行完毕");
        //判断队列里是否还有工具,如果有继续执行
        if (_myGPToolsToExecute.Count > 0)
        {
            gp.ExecuteAsync(_myGPToolsToExecute.Dequeue());
        }
    }
    else if (gpResult.Status == esriJobStatus.esriJobFailed)
    {
        Console.WriteLine(gpResult.Process.Tool.Name + "执行失败");
    }
}

private void gp_ToolExecuting(object sender, ToolExecutingEventArgs e)
{
    IGeoProcessorResult2 gpResult = (IGeoProcessorResult2)e.GPResult;
    Console.WriteLine(gpResult.Process.Tool.Name + " " + gpResult.Status.ToString());
}    

  5.提交工具执行

  此处以缓冲区分析和裁剪为例。先创建缓冲区,然后用创建的缓冲区裁剪

try
{

//缓冲区
ESRI.ArcGIS.AnalysisTools.Buffer bufferTool = new ESRI.ArcGIS.AnalysisTools.Buffer();
bufferTool.in_features = @"C:\Users\Demacia\Desktop\展示\控制点.shp";
bufferTool.buffer_distance_or_field = 1500;
bufferTool.out_feature_class = @"C:\Users\Demacia\Desktop\展示\缓冲区.shp";

//裁剪
ESRI.ArcGIS.AnalysisTools.Clip clipTool = new ESRI.ArcGIS.AnalysisTools.Clip();
clipTool.in_features = @"C:\Users\Demacia\Desktop\展示\China_Project.shp";
clipTool.clip_features = bufferTool.out_feature_class;
clipTool.out_feature_class = @"C:\Users\Demacia\Desktop\展示\Clip.shp";

//将两个gp工具依次加入队列
_myGPToolsToExecute.Enqueue(bufferTool);
_myGPToolsToExecute.Enqueue(clipTool);

gp.ExecuteAsync(_myGPToolsToExecute.Dequeue());

}
catch (Exception ex)
{

}

2:GeoProcessorClass方式

  此种方式需要使用IGeoProcessor2接口的RegisterGeoProcessorEvents3()方法注册事件。RegisterGeoProcessorEvents3()方法的参数为一个IGeoProcessorEvents3类型的实例,AO中并没有提供实现IGeoProcessorEvents3接口的类,所以需要我们自己创建一个类并实现IGeoProcessorEvents3接口。

  1.创建一个名为GeoProcessorEvents3Class的类,并实现IGeoProcessorEvents3接口

public class GeoProcessorEvents3Class : IGeoProcessorEvents3
{
    IMapControl2 mapCon;
    public GeoProcessorEvents3Class(IMapControl2 inCon)
    {
        mapCon = inCon;
    }

    public void OnProcessMessages(IGeoProcessorResult result, ESRI.ArcGIS.Geodatabase.IGPMessages pMsgs)
    {

    }

    public void OnProgressMessage(IGeoProcessorResult result, string message)
    {

    }

    public void OnProgressPercentage(IGeoProcessorResult result, double percentage)
    {

    }

    public void OnProgressShow(IGeoProcessorResult result, bool Show)
    {

    }

    /// <summary>
    /// 运行结束后触发此事件
    /// </summary>
    /// <param name="result"></param>
    public void PostToolExecute(IGeoProcessorResult result)
    {
        //此处需要根据实际情况编写
        //此示例以缓冲区分析为例,执行成功后将缓冲区分析结果添加到MapControl中
        if (result.Status == esriJobStatus.esriJobSucceeded)
        {
            IGPUtilities4 gpu = new GPUtilitiesClass() as IGPUtilities4;
            IFeatureLayer player = new FeatureLayerClass();
            player.FeatureClass = gpu.Open(result.GetOutput(0)) as IFeatureClass;
            mapCon.AddLayer(player as ILayer);

        }
        else if(result.Status == esriJobStatus.esriJobFailed)
        {
            Console.WriteLine("运行失败");
        }
    }

    /// <summary>
    /// 运行前触发此事件
    /// </summary>
    /// <param name="result"></param>
    public void PreToolExecute(IGeoProcessorResult result)
    {
        Console.WriteLine("等待运行GP工具");
    }
}    

  2.实例化GeoProcessorEvents3Class类、GeoProcessorClass类并注册事件

IGeoProcessorEvents3 GeoProcessorEvents = new GeoProcessorEvents3Class(this.axMapControl1.Object as IMapControl2);
IGeoProcessor2 gp = new GeoProcessorClass();gp.OverwriteOutput = true;
gp.RegisterGeoProcessorEvents3(GeoProcessorEvents);

  3.提交工具执行

IVariantArray varParam = new VarArrayClass();
varParam.Add(@"C:\Users\Demacia\Desktop\展示\控制点.shp");
varParam.Add(@"C:\Users\Demacia\Desktop\展示\缓冲区.shp");
varParam.Add(2000);

gp.ExecuteASync("Buffer_analysis", varParam);

原文地址:https://www.cnblogs.com/songqingguo/p/12640096.html

时间: 2024-10-11 22:57:44

ArcEngine——异步执行GP工具(Background geoprocessing)的相关文章

c# 调用ArcEngine的GP工具

转自原文c# 调用ArcEngine的GP工具,AE调用GP工具 IAoInitialize m_AoInitialize = new AoInitializeClass(); esriLicenseStatuslicenseStatus = esriLicenseStatus.esriLicenseUnavailable; licenseStatus = m_AoInitialize.Initialize(esriLicenseProductCode.esriLicenseProductCod

毕业设计总结:(1)GP工具发布

GP工具的制作和发布,是ArcGIS使用中重要的一环,能力强的学长们都会选择根据自己的需要自己制作GP工具,关于如何制作GP工具,我的能力有限,只能和大家一起学习. 本文涉及到的GP工具发布,是我的本科毕业设计<基于Internet的DEM河流网提取分析研究>中的一部分,而河流网提取功能使用的就是我自己在ArcGIS中打包的GP工具,好了废话不多说,直接进入正文部分.网上类似的教程很多,希望想学好这些知识的同学自己多动手试试. 首先我们介绍简单介绍下GP工具.GP框架是一组用来管理和执行工具的

ArcGIS 10.1 发布使用ArcEngine自定义的GP服务

1. 新建立GP模型 在VS2010中新建一个普通的程序及,引入ArcEngine相关的dll.在该DLL中定义一个或多个GP类和一个GP工厂类.GP类要继承IGPFunction2接口,GP工厂类要继承IGPFunctionFactory接口. 下面是各个接口的一些实现方法 IGPFunction2 接口 接口意义 UID DialogCLSID { get; } 对话框的类标识,该方法在实现时直接返回为空即可. public UID DialogCLSID{ get{ return null

ArcGIS Runtime支持的GP工具列表(转 )

转自原文 ArcGIS Runtime支持的GP工具列表(转 ) 目前ArcGIS Runtime有两个版本 Basic 版本和Standard版本,而Basic版本不支持Geoprocessing(这里指的是本地的Geoprocessing),对于Geoprocessing的支持是在Standard版本中,在Standard版本中又可以搭配一些扩展模块来增强Geoprocessing,那么ArcGIS Runtime能支持那些以及支持多少Geoprocessing,我们将其归类如下. Stan

node js 异步执行流程控制模块Async介绍

1.Async介绍 sync是一个流程控制工具包,提供了直接而强大的异步功能.基于Javascript为Node.js设计,同时也可以直接在浏览器中使用. Async提供了大约20个函数,包括常用的 map, reduce, filter, forEach 等,异步流程控制模式包括,串行(series),并行(parallel),瀑布(waterfall)等. 项目地址:https://github.com/caolan/async 2. Async安装 npm install async 3.

Spring异步执行(@Async)2点注意事项

Spring中可以异步执行代码,注解方式是使用@Async注解. 原理.怎么使用,就不说了. 写2点自己遇到过的问题. 1.方法是公有的 // 通知归属人 @Async public void notifyPusher(Project project) { } 2.异步代码,需要放在外部单独的类中. @Service("asyncBiz")public class AsyncBiz { @Async public void notifyPusher(Project project) {

WPF 异步执行

private void Operate_OnClick(object sender, RoutedEventArgs e) { AsyncFindBox(); RadWindow.Alert("测试测试!"); } private void AsyncFindBox() { #region 需要将返回结果返回到UI上. //异步任务封装在一个delegate中, 此delegate将运行在后台线程 Func<string> asyncAction = this.Async

异步执行脚本

异步执行脚本 script 元素的 async 属性可以使关联脚本相对于页面的其余部分进行异步加载和执行. 也就是说,在继续对页面进行解析的同时,在后台加载并执行脚本.如果页面使用了要占用大量处理时间的脚本,那么使用 async 属性可以显著提高页面加载性能. async 属性. async 属性是万维网联合会 (W3C)  HTML5 规范的一部分,它是为以下情形设计的:对于脚本不存在依赖关系,但是脚本仍需要尽快运行.在以下假设示例中,如果不使用 async(或 defer)属性,则脚本可能会

毕业设计总结:(2)GP工具调用

感谢论坛博主@Mr|Right的文章以及他对我的帮助. 在上一篇文章中已经完成了GP工具的发布,这篇文章中主要涉及到GP工具的调用. 废话不多说,直接开始. 系统开发的硬件配置: 操作系统:Windows 8.1 专业版 软件平台:ArcGIS 10.1(包括Server 10.1和Desktop 10.1) ArcGIS API 3.1 for Silverlight Visual Studio 2010 Microsoft Silverlight 5 SDK Microsoft Access