ArcGIS Engine高级功能开发
IFeatureLayer pFeatureLayer = GetFeatureLayer((string)cboLayers.SelectedItem); if (null == pFeatureLayer) {
MessageBox.Show(\图层\ + (string)cboLayers.SelectedItem + \不存在!\\r\\n\); return; }
//获取一个geoprocessor的实例
Geoprocessor gp = new Geoprocessor();
//OverwriteOutput为真时,输出图层会覆盖当前文件夹下的同名图层 gp.OverwriteOutput = true; //缓冲区保存路径
strOutputPath = txtOutputPath.Text; //创建一个Buffer工具的实例
ESRI.ArcGIS.AnalysisTools.Buffer buffer = new
ESRI.ArcGIS.AnalysisTools.Buffer(pFeatureLayer, strOutputPath, bufferDistance.ToString()); //执行缓冲区分析
IGeoProcessorResult results = null;
results = (IGeoProcessorResult)gp.Execute(buffer, null); //判断缓冲区是否成功生成
if (results.Status != esriJobStatus.esriJobSucceeded)
MessageBox.Show(\图层\ + pFeatureLayer.Name + \缓冲区生成失败!\); else {
this.DialogResult = DialogResult.OK; MessageBox.Show(\缓冲区生成成功!\); } }
双击“取消”按钮,添加代码如下:
private void btnCancel_Click(object sender, EventArgs e) {
this.Dispose(); }
进入MyGIS的主窗体,双击菜单中的“缓冲区分析”,添加代码如下:
BufferForm bufferForm = new BufferForm(this.axMapControl1.Object); if (bufferForm.ShowDialog() == DialogResult.OK) {
//获取输出文件路径
string strBufferPath = bufferForm.strOutputPath;
ArcGIS Engine高级功能开发
//缓冲区图层载入到MapControl
int index = strBufferPath.LastIndexOf(\);
this.axMapControl1.AddShapeFile(strBufferPath.Substring(0, index), strBufferPath.Substring(index)); }
至此,代码编辑完成,运行程序,添加数据usa.mxd,选择图层wind,设置缓冲区半径为0.8,点击“分析”,效果如下图所示。
图 10缓冲区分析效果
如果运行过程中出现错误“正试图在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。”,请采用如下方法解决:
把vs2005菜单的 调试->异常->Managed Debuggin Assistants->LoaderLock 的选中状态去掉即可!如果异常(exception)这一项没有的话,在工具---自定义---命令选项卡,选择左边“调试”,找到右边“异常”拖到菜单上。
2.2.3 小结
缓冲区分析是GIS空间分析的基本功能,这一节我们完成了缓冲区分析的功能,实现了缓冲区分析文件、缓冲半径和输出路径的可选设置,希望您仔细体会并掌握Geoprocessor工具开发空间分析功能的基本方法。
ArcGIS Engine高级功能开发
3 叠置分析
叠置分析是GIS中一种常见的分析功能,它是将有关主题层组成的各个数据层面进行叠置产生一个新的数据层面,其结果综合了原来两个或多个层面要素所具有的属性,同时叠置分析不仅生成了新的空间关系,而且还将输入的多个数据层的属性联系起来产生了新的属性关系。
ArcGIS中的叠置分析包含Union(叠置求并)、Intersect(叠置求交)、Identify(叠置标识)、Erase(叠置擦除)、Symmetrical Difference (叠置相交取反)、Update(叠置更新)等。这一小节,我们以叠置求交为例,介绍叠置分析的开发。叠置求交是保留两个图层公共部分的空间图形,并综合两个叠加图层的属性。如下图,反映了叠置求交的原理。
图 11叠置求交示意图
本节实习将介绍这种方法实现缓冲区分析,我们首先使用Geoprocessor方法实现一个简单的缓冲区分析功能,然后将缓冲区分析功能添加到我们的MyGIS项目中。
同样,ArcGIS的ArcToolBox中的分析工具提供了缓冲区分析的功能,本节实习我们首先使用Geoprocessor方法实现一个简单的缓冲区分析功能,然后将缓冲区分析功能添加到我们的MyGIS项目中。
程序运行前首先需要在D盘下新建一个名为Temp的文件夹,存放叠置分析生成的文件。
3.1 Geoprocessor实现叠置分析
叠置分析我们同样使用Geoprocessor工具来实现。
3.1.1 添加控件
新建一个C#.Net项目,项目名称为OverLay,将Form1的名字设置为MainForm,并添加ToolbarControl 、MapControl、TOCControl、LicenceControl和Button等五个控件。并将ToolbarControl 、TOCControl的伙伴控件设为MapControl,Button控件的Name属性设定为btnIntersect,Text属性设定为“叠置求交”。控件布局效果如下图所示。
ArcGIS Engine高级功能开发
图 12控件布局效果
在ToolbarControl 加载添加数据按钮和地图浏览的功能按钮,如下图所示。
图 13添加按钮
3.1.2 代码添加及解释
首先添加如下引用:
using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.AnalysisTools; using ESRI.ArcGIS.Geoprocessor; using ESRI.ArcGIS.Geoprocessing;
ArcGIS Engine高级功能开发
与缓冲区分析的实现类似,在使用Geoprocessor工具实现叠置分析时,需要首先定义一个Geoprocessor对象,因为命名空间“ESRI.ArcGIS.Geoprocessing”也包含Geoprocessor类,为了避免混淆,我们使用命名空间来定义Geoprocessor,然后设置Geoprocessor中的环境参数,这里我们使用默认参数。然后定义一个操作类,这里为Intersect,然后设置其操作参数,这里我们仅设置输入的要素,最后使用已定义的Geoprocessor对象执行即可。双击“生成缓存区”按钮,添加代码如下:
private void btnIntersect_Click(object sender, EventArgs e) {
//添加两个以上图层时才允许叠置 if (this.axMapControl1.LayerCount < 2) return;
ESRI.ArcGIS.Geoprocessor.Geoprocessor gp = new ESRI.ArcGIS.Geoprocessor.Geoprocessor();
//OverwriteOutput为真时,输出图层会覆盖当前文件夹下的同名图层 gp.OverwriteOutput=true;
//创建叠置分析实例
Intersect intersectTool = new Intersect(); //获取MapControl中的前两个图层
ILayer pInputLayer1 = this.axMapControl1.get_Layer(0); ILayer pInputLayer2 = this.axMapControl1.get_Layer(1); //转换为object类型
object inputfeature1 = pInputLayer1; object inputfeature2 = pInputLayer2; //设置参与叠置分析的多个对象
IGpValueTableObject pObject = new GpValueTableObjectClass(); pObject.SetColumns(2);
pObject.AddRow(ref inputfeature1); pObject.AddRow(ref inputfeature2); intersectTool.in_features = pObject; //设置输出路径
string strTempPath = @\;
string strOutputPath = strTempPath + pInputLayer1.Name + \ + pInputLayer2.Name + \;
intersectTool.out_feature_class=strOutputPath; //执行叠置分析
IGeoProcessorResult result = null;
result = gp.Execute(intersectTool, null) as IGeoProcessorResult;
//判断叠置分析是否成功
if (result.Status != ESRI.ArcGIS.esriSystem.esriJobStatus.esriJobSucceeded) MessageBox.Show(\叠置求交失败!\);
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库ArcGIS - Engine二次开发 - 提高篇 - 图文(4)在线全文阅读。
相关推荐: