AE开发示例之RunGPAsync

using System;

using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.SystemUI;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geoprocessor;
using ESRI.ArcGIS.Geoprocessing;
using ESRI.ArcGIS.DataManagementTools;

namespace RunGPAsync
{
public partial class RunGPForm : Form
{
private Geoprocessor _gp = null;

private Dictionary<string, IFeatureLayer> _layersDict = new Dictionary<string, IFeatureLayer>();

private List<IFeatureLayer> _resultsList = new List<IFeatureLayer>();

private Queue<IGPProcess> _myGPToolsToExecute = new Queue<IGPProcess>();

public RunGPForm()
{
InitializeComponent();

listView1.Columns.Add("Event", 200, HorizontalAlignment.Left);
listView1.Columns.Add("Message", 1000, HorizontalAlignment.Left);

listView1.SmallImageList = imageList1;

_gp = new Geoprocessor();

string outputDir = System.Environment.GetEnvironmentVariable("TEMP");
_gp.SetEnvironmentValue("workspace", outputDir);
_gp.OverwriteOutput = true;
_gp.ToolExecuted += new EventHandler<ToolExecutedEventArgs>(_gp_ToolExecuted);
_gp.ProgressChanged += new EventHandler<ESRI.ArcGIS.Geoprocessor.ProgressChangedEventArgs>(_gp_ProgressChanged);
_gp.MessagesCreated += new EventHandler<MessagesCreatedEventArgs>(_gp_MessagesCreated);
_gp.ToolExecuting += new EventHandler<ToolExecutingEventArgs>(_gp_ToolExecuting);

SetupMap();
}

private void btnRunGP_Click(object sender, EventArgs e)
{
try
{

listView1.Items.Clear();

IMapLayers mapLayers = axMapControl1.Map as IMapLayers;
foreach (IFeatureLayer resultLayer in _resultsList)
{
mapLayers.DeleteLayer(resultLayer);
}

axTOCControl1.Update();

_resultsList.Clear();

_myGPToolsToExecute.Clear();

ESRI.ArcGIS.AnalysisTools.Buffer bufferTool = new ESRI.ArcGIS.AnalysisTools.Buffer();
bufferTool.in_features = _layersDict["Cities"];
bufferTool.buffer_distance_or_field = txtBufferDistance.Text + " Miles";
bufferTool.out_feature_class = "city_buffer.shp";

ESRI.ArcGIS.AnalysisTools.Clip clipTool = new ESRI.ArcGIS.AnalysisTools.Clip();
clipTool.in_features = _layersDict["ZipCodes"];
clipTool.clip_features = bufferTool.out_feature_class;
clipTool.out_feature_class = "city_buffer_clip.shp";

_myGPToolsToExecute.Enqueue(bufferTool);
_myGPToolsToExecute.Enqueue(clipTool);
_gp.ExecuteAsync(_myGPToolsToExecute.Dequeue());
}
catch (Exception ex)
{
listView1.Items.Add(new ListViewItem(new string[2] { "N/A", ex.Message }, "error"));
}
}

void _gp_ProgressChanged(object sender, ESRI.ArcGIS.Geoprocessor.ProgressChangedEventArgs e)
{
IGeoProcessorResult2 gpResult = (IGeoProcessorResult2)e.GPResult;

if (e.ProgressChangedType == ProgressChangedType.Message)
{
listView1.Items.Add(new ListViewItem(new string[2] {"ProgressChanged", e.Message}, "information"));
}
}

void _gp_ToolExecuting(object sender, ToolExecutingEventArgs e)
{
IGeoProcessorResult2 gpResult = (IGeoProcessorResult2)e.GPResult;
listView1.Items.Add(new ListViewItem(new string[2] { "ToolExecuting", gpResult.Process.Tool.Name + " " + gpResult.Status.ToString() }, "information"));
}

void _gp_ToolExecuted(object sender, ToolExecutedEventArgs e)
{
IGeoProcessorResult2 gpResult = (IGeoProcessorResult2)e.GPResult;

try
{

if (gpResult.Status == esriJobStatus.esriJobSucceeded)
{
listView1.Items.Add(new ListViewItem(new string[2] { "ToolExecuted", gpResult.Process.Tool.Name }, "success"));

if (_myGPToolsToExecute.Count > 0)
{
_gp.ExecuteAsync(_myGPToolsToExecute.Dequeue());
}

else
{
IFeatureClass resultFClass = _gp.Open(gpResult.ReturnValue) as IFeatureClass;
IFeatureLayer resultLayer = new FeatureLayerClass();
resultLayer.FeatureClass = resultFClass;
resultLayer.Name = resultFClass.AliasName;

axMapControl1.AddLayer((ILayer)resultLayer, 2);
axTOCControl1.Update();

_resultsList.Add(resultLayer);
}
}
else if (gpResult.Status == esriJobStatus.esriJobFailed)
{
listView1.Items.Add(new ListViewItem(new string[2] { "ToolExecuted", gpResult.Process.Tool.Name + " failed, any remaining processes will not be executed." }, "error"));
_myGPToolsToExecute.Clear();
}
}
catch (Exception ex)
{
listView1.Items.Add(new ListViewItem(new string[2] { "ToolExecuted", ex.Message }, "error"));
}
}

/// <summary>
/// Handles the MessagesCreated event.
/// </summary>
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);
string imageToShow = "information";

switch (msg.Type)
{
case esriGPMessageType.esriGPMessageTypeAbort:
imageToShow = "warning";
break;
case esriGPMessageType.esriGPMessageTypeEmpty:
imageToShow = "information";
break;
case esriGPMessageType.esriGPMessageTypeError:
imageToShow = "error";
break;
case esriGPMessageType.esriGPMessageTypeGDBError:
imageToShow = "error";
break;
case esriGPMessageType.esriGPMessageTypeInformative:
imageToShow = "information";
break;
case esriGPMessageType.esriGPMessageTypeProcessDefinition:
imageToShow = "information";
break;
case esriGPMessageType.esriGPMessageTypeProcessStart:
imageToShow = "information";
break;
case esriGPMessageType.esriGPMessageTypeProcessStop:
imageToShow = "information";
break;
case esriGPMessageType.esriGPMessageTypeWarning:
imageToShow = "warning";
break;
default:
break;
}

listView1.Items.Add(new ListViewItem(new string[2]{"MessagesCreated", msg.Description}, imageToShow));
}
}
}

#region Helper methods for setting up map and layers and validating buffer distance input

/// <summary>
/// Loads and symbolizes data used by the application. Selects a city and zooms to it
/// </summary>
private void SetupMap()
{
try
{
//Relative path to the sample data from EXE location
string dirPath = @"..\..\..\..\..\data\USZipCodeData";

//Create the cities layer
IFeatureClass cities = _gp.Open(dirPath + @"\ZipCode_Boundaries_US_Major_Cities.shp") as IFeatureClass;
IFeatureLayer citiesLayer = new FeatureLayerClass();
citiesLayer.FeatureClass = cities;
citiesLayer.Name = "Major Cities";

//Create he zip code boundaries layer
IFeatureClass zipBndrys = _gp.Open(dirPath + @"\US_ZipCodes.shp") as IFeatureClass;
IFeatureLayer zipBndrysLayer = new FeatureLayerClass();
zipBndrysLayer.FeatureClass = zipBndrys;
zipBndrysLayer.Name = "Zip Code boundaries";

//Create the highways layer
dirPath = @"..\..\..\..\..\data\USAMajorHighways";
IFeatureClass highways = _gp.Open(dirPath + @"\usa_major_highways.shp") as IFeatureClass;
IFeatureLayer highwaysLayer = new FeatureLayerClass();
highwaysLayer.FeatureClass = highways;
highwaysLayer.Name = "Highways";

//***** Important code *********
//Add the layers to a dictionary. Layers can then easily be returned by their ‘key‘
_layersDict.Add("ZipCodes", zipBndrysLayer);
_layersDict.Add("Highways", highwaysLayer);
_layersDict.Add("Cities", citiesLayer);

#region Symbolize and set additional properties for each layer
//Setup and symbolize the cities layer
citiesLayer.Selectable = true;
citiesLayer.ShowTips = true;
ISimpleMarkerSymbol markerSym = CreateSimpleMarkerSymbol(CreateRGBColor(0, 92, 230), esriSimpleMarkerStyle.esriSMSCircle);
markerSym.Size = 9;
ISimpleRenderer simpleRend = new SimpleRendererClass();
simpleRend.Symbol = (ISymbol)markerSym;
((IGeoFeatureLayer)citiesLayer).Renderer = (IFeatureRenderer)simpleRend;

//Setup and symbolize the zip boundaries layer
zipBndrysLayer.Selectable = false;
ISimpleFillSymbol fillSym = CreateSimpleFillSymbol(CreateRGBColor(0, 0, 0), esriSimpleFillStyle.esriSFSHollow, CreateRGBColor(204, 204, 204), esriSimpleLineStyle.esriSLSSolid, 0.5);
ISimpleRenderer simpleRend2 = new SimpleRendererClass();
simpleRend2.Symbol = (ISymbol)fillSym;
((IGeoFeatureLayer)zipBndrysLayer).Renderer = (IFeatureRenderer)simpleRend2;

//Setup and symbolize the highways layer
highwaysLayer.Selectable = false;
ISimpleLineSymbol lineSym = CreateSimpleLineSymbol(CreateRGBColor(250, 52, 17), 3.4, esriSimpleLineStyle.esriSLSSolid);
ISimpleRenderer simpleRend3 = new SimpleRendererClass();
simpleRend3.Symbol = (ISymbol)lineSym;
((IGeoFeatureLayer)highwaysLayer).Renderer = (IFeatureRenderer)simpleRend3;
#endregion

//Add the layers to the Map
foreach (IFeatureLayer layer in _layersDict.Values)
{
axMapControl1.AddLayer((ILayer)layer);
}

#region select city and set map extent
//Select and zoom in on Los Angeles city
IQueryFilter qf = new QueryFilterClass();
qf.WhereClause = "NAME=‘Los Angeles‘";
IFeatureSelection citiesLayerSelection = (IFeatureSelection)citiesLayer;
citiesLayerSelection.SelectFeatures(qf, esriSelectionResultEnum.esriSelectionResultNew, true);
IFeature laFeature = cities.GetFeature(citiesLayerSelection.SelectionSet.IDs.Next());
IEnvelope env = laFeature.Shape.Envelope;
env.Expand(0.5, 0.5, false);
axMapControl1.Extent = env;
axMapControl1.Refresh();
axTOCControl1.Update();
#endregion

//Enable GP analysis button
btnRunGP.Enabled = true;
}
catch (Exception ex)
{
MessageBox.Show("There was an error loading the data used by this sample: " + ex.Message);
}
}

#region"Create Simple Fill Symbol"
// ArcGIS Snippet Title:
// Create Simple Fill Symbol
//
// Long Description:
// Create a simple fill symbol by specifying a color, outline color and fill style.
//
// Add the following references to the project:
// ESRI.ArcGIS.Display
// ESRI.ArcGIS.System
//
// Intended ArcGIS Products for this snippet:
// ArcGIS Desktop (ArcEditor, ArcInfo, ArcView)
// ArcGIS Engine
// ArcGIS Server
//
// Applicable ArcGIS Product Versions:
// 9.2
// 9.3
// 9.3.1
// 10.0
//
// Required ArcGIS Extensions:
// (NONE)
//
// Notes:
// This snippet is intended to be inserted at the base level of a Class.
// It is not intended to be nested within an existing Method.
//

///<summary>Create a simple fill symbol by specifying a color, outline color and fill style.</summary>
///
///<param name="fillColor">An IRGBColor interface. The color for the inside of the fill symbol.</param>
///<param name="fillStyle">An esriSimpleLineStyle enumeration for the inside fill symbol. Example: esriSFSSolid.</param>
///<param name="borderColor">An IRGBColor interface. The color for the outside line border of the fill symbol.</param>
///<param name="borderStyle">An esriSimpleLineStyle enumeration for the outside line border. Example: esriSLSSolid.</param>
///<param name="borderWidth">A System.Double that is the width of the outside line border in points. Example: 2</param>
///
///<returns>An ISimpleFillSymbol interface.</returns>
///
///<remarks></remarks>
public ESRI.ArcGIS.Display.ISimpleFillSymbol CreateSimpleFillSymbol(ESRI.ArcGIS.Display.IRgbColor fillColor, ESRI.ArcGIS.Display.esriSimpleFillStyle fillStyle, ESRI.ArcGIS.Display.IRgbColor borderColor, ESRI.ArcGIS.Display.esriSimpleLineStyle borderStyle, System.Double borderWidth)
{

ESRI.ArcGIS.Display.ISimpleLineSymbol simpleLineSymbol = new ESRI.ArcGIS.Display.SimpleLineSymbolClass();
simpleLineSymbol.Width = borderWidth;
simpleLineSymbol.Color = borderColor;
simpleLineSymbol.Style = borderStyle;

ESRI.ArcGIS.Display.ISimpleFillSymbol simpleFillSymbol = new ESRI.ArcGIS.Display.SimpleFillSymbolClass();
simpleFillSymbol.Outline = simpleLineSymbol;
simpleFillSymbol.Style = fillStyle;
simpleFillSymbol.Color = fillColor;

return simpleFillSymbol;
}
#endregion

#region"Create Simple Line Symbol"
// ArcGIS Snippet Title:
// Create Simple Line Symbol
//
// Long Description:
// Create a simple line symbol by specifying a color, width and line style.
//
// Add the following references to the project:
// ESRI.ArcGIS.Display
// ESRI.ArcGIS.System
//
// Intended ArcGIS Products for this snippet:
// ArcGIS Desktop (ArcEditor, ArcInfo, ArcView)
// ArcGIS Engine
// ArcGIS Server
//
// Applicable ArcGIS Product Versions:
// 9.2
// 9.3
// 9.3.1
// 10.0
//
// Required ArcGIS Extensions:
// (NONE)
//
// Notes:
// This snippet is intended to be inserted at the base level of a Class.
// It is not intended to be nested within an existing Method.
//

///<summary>Create a simple line symbol by specifying a color, width and line style.</summary>
///
///<param name="rgbColor">An IRGBColor interface.</param>
///<param name="inWidth">A System.Double that is the width of the line symbol in points. Example: 2</param>
///<param name="inStyle">An esriSimpleLineStyle enumeration. Example: esriSLSSolid.</param>
///
///<returns>An ISimpleLineSymbol interface.</returns>
///
///<remarks></remarks>
public ESRI.ArcGIS.Display.ISimpleLineSymbol CreateSimpleLineSymbol(ESRI.ArcGIS.Display.IRgbColor rgbColor, System.Double inWidth, ESRI.ArcGIS.Display.esriSimpleLineStyle inStyle)
{
if (rgbColor == null)
{
return null;
}

ESRI.ArcGIS.Display.ISimpleLineSymbol simpleLineSymbol = new ESRI.ArcGIS.Display.SimpleLineSymbolClass();
simpleLineSymbol.Style = inStyle;
simpleLineSymbol.Color = rgbColor;
simpleLineSymbol.Width = inWidth;

return simpleLineSymbol;
}
#endregion

#region"Create Simple Marker Symbol"
// ArcGIS Snippet Title:
// Create Simple Marker Symbol
//
// Long Description:
// Create a simple marker symbol by specifying and input color and marker style.
//
// Add the following references to the project:
// ESRI.ArcGIS.Display
// ESRI.ArcGIS.System
//
// Intended ArcGIS Products for this snippet:
// ArcGIS Desktop (ArcEditor, ArcInfo, ArcView)
// ArcGIS Engine
// ArcGIS Server
//
// Applicable ArcGIS Product Versions:
// 9.2
// 9.3
// 9.3.1
// 10.0
//
// Required ArcGIS Extensions:
// (NONE)
//
// Notes:
// This snippet is intended to be inserted at the base level of a Class.
// It is not intended to be nested within an existing Method.
//

///<summary>Create a simple marker symbol by specifying and input color and marker style.</summary>
///
///<param name="rgbColor">An IRGBColor interface.</param>
///<param name="inputStyle">An esriSimpleMarkerStyle enumeration. Example: esriSMSCircle.</param>
///
///<returns>An ISimpleMarkerSymbol interface.</returns>
///
///<remarks></remarks>
public ESRI.ArcGIS.Display.ISimpleMarkerSymbol CreateSimpleMarkerSymbol(ESRI.ArcGIS.Display.IRgbColor rgbColor, ESRI.ArcGIS.Display.esriSimpleMarkerStyle inputStyle)
{

ESRI.ArcGIS.Display.ISimpleMarkerSymbol simpleMarkerSymbol = new ESRI.ArcGIS.Display.SimpleMarkerSymbolClass();
simpleMarkerSymbol.Color = rgbColor;
simpleMarkerSymbol.Style = inputStyle;

return simpleMarkerSymbol;
}
#endregion

#region"Create RGBColor"
// ArcGIS Snippet Title:
// Create RGBColor
//
// Long Description:
// Generate an RgbColor by specifying the amount of Red, Green and Blue.
//
// Add the following references to the project:
// ESRI.ArcGIS.Display
// ESRI.ArcGIS.System
//
// Intended ArcGIS Products for this snippet:
// ArcGIS Desktop (ArcEditor, ArcInfo, ArcView)
// ArcGIS Engine
// ArcGIS Server
//
// Applicable ArcGIS Product Versions:
// 9.2
// 9.3
// 9.3.1
// 10.0
//
// Required ArcGIS Extensions:
// (NONE)
//
// Notes:
// This snippet is intended to be inserted at the base level of a Class.
// It is not intended to be nested within an existing Method.
//

///<summary>Generate an RgbColor by specifying the amount of Red, Green and Blue.</summary>
///
///<param name="myRed">A byte (0 to 255) used to represent the Red color. Example: 0</param>
///<param name="myGreen">A byte (0 to 255) used to represent the Green color. Example: 255</param>
///<param name="myBlue">A byte (0 to 255) used to represent the Blue color. Example: 123</param>
///
///<returns>An IRgbColor interface</returns>
///
///<remarks></remarks>
public ESRI.ArcGIS.Display.IRgbColor CreateRGBColor(System.Byte myRed, System.Byte myGreen, System.Byte myBlue)
{
ESRI.ArcGIS.Display.IRgbColor rgbColor = new ESRI.ArcGIS.Display.RgbColorClass();
rgbColor.Red = myRed;
rgbColor.Green = myGreen;
rgbColor.Blue = myBlue;
rgbColor.UseWindowsDithering = true;
return rgbColor;
}
#endregion

private void txtBufferDistance_TextChanged(object sender, EventArgs e)
{

string txtToCheck = txtBufferDistance.Text;

if (((IsDecimal(txtToCheck)) | (IsInteger(txtToCheck))) && (txtToCheck != "0"))
{
btnRunGP.Enabled = true;
}
else
{
btnRunGP.Enabled = false;
}
}

private bool IsDecimal(string theValue)
{
try
{
Convert.ToDouble(theValue);
return true;
}
catch
{
return false;
}
} //IsDecimal

private bool IsInteger(string theValue)
{
try
{
Convert.ToInt32(theValue);
return true;
}
catch
{
return false;
}
} //IsInteger

#endregion

}
}

时间: 2024-10-24 08:59:38

AE开发示例之RunGPAsync的相关文章

[转]Net Framework引路蜂地图开发示例

From:http://www.2cto.com/kf/201207/140421.html 引路蜂地图也提供对.Net Framework平台的支持,可以开发桌面地图应用,由于Mono C#的跨平台特性,使用Visual Studio 和Mono引路蜂地图开发包开发的地图应用可以运行于Windows ,Lunix,Unix,Mac OS等平台.开发桌面应用比开发移动应用要容易的多,屏幕,内存等方面都比移动平台要宽裕的多.下面使用一个简单的应用来介绍一下.Net Framework引路蜂地图开发

AE开发 入门教程

AE开发 入门教程 此过程说明适合那些使用.NET建立和部署应用的开发者,它描述了使用ArcGIS控件建立和部署应用的方法和步骤. 你可以在下面的目录下找到相应的样例程序: <安装目录>/DeveloperKit/Samples/Developer_Guide_Scenarios/ ArcGIS_Engine/Building_an_ArcGIS_Control_Application/Map_Viewer 注:ArcGIS样例程序不包含在ArcGIS Engine开发工具包“典型”安装方式中

AE开发关于OnMapReplaced方法的使用原理

The OnMapReplaced event is triggered whenever the IMapControl2::Map is replaced by another map, such as when the IMapControl2::LoadMxFile method is used or when the map property is explicitly replaced. Use this event to keep in synch with the current

Spring+Mybatis开发示例

写下来留个纪念(^~^)大神可飘过 1,实现Spring+Mybatis+数据源的配置 2,实现枚举到数据库TINYINT类型的转换 3,slf4j日志配置方法 4,数据库增+删+改+查操作 5,实现效果界面+项目配置目录树       6,关键代码: a)控制器 package com.fresh.lyh.simple.controller; import com.fresh.lyh.simple.model.Simple; import com.fresh.lyh.simple.model.

SharePoint 2013 工作流之Visual Studio开发示例篇

原文:SharePoint 2013 工作流之Visual Studio开发示例篇 SharePoint 2013引用了WF4.0 Foundation,支持使用Designer和Visio进行设计,但是功能受限,而Visual Studio可以开发功能更加丰富的工作流,下面我们简单举个例子. 1.本例使用的是VS 2013版本,新建一个SharePoint空项目: 2.部署为服务器场解决方案,如下图: 3.添加新项,选择工作流模板,如下图: 4.本例选择列表工作流,当然你按照自己的需要选择:

NPAPI火狐插件VS2013开发示例

NPAPI火狐插件VS2013开发示例 下面是我根据网上开发示例自己做的一个demo,并提供代码下载. 开发环境 Windows 8.1 x64 Visual studio 2013 准备工作 首先需要从官网下载火狐源码(也可以下载其它版本),里面有开发插件所需要的头文件. 官网下载地址:,http://download.cdn.mozilla.net/pub/mozilla.org/firefox/releases/33.0/source/firefox-33.0.source.tar.bz2

pyqt开发教程-搭建环境和开发示例

搭建环境和开发示例 * 安装 安装包 要对应python的版本 32位安装包(我PC上) http://jaist.dl.sourceforge.net/project/pyqt/PyQt4/PyQt-4.11.2/PyQt4-4.11.2-gpl-Py2.7-Qt4.8.6-x32.exe 或 64位安装包 http://jaist.dl.sourceforge.net/project/pyqt/PyQt4/PyQt-4.11.2/PyQt4-4.11.2-gpl-Py2.7-Qt4.8.6-

AE开发服务没打开出现的错误

AE开发服务没有打开爆出错误: 总结:依赖项,主要是ARCGIS相关控件.

iStylePDF c#集成开发示例

iStylePDF安装包自带了ActiveX控件,下载安装包安装之后就可以使用,如果没有安装包请到360软件管家或者腾讯软件管家搜索下载.C#的Form中集成ActiveX控件还是非常简单的,选择添加COM组件,查看iStylePDFclass控件.拖入到Form中即可. iStylePDF提供了丰富的接口来控制PDF的显示,接口的调用也是非常的简单,类似VBA模式,只需要点点点即可.比如隐藏菜单条.代码如下: 整体调用结果如下: 菜单栏和工具栏的控制代码如下: 如需要更多示例源代码,请咨询QQ