//两种方式获得Geoprocessor
//托管类可以获得IntelliSense工具参数。范围仅限于地理处理功能最重要的一个子集。使用IGeoProcessor.Execute的唯一限制是得知道参数的顺序。
1使用地理处理库的
IGeoProcessorESRI.ArcGIS.Geoprocessing
IGeoProcessor2 gp = new GeoProcessorClass();//p是大写的P
2使用托管程序集的地理处理器类ESRI.ArcGIS.Geoprocessor
Geoprocessor gp = new Geoprocessor();//小写的p
//工具箱名称 命名空间
3D分析工具 ESRI.ArcGIS.Analyst3DTools
分析工具 ESRI.ArcGIS.AnalysisTools
转换工具 ESRI.ArcGIS.ConversionTools
数据管理工具 ESRI.ArcGIS.DataManagementTools
编辑工具 ESRI.ArcGIS.EditingTools
制图工具 ESRI.ArcGIS.CartographyTools
覆盖工具 ESRI.ArcGIS.CoverageTools
地理编码工具 ESRI.ArcGIS.GeocodingTools
地统计分析工具 ESRI.ArcGIS.GeostatisticalAnalystTools
线性参考工具 ESRI.ArcGIS.LinearReferencingTools
多维工具 ESRI.ArcGIS.MultidimensionTools
网络分析工具 ESRI.ArcGIS.NetworkAnalystTools
包裹织物工具 ESRI.ArcGIS.ParcelFabricTools
空间分析工具 ESRI.ArcGIS.SpatialAnalystTools
空间统计工具 ESRI.ArcGIS.SpatialStatisticsToolsNear nearTool = new Near();
nearTool.in_feautures = @"C:\data\hospitals.shp";
nearTool.near_features = @"C:\data\houses.shp";
或者
gp.SetEnvironmentValue("workspace", @"C:/data/Habitat_Analysis.gdb");
Erase eraseTool = new Erase("suitableVeg", "roadsBuffer", "eraseOutput");
//多输入Geoprocessor
public void ExampleGPUsingMultipleInputs()
{
// Initialize the geoprocessor.
Geoprocessor GP = new Geoprocessor();
// Initialize the Union tool.
Union uniontool = new Union();
// List all feature classes in the workspace.
GP.SetEnvironmentValue("workspace", @"C:\studyarea");
IGpEnumList fcColl = GP.ListFeatureClasses("*", "", "");
// Create a StringBuilder object and add the feature classes as a semicolon-delimited list.
StringBuilder sb = new StringBuilder();
string inputfeatures = fcColl.Next();
while (inputfeatures != "")
{
sb.AppendFormat("{0};", inputfeatures);
inputfeatures = fcColl.Next();
}
// Execute the Union tool with multiple inputs creating landuse.shp.
uniontool.in_features = sb.ToString();
uniontool.out_feature_class = "landuse.shp";
GP.Execute(uniontool, null);
}
//检验是否存在
object dt = "";
bool bExists = gp.Exists(@"C:\Data\PortlandOR.gdb\downtown", ref dt);
//允许重写
gp.OverwriteOuptut = true;
//检验数据类型
// Describe the input feature class.
object dtype = "";
IDataElement dataelement = GP.GetDataElement(@"C:\GP\PortlandOR.gdb\streets", ref dtype);
// Open the feature class data element and get the shape type.
IDEFeatureClass defc = dataelement as IDEFeatureClass;//转为.数据元素要素类
if (defc.FeatureType == esriFeatureType.esriFTSimple)//判断数据的类型
Console.WriteLine("Feature type is simple.");
if (defc.ShapeType == esriGeometryType.esriGeometryPolyline)
Console.WriteLine("ShapeType is polyline.");
if (defc.ShapeFieldName = "Shape")
Console.WriteLine("Shape field name is Shape.");
//4处理结果IGeoProcessorResult
severity严重性:0消息,1警告,2错误
object sev=null;
string messages=Geoprocessor.GetMessages(ref sev);
IGeoProcessorResult2 pResult = (IGeoProcessorResult2)gp.Execute(uniontool, null);
MessageBox.Show(pResult.GetMessages(0));//即可输出所有消息
关于结果对象
IGeoProcessorResult2.ReturnValue//返回H:\桌面\网格点T值用于插值.shp
IGeoProcessor2接口的Execute和ExecuteAsync方法返回IGeoProcessorResult。
IGeoProcessorResult可以通过提取执行工具返回的值来链接多个进程。
该IGeoProcessor 接口有方法来获取信息。
通过IGeoProcessorResult,可以获得其他信息,例如以前的工具的输入和输出,作业执行状态以及消息。
IGeoProcessorResult接口的常用方法和属性:
GetMessage 按索引返回消息描述。有关更多信息,请参阅如何获取返回的消息。
getMessages 返回所有消息描述。
MaxSeverity 返回消息的最大严重性。
MessageCount 返回消息的数量。
GetInput 按索引返回输入。
InputCount 返回输入的数量。
GetOutput 按索引返回输出,IGPValue。
OutputCount 返回输出的数量。
ResultID 获取作业ID。
该IGeoProcessorResult2接口具有以下附加属性:
IsAsync 返回进程是否是异步的。
IsCanceled 指示是否调用Cancel方法。
处理 设置地理处理器进程值。
在本地执行工具时,仅当工具成功运行(即,如果工具没有返回错误),才会返回结果对象。
当您在本地运行工具并尝试使用结果对象时必须小心,因为如果工具失败,则会引发异常;
并且你不能使用结果对象,因为控制流去catch块。工作流程很复杂,如下面的代码示例所示:
[C#] [VB.NET]
try
{
// Copy features.
// Create a variant array and populate parameters.
IGeoProcessorResult2 result;
result = (IGeoProcessorResult2)gp.Execute("CopyFeatures_management", parameters,
null);
if (result != null)
{
// Use the result object's methods or properties.
// Use the geoprocessing tool or result object to get messages.
}
else
{
// The control of code flow may not come into the else block.
// ...
}
}
catch (Exception ex)
{
//
// Get the geoprocessor error messages.
//
}
//要使用本主题中的代码,请在Visual Studio项目中引用以下程序集。在代码文件中,您需要使用(C#)或Imports(VB .NET)指令来使用相应的名称空间
//(如果与程序集名称不同,则在下面的括号中给出):
ESRI.ArcGIS.Geoprocessing
ESRI.ArcGIS.System (ESRI.ArcGIS.esriSystem)
ESRI.ArcGIS.Geoprocessor
ITrackCancel接口
CancelTracker对象是ArcObjects用来监视Esc键的对象(也可以是空格键和鼠标点击),也可以根据用户的请求来终止进程。
通常,在执行诸如打印,导出和绘图等冗长操作的功能之前,将取消跟踪器交给或创建。
ITrackCancel接口提供对属性和方法的访问,以确定用户是否已经执行了取消操作,还允许开发人员指定构成取消操作的操作。
CancelOnClick 指示鼠标点击是否应取消操作。
CancelOnKeyPress 指示退出键和空格键是否应取消操作。
ProcessMessages 一个过时的方法。
PROGRESSOR 进度者用来在漫长的操作中显示进度。
startTimer所 一个过时的方法。
StopTimer 一个过时的方法。
TimerFired 一个过时的方法。
实现ITrackCancel的CoClasses
CancelTracker(esriDisplay) 取消中断绘图的跟踪器类。
GPServerTrackCancel(esriGeoprocessing) GP服务器跟踪取消类。
//6.gp进度状态显示
GP工具如果运行时间过长,会自动开辟新线程,将主线程还给程序,这样就难以获取其运行状态。
可以通过开辟一个查询线程,实时获取其当前状态。
IGeoProcessorResult gpResult;//GP状态
TimeSpan timeSpan;//时间间隔
Thread thread;//线程
thread= new Thread(GetStatus);//开辟线程计时
thread.Start();
gpResult = GP_Tool.ExecuteAsync("");
thread.Join();//阻塞主线程,gp执行完再执行主线程,即join()的作用是:“等待该线程终止”
private void GetStatus()
{
StopWatch.Start(); // 开始监视代码运行时间 using System.Diagnostics;
while (GP_Progress.Status != esriJobStatus.esriJobSucceeded && gpResult.Status != esriJobStatus.esriJobFailed) //ESRI.ArcGIS.esriSystem.
{
timeSpan = StopWatch.Elapsed;
Status_String = "状态:" + GP_Progress.Status.ToString() + "已经运行:" + ((int)(TS_TimeSpan.TotalSeconds)).ToString() + "秒";
Thread.Sleep(1000); //线程暂停1s,以在控制台输出状态
}
StopWatch.Stop();//停止计时器
StopWatch.Reset();//重置计时器
thread.Abort();//线程自杀
}
//1.Buffer
//以下代码示例显示了Analysis工具箱中Buffer工具的执行情况。定义了该工具所需的参数。在这种情况下,字符串用于定义输入,输出和缓冲区距离属性,因此对工具的调用更易于阅读。
//从你的main调用这个方法。
private static void RunBuffer()
{
// Create the geoprocessor.
IGeoProcessor2 gp=new GeoProcessorClass();
gp.OverwriteOutput=true;
IGeoProcessorResult result=new GeoProcessorResultClass();
//创建一个变量数组来保存参数值
IVariantArray parameters=new VarArrayClass();
object sev=null;
try
{
//用参数值填充变量数组.
parameters.Add(@"C:\data\california.gdb\cities");
parameters.Add(@"C:\data\california.gdb\cities_buff");
parameters.Add("1000 Meters");
// Execute the tool.
result=gp.Execute("Buffer_analysis", parameters, null);
// Wait until the execution completes.
while (result.Status == esriJobStatus.esriJobExecuting)
Thread.Sleep(1000);
// Wait for 1 second.
// Print geoprocessring messages.
Console.WriteLine(gp.GetMessages(ref sev));
}
catch (Exception ex)
{
// Print a generic exception message.
Console.WriteLine(ex.Message);
// Print geoprocessing execution error messages.
Console.WriteLine(gp.GetMessages(ref sev));
}
}
//6.后台处理
后台地理处理使用Geoprocessor.ExecuteAsync方法
提交执行工具。
检查工具的执行状态。
//异步提交一个工具
Geoprocessor gp = new Geoprocessor();//using ESRI.ArcGIS.Geoprocessor;
gp.OverwriteOutput = true;
gp.ToolExecuted += new EventHandler < ToolExecutedEventArgs> (gpToolExecuted);//注册执行完毕事件,在gpToolExecuted进行错误消息捕捉等
IGeoProcessorResult2 gpResult = gp.ExecuteAsync("Copy", parameters);
//实践没有看出和gp.Execute()有什么区别
//实践证明不管在哪个地方新建的gp都会共用+= new EventHandler的事件,并根据注册顺序顺序执行,所以要退订!
gp.ToolExecuted -= gpToolExecuted;
//ToolExecuted事件,ToolExecutingEventArgs参数具有返回值,作业状态和地理处理消息。
public void gpToolExecuted(object sender, ToolExecutedEventArgs e)
{
IGeoProcessorResult2 result = e.GPResult as IGeoProcessorResult2;
if (result.Status.Equals(esriJobStatus.esriJobSucceeded))
{
//if没有错误消息
if (result.MaxSeverity == 0)
{
object returnValue = result.ReturnValue;
//如返回一个图层,接下来你要干什么
}
else
{
}
}
else
{
//获得所有消息
IGPMessages msgs = result.GetResultMessages();
for (int i = 0; i < result.MessageCount; i++)
{
IGPMessage2 msg = msgs.GetMessage(i)as IGPMessage2;
}
}
}
//ExecuteAsync方法将工具提交到当前进程中存在的地理处理队列,然后该工具的IGeoProcessorResult.Status 属性变为esriJobStatus.esriJobWaiting。
检查工具执行状态
注册并侦听Geoprocessor.ToolExecuted事件以及可选的其他事件(这是最常见的选项)。
定期查询IGeoprocessorResult。
地理处理器事件
在工具执行期间,MessagesCreated事件和ProgressChanged事件可以触发
MessagesCreated事件触发描述模型中每个工具的进度。
ToolExecuting事件
如果您提交了许多工具,则可以确定哪个工具已经开始执行
public void gpToolExecuting(object sender, ToolExecutingEventArgs e)
{
IGeoProcessorResult2 result = e.GPResult as IGeoProcessorResult2;
if (result.Process.Tool.Name.Equals("CopyFeatures") && result.GetInput(0) .GetAsText().Equals(@"c:\Roads"))
{
//Application specific code.
}
}
ProgressChanged事件
ProgressChanged事件触发取决于正在执行的工具以及正在处理的数据量
public void gpProgressChanged(object sender, ProgressChangedEventArgs e)
{
System.Windows.Forms.ProgressBar progressBar = myProgressBar;
IGeoProcessorResult2 gpResult = (IGeoProcessorResult2)e.GPResult;
switch (e.ProgressChangedType)
{
case (ProgressChangedType.Show):
//The tool that is running reports progress or has stopped reporting progress; make the
// progress bar visible if appropriate.
progressBar.Visible = e.Show;
break;
case (ProgressChangedType.Message):
//The application does not use these, since a tool being used reports percentage progress.
break;
case (ProgressChangedType.Percentage): progressBar.Value = (int)
e.ProgressPercentage;
break;
default:
throw new ApplicationException(
"unexpected ProgressChangedEventsArgs.ProgressChangedType");
break;
}
}
//取消一个工具
IGeoProcessorResult2.Cancel()。其IGeoProcessorResult2.IsCanceled属性将为true。
通过测试IGeoProcessorResult2.Status是esriJobStatus.esriJobCancelled,确认工具在ToolExecuted事件处理程序中被完全取消。
//工具执行期间的图层和数据使用 , 在工具执行期间,可以完成以下任务:
更改从正在执行的地理处理工具输入或输出的图层的可见性,选择能力和连接详细信息。
搜索并选择输入到地理处理工具的数据,例如,使用IFeatureLayer.Search和IFeatureClass.Select方法。
//在执行工具期间,以下任务成功或失败:
在编辑会话中编辑输入或输出数据的表格行。
对输出数据使用IFeatureLayer.Search和IFeatureClass.Select方法。返回的表行集是未定义的,因为表正在被填充。
当这些方法在地理处理工具的输出数据上运行时,地理处理工具可能会失败并返回esriJobStatus.esriJobFail状态。
//7.使用模型
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geoprocessing;
//使用自定义模型工具
IGeoProcessor2 gp = new GeoProcessorClass();
gp.OverwriteOutput = true;
// 模型放在工具箱里
gp.AddToolbox(@"H:\Find Golf Courses.tbx");
IVariantArray parameters = new VarArrayClass();
parameters.Add("Airports");
parameters.Add("8 Miles");
object sev = null;
try
{
gp.Execute("GolfFinder", parameters, null);//注意工具名字是属性里的名字!!!!!!!!!!!!!!!!!
Console.WriteLine(gp.GetMessages(ref sev));
}
catch (Exception ex)
{
Console.WriteLine( gp.GetMessages(ref sev));
}