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; //获取图层