ArcEngine——使用GP工具导出数据

 内容分为两部分 GPBase 与继承GPBase的GeoDataGPExport,GeoDataGPExport为调用的放方法

GPBase

/***************************
 Write by Chn gzGISer Tst
 CSDN blog Ricardo.M.Tan
 **************************/
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geoprocessing;
using ESRI.ArcGIS.Geoprocessor;
using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace Chn.SpatialDataProcessing.GeoDataHelper.Processing {
    /// <summary>
    /// gp基类
    /// </summary>
    public class GPBase<T> where T : class, new()  {
        /// <summary>
        /// gp工具执行者
        /// </summary>
        protected Geoprocessor _gp = null;
        /// <summary>
        /// gp执行队列
        /// </summary>
        protected Queue<IGPProcess> _myGPToolsToExecute = new Queue<IGPProcess>();
        /// <summary>
        /// gp基类
        /// </summary>
        public GPBase() {
            _gp = new Geoprocessor();
            //All results will be written to the users TEMP folder
            _gp.OverwriteOutput = true;
            _gp.ToolExecuting += new EventHandler<ToolExecutingEventArgs>(_gp_ToolExecuting);
            _gp.MessagesCreated += new EventHandler<MessagesCreatedEventArgs>(_gp_MessagesCreated);
            _gp.ProgressChanged += new EventHandler<ProgressChangedEventArgs>(_gp_ProgressChanged);
            _gp.ToolExecuted += new EventHandler<ToolExecutedEventArgs>(_gp_ToolExecuted);
        }

        private void _gp_ToolExecuting(object sender, ToolExecutingEventArgs e) {
            IGeoProcessorResult2 gpResult = e.GPResult as IGeoProcessorResult2;
             /*此处传递自己想传递的消息*/
        }

        private void _gp_MessagesCreated(object sender, MessagesCreatedEventArgs e) {
            IGPMessages gpMsgs = e.GPMessages;

            if (gpMsgs.Count > 0) {
                for (int count = 0; count < gpMsgs.Count; count++) {
                    IGPMessage msg = gpMsgs.GetMessage(count);
                    MessageType imageToShow = MessageType.Information;
                    switch (msg.Type) {
                        case esriGPMessageType.esriGPMessageTypeAbort:
                            imageToShow = MessageType.Warning;
                            break;
                        case esriGPMessageType.esriGPMessageTypeEmpty:
                            imageToShow = MessageType.Information;
                            break;
                        case esriGPMessageType.esriGPMessageTypeError:
                            imageToShow = MessageType.Error;
                            break;
                        case esriGPMessageType.esriGPMessageTypeGDBError:
                            imageToShow = MessageType.Error;
                            break;
                        case esriGPMessageType.esriGPMessageTypeInformative:
                            imageToShow = MessageType.Information;
                            break;
                        case esriGPMessageType.esriGPMessageTypeProcessDefinition:
                            imageToShow = MessageType.Information;
                            break;
                        case esriGPMessageType.esriGPMessageTypeProcessStart:
                            imageToShow = MessageType.Information;
                            break;
                        case esriGPMessageType.esriGPMessageTypeProcessStop:
                            imageToShow = MessageType.Information;
                            break;
                        case esriGPMessageType.esriGPMessageTypeWarning:
                            imageToShow = MessageType.Warning;
                            break;
                        default:
                            break;
                    }
                    /*此处传递自己想传递的消息*/
                }
            }
        }

        private void _gp_ProgressChanged(object sender, ProgressChangedEventArgs e) {
            IGeoProcessorResult2 gpResult = e.GPResult as IGeoProcessorResult2;
            if (e.ProgressChangedType == ProgressChangedType.Message) {
                 /*此处传递自己想传递的消息*/
            }
        }

        private void _gp_ToolExecuted(object sender, ToolExecutedEventArgs e) {
            IGeoProcessorResult2 gpResult = e.GPResult as IGeoProcessorResult2;
            try {
                if (gpResult.Status == esriJobStatus.esriJobSucceeded) {
                     /*此处传递自己想传递的消息*/
                    if (_myGPToolsToExecute.Count > 0) {
                        _gp.ExecuteAsync(_myGPToolsToExecute.Dequeue());
                    } else {
                         /*此处传递自己想传递的消息*/
                    }
                } else if (gpResult.Status == esriJobStatus.esriJobFailed) {
                    /*此处传递自己想传递的消息*/
                }
            } catch {
                throw;
            }
        }
    }
}

GeoDataGPExport:

/***************************
 Write by Chn gzGISer Tst
 CSDN blog Ricardo.M.Tan
 **************************/
using ESRI.ArcGIS.Carto;
using System;
using System.Collections.Generic;

namespace Chn.SpatialDataProcessing.GeoDataHelper.Processing {
    /// <summary>
    /// 地理数据导出
    /// </summary>
    public class GeoDataGPExport: GPBase<GeoDataGPExport> {
        /// <summary>
        /// 地理数据导出
        /// </summary>
        public GeoDataGPExport() 
            :base() {

        }

        /// <summary>
        /// 使用GP工具导出
        /// </summary>
        /// <param name="layerList">要素类或要素图层集合</param>
        /// <param name="exportFolder">到出路径</param>
        public void gpAsyncExport(List<ILayer> layerList, string exportFolder) {
            try {
                layerList.ForEach(layer => {
                    ESRI.ArcGIS.ConversionTools.FeatureClassToShapefile convertToShp = new ESRI.ArcGIS.ConversionTools.FeatureClassToShapefile();
                    convertToShp.Input_Features = layer as IFeatureLayer;
                    convertToShp.Output_Folder = exportFolder;
                    _myGPToolsToExecute.Enqueue(convertToShp);
                });
                _gp.ExecuteAsync(_myGPToolsToExecute.Dequeue());
            } catch (Exception ex) {
                
            }
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值