ArcGIS - Engine二次开发 - 提高篇 - 图文(3)

2019-03-29 09:06

ArcGIS Engine高级功能开发

名空间来定义Geoprocessor,然后设置Geoprocessor中的环境参数,这里我们使用默认参数。

然后定义一个操作类Buffer,并设置参数,生成缓冲区的参数包含原始图层,缓冲半径和输出路径,最后使用已定义的Geoprocessor对象执行即可。双击“生成缓存区”按钮,添加代码如下:

private void btnBuffer_Click(object sender, EventArgs e) {

//判断MapControl中是否包含图层 if (this.axMapControl1.LayerCount == 0) return;

//获取MapControl中第一个图层

ILayer pLayer = this.axMapControl1.Map.get_Layer(0); //输出路径,可以自行指定

string strOutputPath = @\; //缓冲半径

double dblDistace = 1.0;

//获取一个geoprocessor的实例,避免与命名空间Geoprocessing中的Geoprocessor发生引用错误

ESRI.ArcGIS.Geoprocessor.Geoprocessor gp = new ESRI.ArcGIS.Geoprocessor.Geoprocessor();

//OverwriteOutput为真时,输出图层会覆盖当前文件夹下的同名图层 gp.OverwriteOutput = true; //创建一个Buffer工具的实例

ESRI.ArcGIS.AnalysisTools.Buffer buffer = new ESRI.ArcGIS.AnalysisTools.Buffer(pLayer, strOutputPath, dblDistace); //执行缓冲区分析

IGeoProcessorResult results = null;

results = gp.Execute(buffer, null) as IGeoProcessorResult;

//判断缓冲区是否成功生成

if (results.Status != esriJobStatus.esriJobSucceeded)

MessageBox.Show(\图层\ + pLayer.Name + \缓冲区生成失败!\); else {

MessageBox.Show(\缓冲区生成成功!\); //将生成图层加入MapControl

int index = strOutputPath.LastIndexOf(\);

this.axMapControl1.AddShapeFile(strOutputPath.Substring(0, index), strOutputPath.Substring(index)); } }

运行程序,添加一个图层(多个图层时本例中默认选择的图层为第一个图层),点击“生

ArcGIS Engine高级功能开发

成缓冲区”,运行结果如图。

图 9缓冲区生成效果

2.1.3 小结

本例中,我们使用Geoprocessor工具实现了缓冲区分析。从中我们可以得到Geoprocessor工具使用的一般方法,在使用Geoprocessor时,一般需先定义一个Geoprocessor对象,然后设置该对象的参数,如本例中的OverwriteOutput,再定义一个具体的操作类,如本例中的Buffer类,在设置完操作类的参数后,则通过Geoprocessor的Excute函数来执行。至此,我们已经实现了一个简单的缓冲区分析的功能,从中我们学习了Geoprocessor的使用方法。

下一节我们讲对缓冲区份分析功能做进一步的改进,使其具有更强的适用性,并将这个功能添加到MyGIS中。

2.2 MyGIS中添加缓冲区分析

我们在使用缓冲区分析时,需要设定原始的图层,缓冲半径以及生成缓冲区的保存路径。本节我们将在上一节的基础上进一步实现缓冲区分析,实现缓冲图层,缓冲半径和保存路径的可选设置。

2.2.1 添加控件

打开项目MyGIS,在MyGIS的主菜单添加一个新的菜单项“空间分析”,并添加子菜单“缓冲区分析”,Name属性修改为“menuBuffer”。

项目中添加一个新的窗体,名称为“BufferForm”,Name属性设为“缓冲区分析”,添加四个Label、一个ComboBox、两个TextBox、三个Button控件,控件属性设置如下:

表 1控件属性设置

控件类型

Name属性 Text属性 控件说明 ArcGIS Engine高级功能开发

Label Label Label Label lblUnit 选择图层: 缓冲半径: 地图单位 标示当前地图的地图单位 输出图层: ComboBox cboLayers 所有图层的名称 TextBox txtBufferDistance 1.0 生成缓冲区的缓冲半径 TextBox Button Button Button

txtOutputPath btnOutputLayer btnBuffer btnCancel … 分析 取消 缓冲区文件的输出路径,其ReadOnly属性设为True 选择缓冲区文件的输出路径 进行缓冲区分析 取消 2.2.2 代码添加及解释

该项目需添加如下引用:

using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.Geoprocessor; using ESRI.ArcGIS.Carto;

using ESRI.ArcGIS.Geoprocessing; using ESRI.ArcGIS.esriSystem;

首先声明两个成员变量,用于保存地图数据和输出文件的路径。

//接收MapControl中的数据

private IHookHelper mHookHelper = new HookHelperClass(); //缓冲区文件输出路径 public string strOutputPath;

重写BufferForm的构造函数,添加一个参数,用于接收MapControl中的数据。

//重写构造函数,添加参数hook,用于传入MapControl中的数据 public BufferForm(object hook) {

InitializeComponent();

this.mHookHelper.Hook = hook; }

添加一个自定义函数,用于根据图层名称获取要素图层并返回。

private IFeatureLayer GetFeatureLayer(string layerName) {

IFeatureLayer pFeatureLayer = null; //遍历图层,获取与名称匹配的图层

ArcGIS Engine高级功能开发

for (int i = 0; i < this.mHookHelper.FocusMap.LayerCount; i++) {

ILayer pLayer = this.mHookHelper.FocusMap.get_Layer(i); if (pLayer.Name == layerName) {

pFeatureLayer = pLayer as IFeatureLayer; } }

if (pFeatureLayer != null) return pFeatureLayer; else

return null; }

BufferForm在载入时需要加载当前MapControl中的图层名称到cboLayers,读取当前地图的地图单位,设置缓冲区文件的默认输出路径,这里我们将默认输出路径设为“D:\\Temp\\”。

private void BufferForm_Load(object sender, EventArgs e) {

//传入数据为空时返回

if (null == mHookHelper || null == mHookHelper.Hook || 0 == mHookHelper.FocusMap.LayerCount) return;

//获取图层名称并加入cboLayers

for (int i = 0; i < this.mHookHelper.FocusMap.LayerCount; i++) {

ILayer pLayer = this.mHookHelper.FocusMap.get_Layer(i); cboLayers.Items.Add(pLayer.Name); }

//cboLayers控件中默认显示第一个选项 if (cboLayers.Items.Count > 0) cboLayers.SelectedIndex = 0;

//设置生成文件的默认输出路径和名称 string tempDir = @\;

txtOutputPath.Text = System.IO.Path.Combine(tempDir, ((string)cboLayers.SelectedItem + \));

//设置默认地图单位

lblUnits.Text = Convert.ToString(mHookHelper.FocusMap.MapUnits); }

ArcGIS Engine高级功能开发

双击路径设置按钮,进入代码编辑界面,添加如下代码:

private void btnOutputLayer_Click(object sender, EventArgs e) {

//定义输出文件路径

SaveFileDialog saveDlg = new SaveFileDialog(); //检查路径是否存在

saveDlg.CheckPathExists = true; saveDlg.Filter = \; //保存时覆盖同名文件

saveDlg.OverwritePrompt = true; saveDlg.Title = \输出路径\; //对话框关闭前还原当前目录 saveDlg.RestoreDirectory = true;

saveDlg.FileName = (string)cboLayers.SelectedItem + \;

//读取文件输出路径到txtOutputPath DialogResult dr = saveDlg.ShowDialog(); if (dr == DialogResult.OK)

txtOutputPath.Text = saveDlg.FileName; }

双击“分析”按钮,添加代码如下:

private void btnBuffer_Click(object sender, EventArgs e) {

//缓冲距离

double bufferDistance; //输入的缓冲距离转换为double

double.TryParse(txtBufferDistance.Text.ToString(),out bufferDistance);

//判断输出路径是否合法

if (!System.IO.Directory.Exists(System.IO.Path.GetDirectoryName(txtOutputPath.Text)) || \ != System.IO.Path.GetExtension(txtOutputPath.Text)) {

MessageBox.Show(\输出路径错误!\); return; }

//判断图层个数

if (mHookHelper.FocusMap.LayerCount == 0) return; //获取图层


ArcGIS - Engine二次开发 - 提高篇 - 图文(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:朱寨镇邢庄初级中学管理制度汇编

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: