内容分为两部分 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) {
}
}
}
}