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) {
                
            }
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章