Running a geoprocessing tool
Each geoprocessing tool has a fixed set of parameters that provide the tool with the information it needs for execution. Tools usually have input parameters that define the dataset or datasets that will typically be used to generate new output data. Parameters have the following important properties:
- Name—Each tool parameter has a unique name.
- Type—The type of data expected, such as a feature class, integer, string, and raster.
- Required—Either a value must be provided for a parameter, or it is optional.
Each tool has a documentation page known as a tool reference page. For more information about parameters, see Interpreting a tool reference page.
When a tool is used in a program, its parameter values must be set correctly so it can execute when the program runs. The documentation of each tool clearly defines its parameters and properties. Once a valid set of parameter values is provided, the tool is ready to be executed.
Parameters are specified as strings or objects. Strings are text values that uniquely identify a parameter value, such as a path to a dataset or a keyword. Most tool parameters can be specified as a simple string. However, complex parameters, such as a spatial reference, can be easier to specify with an object. Each tool has its own parameter types. To get complete information on a particular tool, review the tool reference page. Interpreting a tool reference page explains how to read a tool reference page and extract information to use in .NET.
You can run a geoprocessing tool by using the Geoprocessing library methods or by the geoprocessor managed assembly methods. For information about the basic differences between the two approaches, see Executing tools. In both cases, the Execute method of the geoprocessor is called.
The Execute method uses a null reference instead of an ITrackCancel interface. The ITrackCancel interface provides access to properties and methods that determine if a cancellation has been executed by the user and also allows developers to specify what actions constitute a cancellation. Both approaches are elaborated with the following examples.
Using the geoprocessing assembly
The geoprocessing assembly is the Component Object Model (COM) interop of the Geoprocessing type library. The Execute method of the IGeoProcessor2 interface of the library is used to run a tool.
The following are the generic steps to execute a tool:
- Add a reference to ESRI.ArcGIS.Geoprocessing to your project. This is the only reference you need if you use the geoprocessing assembly.
- Create the geoprocessor object.
- Add the path to the custom toolbox if you are running a custom tool.
- Create an IVariantArray and populate it with tool parameter values. The IVariantArray is available through the esriSystem library.
- Call the Execute method on the geoprocessor.
The process is the same if you run a system tool or a custom tool.
Make sure you maintain the order of parameters as specified in the tool reference page when populating the variant array. Follow the syntax section of the tool reference page (see link at the bottom), it shows the correct ordering of parameters.
If you want to skip an optional parameter, just add an empty string to the variant array in correct order. For example, if a tool's third, fourth and fifth parameters are optional and you want to pass value only to the fifth parameter, then you have to pass empty strings to the third and fourth parameters to maintain correct ordering.
Passing an empty string instructs the tool to use the default value of that parameter.
Do not follow the tool's dialog box to get the order of parameters; follow the tool's Help page (browse to Interpreting a tool reference page link at the end). Parameters are arranged on a tool dialog box by "display order" not by the actual order.
Executing a system tool
The following code example shows the execution of the Buffer tool from the Analysis toolbox. The required parameters for the tool are defined. In this case, strings are used to define the input, output, and buffer distance properties, so the call to the tool is easier to read.
[C#]
using System;
using System.Threading;
// Add references to esriSystem for licensing and IVariantArray.
using ESRI.ArcGIS.esriSystem;
// Add a reference to the geoprocessing namespace.
using ESRI.ArcGIS.Geoprocessing;
// Call this method from your main.
private static void RunBuffer()
{
// Create the geoprocessor.
IGeoProcessor2 gp = new GeoProcessorClass();
gp.OverwriteOutput = true;
IGeoProcessorResult result = new GeoProcessorResultClass();
// Create a variant array to hold the parameter values.
IVariantArray parameters = new VarArrayClass();
object sev = null;
try
{
// Populate the variant array with parameter values.
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));
}
}
[VB.NET]
Imports System
Imports System.Threading
' Add references to esriSystem for licensing and IVariantArray.
Imports ESRI.ArcGIS.esriSystem
' Add a reference to the geoprocessing namespace.
Imports ESRI.ArcGIS.Geoprocessing
' Call this method from your main.
Private Sub RunBuffer()
' Create the geoprocessor.
Dim gp As IGeoProcessor2 = New GeoProcessor()
gp.OverwriteOutput = True
Dim result As IGeoProcessorResult = New GeoProcessorResult()
' Create a variant array to hold the parameter values.
Dim parameters As IVariantArray = New VarArray()
Dim sev As Object = Nothing
Try
' Populate the variant array with parameter values.
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, Nothing)
' Wait until the execution completes.
While (result.Status = esriJobStatus.esriJobExecuting)
Thread.Sleep(1000)
End While
' Print geoprocessing messages.
Console.WriteLine(gp.GetMessages(sev))
Catch ex As Exception
' Print generic exception messages.
Console.WriteLine(ex.Message)
' Print geoprocessing execution error messages.
Console.WriteLine(gp.GetMessages(sev))
End Try
End Sub
Executing a custom tool
In addition to using the existing tools and toolboxes provided by Esri, you can also execute custom tools, such as model tools and script tools, that exist in custom toolboxes. The process is the same for system or custom tools when you use IGeoProcessor2.Execute. As all system toolboxes are readily available to the geoprocessor, you do not need to add the toolbox to the geoprocessor. However, you must add the custom toolbox to the geoprocessor using the AddToolbox method.
The following code example shows how to execute the CalculateBestPath custom tool in the BestPath.tbx toolbox:
The only difference between running a system tool and a custom tool is adding the custom toolbox to the geoprocessor. For more information on system and custom tools, see Essential geoprocessing vocabulary in the ArcGIS Desktop Help system.
public void SampleCalculateBestPathToolGping()
{
// Initialize the geoprocessor.
IGeoProcessor2 gp = new GeoProcessorClass();
// Add the BestPath toolbox.
gp.AddToolbox(@"C:\SanDiego\BestPath.tbx");
// Generate the array of parameters.
IVariantArray parameters = new VarArrayClass();
parameters.Add(@"C:\SanDiego\source.shp");
parameters.Add(@"C:\SanDiego\destination.shp");
parameters.Add(@"C:\SanDiego\bestpath.shp");
object sev = null;
try
{
// Execute the model tool by name.
gp.Execute("CalculateBestPath", parameters, null);
Console.WriteLine(gp.GetMessages(ref sev));
}
catch (Exception ex)
{
// Print geoprocessing execution error messages.
Console.WriteLine(gp.GetMessages(ref sev));
}
}
[VB.NET]
Public Sub SampleCalculateBestPathTool()
' Initialize the geoprocessor.
Dim gp As IGeoProcessor2 = New GeoProcessor()
' Add the BestPath toolbox.
GP.AddToolbox("C:\SanDiego\BestPath.tbx")
' Generate the array of parameters.
Dim parameters As IVariantArray = New VarArray
parameters.Add("C:\SanDiego\source.shp")
parameters.Add("C:\SanDiego\destination.shp")
parameters.Add("C:\SanDiego\bestpath.shp")
Dim sev As Object = Nothing
Try
' Execute the model tool by name.
GP.Execute("CalculateBestPath", parameters, Nothing)
' Print geoprocessing messages.
Console.WriteLine(gp.GetMessages(sev))
Catch ex As Exception
' Print geoprocessing execution error messages.
Console.WriteLine(gp.GetMessages(sev))
End Try
End Sub
Always surround your code with try-catch blocks, because the Execute method throws an exception if the tool fails to run.
Using the geoprocessor managed assembly
The following are the general steps to run a tool:
- Add a reference to ESRI.ArcGIS.Geoprocessor. You may also need to add the ESRI.ArcGIS.Geoprocessing assembly if you want to use, for example, the result object or list datasets.
- Additionally, add a reference to the toolbox assembly to which the tool belongs. If you use more than one tool from different toolboxes, also add managed assemblies for those toolboxes.
- Create the geoprocessor object.
- Add the path to the custom toolbox if you are running a custom tool.
- Create a tool process object and set the parameter values.
- Call the Execute method on the geoprocessor.
Executing a system tool with managed assembly
In the following code example, the Buffer tool is executed with the same parameter values by using the managed assemblies:
[C#]
// Add the geoprocessor namespace.
using ESRI.ArcGIS.Geoprocessor;
// Add the toolbox assembly.
using ESRI.ArcGIS.AnalysisTools;
public void SampleBufferTool()
{
// Create the geoprocessor.
Geoprocessor GP = new Geoprocessor();
// Create the tool process object.
ESRI.ArcGIS.AnalysisTools.Buffer bufferTool = new
ESRI.ArcGIS.AnalysisTools.Buffer();
// Set parameter values.
bufferTool.in_features = @"D:\St_Johns\data.mdb\roads";
bufferTool.out_feature_class = @"D:\St_Johns\data.mdb\roads_Buffer";
bufferTool.buffer_distance_or_field = "distance";
object sev = null;
try
{
// Execute the tool.
GP.Execute(bufferTool, null);
Console.WriteLine(GP.GetMessages(ref sev));
}
catch (Exception ex)
{
// Print geoprocessing execution error messages.
Console.WriteLine(GP.GetMessages(ref sev));
}
}
[VB.NET]
' Add the geoprocessor namespace.
Imports ESRI.ArcGIS.Geoprocessor
' Add the toolbox assembly.
Imports ESRI.ArcGIS.AnalysisTools
Public Sub SampleBufferTool()
' Initialize the geoprocessor.
Dim GP As Geoprocessor = New Geoprocessor()
' Create the tool process object.
Dim bufferTool As ESRI.ArcGIS.AnalysisTools.Buffer = New ESRI.ArcGIS.AnalysisTools.Buffer()
' Set parameter values.
bufferTool.in_features = "D:\St_Johns\data.mdb\roads"
bufferTool.out_feature_class = "D:\St_Johns\data.mdb\roads_Buffer"
bufferTool.buffer_distance_or_field = "distance"
Dim sev As Object = Nothing
Try
' Execute the tool.
GP.Execute(bufferTool, Nothing)
' Print geoprocessing messages.
Console.WriteLine(GP.GetMessages(sev))
Catch ex As Exception
' Print geoprocessing execution error messages.
Console.WriteLine(GP.GetMessages(sev))
End Try
End Sub
Executing a custom tool with managed assembly
Custom toolboxes do not have any managed assembly. Therefore, the simplest way to run a custom tool is by using IVariantArray and executing the tool by name. The Execute method of the geoprocessor is overloaded and has an additional argument list that allows you to execute a tool by specifying the tool name, the parameters of the tool, and the ITrackCancel interface. First, add your custom toolbox to the geoprocessor using the AddToolbox method. See the following code example:
[C#]
public void SampleCalculateBestPathTool()
{
// Initialize the geoprocessor.
Geoprocessor GP = new Geoprocessor();
// Add the BestPath toolbox.
GP.AddToolbox(@"C:\SanDiego\BestPath.tbx");
// Generate the array of parameters.
IVariantArray parameters = new VarArrayClass();
parameters.Add(@"C:\SanDiego\source.shp");
parameters.Add(@"C:\SanDiego\destination.shp");
parameters.Add(@"C:\SanDiego\bestpath.shp");
object sev = null;
try
{
// Execute the model tool by name.
GP.Execute("CalculateBestPath", parameters, null);
Console.WriteLine(GP.GetMessages(ref sev));
}
catch (Exception ex)
{
// Print geoprocessing execution error messages.
Console.WriteLine(GP.GetMessages(ref sev));
}
}
[VB.NET]
Public Sub SampleCalculateBestPathTool()
' Initialize the geoprocessor.
Dim GP As Geoprocessor = New Geoprocessor()
' Add the BestPath toolbox.
GP.AddToolbox("C:\SanDiego\BestPath.tbx")
' Generate the array of parameters.
Dim parameters As IVariantArray = New VarArray
parameters.Add("C:\SanDiego\source.shp")
parameters.Add("C:\SanDiego\destination.shp")
parameters.Add("C:\SanDiego\bestpath.shp")
Dim sev As Object = Nothing
Try
' Execute the model tool by name.
GP.Execute("CalculateBestPath", parameters, Nothing)
' Print geoprocessing messages.
Console.WriteLine(GP.GetMessages(sev))
Catch ex As Exception
' Print geoprocessing execution error messages.
Console.WriteLine(GP.GetMessages(sev))
End Try
End Sub
The process of executing a custom tool is same whether you use the geoprocessing assembly or the geoprocessor managed assembly. The only difference is in creating the geoprocessor.
You can generate a toolbox assembly for a custom toolbox using the integrated development environment (IDE) framework in Visual Studio .NET. To do so, use the ArcGIS Toolbox Reference dialog box. For more information, see ArcGIS Toolbox Reference dialog box. Once an assembly is created, you can use it in the same way as a system toolbox assembly.
To run a tool in the background geoprocessing, use the ExecuteAsync method instead. For more information, see Running a geoprocessing tool using background geoprocessing.
See Also:
Executing toolsInterpreting a tool reference page
Errors and exception handling in geoprocessing
To use the code in this topic, reference the following assemblies in your Visual Studio project. In the code files, you will need using (C#) or Imports (VB .NET) directives for the corresponding namespaces (given in parenthesis below if different from the assembly name):
ESRI.ArcGIS.Geoprocessing ESRI.ArcGIS.System (ESRI.ArcGIS.esriSystem)ESRI.ArcGIS.Geoprocessor ESRI.ArcGIS.AnalysisTools