Consuming a geoprocessing custom model in .NET
[C#]
Module1.cs
using System;
using System.Collections.Generic;
using System.Text;
using ESRI.ArcGIS.esriSystem;
namespace GeoprocessingInDotNet
{
class Module1
{
private static LicenseInitializer m_AOLicenseInitializer = new GeoprocessingInDotNet.LicenseInitializer();
[STAThread()]
static void Main(string[] args)
{
//ESRI License Initializer generated code.
m_AOLicenseInitializer.InitializeApplication(new esriLicenseProductCode[] { esriLicenseProductCode.esriLicenseProductCodeEngine },
new esriLicenseExtensionCode[] { });
//ESRI License Initializer generated code.
//Do not make any call to ArcObjects after ShutDownApplication()
m_AOLicenseInitializer.ShutdownApplication();
//Call the main execution of the application
RunTheApp();
}
// INSTRUCTIONS:
//
// 1. Create the following directories on your hard drive:
// C:\gp
// C:\gp\AirportsAndGolf
// C:\gp\output
//
// 2. Copy the RunModel.xml file in this sample to C:\gp
//
// 3. Copy all of the shapefile sample data in the directory:
// <your ArcGIS Developer Kit installation location>\Samples\data\AirportsAndGolf
// to:
// C:\gp\AirportsAndGolf
//
// 4. You must create a .NET Assembly from the custom model MY_CUSTOM_TOOLBOX.tbx
// that is provided with this sample. To create the .NET Assembly do the following:
// Right click on the project name in the Solution Explorer and choose 'Add ArcGIS Toolbox Reference...'
// In the ArcGIS Toolbox Reference dialog that opens:
// - For the Toolbox: Navigate to the MY_CUSTOM_TOOLBOX.tbx in this sample
// - Accept the defaults for the 'Generated Assembly Name' and 'Generated Assembly Namespace'
// - Specify the 'Generated Assembly Version' to be: 1.0.0.0
// - Uncheck the 'Sign the Generated Assembly'
// - Click OK
//
// 5. You should now be able to compile this sample and run it.
/// <summary>
/// Main execution of our application
/// </summary>
/// <remarks></remarks>
public static void RunTheApp()
{
// Give message prompting the user for input
Console.WriteLine("Enter the full path/filename of the xml driver file for the application.");
Console.WriteLine("Example: C:\\gp\\RunModel.xml");
Console.Write(">");
// Obtain the input from the user
System.String xmlPathFile = Console.ReadLine();
// Let the user know something is happening
Console.WriteLine("Processing...");
//Get all of the models parameters
System.Collections.Specialized.HybridDictionary modelParametersHybridDictionary = ReadXMLConfigurationFile(xmlPathFile);
// Run the model
System.String modelProcessingResultsString = ExecuteCustomGeoprocessingFunction(modelParametersHybridDictionary);
// Display the results to the user
Console.WriteLine(modelProcessingResultsString);
// Close the application after the users hits any key
Console.ReadLine();
}
/// <summary>
/// Read in the arguments from the .xml file that we be used to run our model
/// </summary>
/// <param name="xmlPathFile">The full path and filename of the .xml file. Example: "C:\gp\RunModel.xml"</param>
/// <returns>A HybridDictionary that contains the arguments to run our model.</returns>
/// <remarks></remarks>
public static System.Collections.Specialized.HybridDictionary ReadXMLConfigurationFile(System.String xmlPathFile)
{
System.Collections.Specialized.HybridDictionary modelParametersHybridDictionary = new System.Collections.Specialized.HybridDictionary();
try
{
//Read the XML configuration file
System.Xml.XmlDocument XMLdoc = new System.Xml.XmlDocument();
XMLdoc.Load(xmlPathFile);
// MY_CUSTOM_TOOLBOX
System.Xml.XmlNode xMY_CUSTOM_TOOLBOX = XMLdoc["MY_CUSTOM_TOOLBOX"];
// GolfFinder
System.Xml.XmlNode xGolfFinder = xMY_CUSTOM_TOOLBOX["GolfFinder"];
// BufferDistance
System.Xml.XmlNode xBufferDistance = xGolfFinder["BufferDistance"];
modelParametersHybridDictionary.Add("BufferDistance", xBufferDistance.InnerText);
// Airports
System.Xml.XmlNode xAirports = xGolfFinder["Airports"];
modelParametersHybridDictionary.Add("Airports", xAirports.InnerText);
// Golf
System.Xml.XmlNode xGolf = xGolfFinder["Golf"];
modelParametersHybridDictionary.Add("Golf", xGolf.InnerText);
// AirportBuffer
System.Xml.XmlNode xAirportBuffer = xGolfFinder["AirportBuffer"];
modelParametersHybridDictionary.Add("AirportBuffer", xAirportBuffer.InnerText);
// GolfNearAirports
System.Xml.XmlNode xGolfNearAirports = xGolfFinder["GolfNearAirports"];
modelParametersHybridDictionary.Add("GolfNearAirports", xGolfNearAirports.InnerText);
return modelParametersHybridDictionary;
}
catch (Exception ex)
{
//The XML read was unsuccessful. Return an empty HybridDictionary
return modelParametersHybridDictionary;
}
}
/// <summary>
/// Run the Geoprocessing model
/// </summary>
/// <param name="modelParametersHybridDictionary">A HybridDictionary that contains all of the arguments to run the model</param>
/// <returns>A message of how well the model executed</returns>
/// <remarks></remarks>
public static System.String ExecuteCustomGeoprocessingFunction(System.Collections.Specialized.HybridDictionary modelParametersHybridDictionary)
{
try
{
// Create a Geoprocessor object
ESRI.ArcGIS.Geoprocessor.Geoprocessor gp = new ESRI.ArcGIS.Geoprocessor.Geoprocessor();
// Set the OverwriteOutput setting to True
gp.OverwriteOutput = true;
// Create a new instance of our custom model
MYCUSTOMTOOLBOX.GolfFinder myModel = new MYCUSTOMTOOLBOX.GolfFinder();
// Set the custom models parameters.
myModel.BufferDistance = modelParametersHybridDictionary["BufferDistance"];
myModel.AIRPORT = modelParametersHybridDictionary["Airports"];
myModel.GOLF = modelParametersHybridDictionary["Golf"];
myModel.AirportBuffer = modelParametersHybridDictionary["AirportBuffer"];
myModel.Golf_Courses_Near_Airports = modelParametersHybridDictionary["GolfNearAirports"];
// Execute the model and obtain the result from the run
ESRI.ArcGIS.Geoprocessing.IGeoProcessorResult geoProcessorResult = (ESRI.ArcGIS.Geoprocessing.IGeoProcessorResult)gp.Execute(myModel, null);
if (geoProcessorResult == null)
{
// We have an error running the model.
// If the run fails a Nothing (VB.NET) or null (C#) is returned from the gp.Execute
object sev = 2;
string messages = gp.GetMessages(ref sev);
return messages;
}
else
{
// The model completed successfully
return "Output successful. The shapefiles are locacted at: " + geoProcessorResult.ReturnValue.ToString();
}
}
catch (Exception ex)
{
// Catch any other errors
return "Error running the model. Debug the application and test again.";
}
}
}
}
[Visual Basic .NET]
Module1.vb
Imports ESRI.ArcGIS.esriSystem
Imports ESRI.ArcGIS.Geoprocessing
Module Module1
Private m_AOLicenseInitializer As LicenseInitializer = New GeoprocessingInDotNet2008.LicenseInitializer()
<STAThread()> _
Sub Main()
' Load the product code and version to the version manager
ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Desktop)
'ESRI License Initializer generated code.
m_AOLicenseInitializer.InitializeApplication(New esriLicenseProductCode() {esriLicenseProductCode.esriLicenseProductCodeArcInfo}, _
New esriLicenseExtensionCode() {})
' Create geoprocessor. Overwrite true will replace existing output
Dim gp As IGeoProcessor2 = New GeoProcessor()
gp.OverwriteOutput = True
' Get the workspace from the user
Console.WriteLine("Enter the path to folder where you copied the data folder.")
Console.WriteLine("Example: C:\AirportsAndGolf\data")
Console.Write(">")
Dim wks As String = Console.ReadLine()
' Set the workspace to the value user entered
gp.SetEnvironmentValue("workspace", wks + "\golf.gdb")
' Add the custom toolbox to geoprocessor
gp.AddToolbox(wks + "\Find Golf Courses.tbx")
' Create a variant - data are in the workspace
Dim parameters As IVariantArray = New VarArray()
parameters.Add("Airports")
parameters.Add("8 Miles")
parameters.Add("Golf")
parameters.Add("GolfNearAirports")
Dim sev As Object = Nothing
Try
gp.Execute("GolfFinder", parameters, Nothing)
Console.WriteLine(gp.GetMessages(sev))
Catch ex As Exception
Console.WriteLine(ex.Message)
Dim errorMsgs As String = gp.GetMessages(sev)
Console.WriteLine(errorMsgs)
Finally
Console.WriteLine("Hit Enter to quit")
Console.ReadLine() ' pause the console to see messages
End Try
'ESRI License Initializer generated code.
'Do not make any call to ArcObjects after ShutDownApplication()
m_AOLicenseInitializer.ShutdownApplication()
End Sub
End Module