




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、ArcGIS Engine 二次开发提高篇1缩略图(鹰眼)鹰眼功能是GIS的主要功能之一,当地图范围很大时,它可以很好的为用户指明当前地 图的范围。在本小节中我们将学习如何制作这种鹰眼。1.1添加控件新建一个C#.Net项目,项目名称为 OverView,将Forml的名字设置为 MainForm,并添 加ToolbarControl 、两个 MapControl和LicenceControl等四个控件。布局如下图所示。左边的axMapControl1用于地图数据显示和操作,右边axMapControl2用于鹰眼显示。图1界面布局在ToolbarControl加载添加数据按钮和地图浏览的功能按
2、钮,如下图所示,并将ToolbarCo ntrol的伙伴控件设为 axMapCo ntrol1。图2添加按钮1.2 代码添加及解释鹰眼用来显示主窗体当前视图范围在全景视图中的位置,在 ArcMap 中使用一个线框在 鹰眼视图中标识。 当主视图中的视图范围改变时, 鹰眼中的线框随之改变, 当拖动鹰眼视图 中的红线框时,主视图中的视图范围也随之改变。下 面 开 始 实 现 鹰 眼 功 能 , 添 加 using ESRI.ArcGIS.Carto 、 using ESRI.ArcGIS.Geometry 、 using ESRI.ArcGIS.Display 三个引用。首先在 axMapContr
3、ol1 中视图范围改变时鹰眼窗体 要做出对应的响应,即绘制线框并显示,在 OnExtentUpdated 事件中添加代码如下:private void axMapControl1_OnExtentUpdated( object sender,ESRI.ArcGIS.Controls. IMapControlEvents2_OnExtentUpdatedEvent e)/ 创建鹰眼中线框IEnvelope pEnv = ( IEnvelope )e.newEnvelope;IRectangleElement pRectangleEle = new RectangleElementClass ()
4、;IElement pEle = pRectangleEleas IElement ;pEle.Geometry = pEnv;/ 设置线框的边线对象,包括颜色和线宽IRgbColor pColor = new RgbColorClass ();pColor.Red = 255;pColor.Green = 0;pColor.Blue = 0;pColor.Transparency = 255;/ 产生一个线符号对象ILineSymbol pOutline = new SimpleLineSymbolClass ();pOutline.Width = 2;pOutline.Color = pC
5、olor;/ 设置颜色属性pColor.Red = 255;pColor.Green = 0;pColor.Blue = 0;pColor.Transparency = 0;/ 设置线框填充符号的属性IFillSymbol pFillSymbol = new SimpleFillSymbolClass ();pFillSymbol.Color = pColor;pFillSymbol.Outline = pOutline;IFillShapeElement pFillShapeEle = pEleas IFillShapeElement ;pFillShapeEle.Symbol = pFil
6、lSymbol;/ 得到鹰眼视图中的图形元素容器IGraphicsContainer pGra = axMapControl2.Map as IGraphicsContainer ;IActiveView pAv = pGra as IActiveView ;/ 在绘制前,清除 axMapControl2 中的任何图形元素 pGra.DeleteAllElements();/ 鹰眼视图中添加线框 pGra.AddElement( IElement )pFillShapeEle, 0);/ 刷新鹰眼pAv.PartialRefresh( esriViewDrawPhase .esriViewGr
7、aphics, null , null ); 当鼠标点击鹰眼窗体时,主窗体 Extent 随之改变。在 axMapControl2 的 事件中添加代码如下:private void axMapControl2_OnMouseDown( object sender,ESRI.ArcGIS.Controls. IMapControlEvents2_OnMouseDownEvent e)if ( this .axMapControl2.Map.LayerCount != 0)/ 按下鼠标左键移动矩形框if (e.button = 1)IPoint pPoint = new PointClass ()
8、; pPoint.PutCoords(e.mapX, e.mapY);IEnvelope pEnvelope = this .axMapControl1.Extent; pEnvelope.CenterAt(pPoint);this .axMapControl1.Extent = pEnvelope;this .axMapControl1.ActiveView.PartialRefresh( esriViewDrawPhase .esriViewGeography, null );/ 按下鼠标右键绘制矩形框else if (e.button = 2)IEnvelope pEnvelop = t
9、his .axMapControl2.TrackRectangle();this .axMapControl1.Extent = pEnvelop;this .axMapControl1.ActiveView.PartialRefresh( esriViewDrawPhase .esriViewGeography, null );OnMouseDownnullnullOnMouseMove当鼠标在鹰眼窗体移动时, 主窗体 Extent 随之改变。 在 axMapControl2 的 事件中添加代码如下:private void axMapControl2_OnMouseMove( object
10、 sender,ESRI.ArcGIS.Controls. IMapControlEvents2_OnMouseMoveEvent e)/ 如果不是左键按下就直接返回if (e.button != 1)return ;IPoint pPoint = new PointClass ();pPoint.PutCoords(e.mapX, e.mapY);this .axMapControl1.CenterAt(pPoint);this .axMapControl1.ActiveView.PartialRefresh( esriViewDrawPhase .esriViewGeography, nu
11、ll , null );下面代码用于实现 axMapControl2 与 axMapControl1 的数据的同步更新, 获取主视图中 视图范围最大的图层作为鹰眼中的视图。这个更新由两部分组成,一个是对 axMapControl1 添加地图文档(mxd文件)的响应,通过axMapControll 的OnMapReplace事件实现,一个是对 axMapControl1 添加单个图层的响应,通过 axMapControl1 的 OnFullExtentUpdated 事件实现。我们获取主视图中的视图范围最大的图层写成一个独立的函数,方便调用。private ILayer GetOverviewL
12、ayer( IMap map)/ 获取主视图的第一个图层ILayer pLayer = map.get_Layer(0);/ 遍历其他图层,并比较视图范围的宽度,返回宽度最大的图层ILayer pTempLayer = null ;for ( int i = 1; i map.LayerCount;i+ )pTempLayer = map.get_Layer(i);if (pLayer.AreaOfInterest.Width pTempLayer.AreaOfInterest.Width)pLayer = pTempLayer;return pLayer;然后在 axMapControl1
13、的 OnMapReplaced 事件中调用。private void axMapControl1_OnMapReplaced( object sender, IMapControlEvents2_OnMapReplacedEvent e)/ 获取鹰眼图层this .axMapControl2.AddLayer( this .GetOverviewLayer( this .axMapControl1.Map);/ 设置 MapControl 显示范围至数据的全局范围this .axMapControl2.Extent = this .axMapControl1.FullExtent;/ 刷新鹰眼
14、控件地图this .axMapControl2.Refresh();在axMapControll的OnFullExtentUpdated添加代码,用于实现在主视图添加图层时,实现对鹰眼视图的更新。代码如下:private void axMapControl1_OnFullExtentUpdated( object sender,ESRI.ArcGIS.Controls. IMapControlEvents2_OnFullExtentUpdatedEvent e)/获取鹰眼图层 this .axMapControl2.AddLayer( this .GetOverviewLayer( this
15、.axMapControl1.Map);/设置MapControl显示范围至数据的全局范围this .axMapControl2.Extent = this .axMapControl1.FullExtent;/刷新鹰眼控件地图 this .axMapControl2.Refresh();本例的示例数据无特别要求,使用前面章节实例数据即可。运行程序,添加地图数据, 可以在主视图进行相关操作,鹰眼视图同步响应, 在鹰眼视图可以移动红线框可以同步更新主视图的视图范围,在鹰眼视图单击右键拉框可以重新绘制红线框,效果如下:图3鹰眼效果1.3 MyGIS中添加鹰眼在上一讲中的最后一节,我们创建了一个简单
16、的GIS系统MyGIS这里,我们讲鹰眼功能嵌入到我们的系统中。在这里我们对实现的思路做一个介绍,请您自己动手完善MyGIS首先需要修改一下 MyGIS窗体的控件布局,我们讲鹰眼视图放到图层管理器的下方,需要在控件容器SpliterC on tai ner1的Pa nel1中添加一个水平分隔的SpliterCo ntai ner,然 后将图层管理器空间 TOCControl和鹰眼视图MapControl分别置于上下的容器中,并将其属 性Dock分别设为Fill 。另外,在此种窗体布局情况下,直接在 TOCControl控件属性中设置伙伴控件无效,如 图所示。我们需要在 MainForm的Load
17、事件中为TOCControl设置伙伴控件为 axMapControll 添加代码如下:private void Form1_Load( object sender, EventArgs e)/设置axTOCControl1的伙伴控件this .axTOCControl1.SetBuddyControl(axMapControl1.Object);图4 TOCControl控件属性中设置伙伴控件然后依次添加本例中的代码,即可完成,运行效果如下图所示:十斗 IP Fl c-iii:CtJ 叫甥 *-i 钠 rtind图5 MyGIS中鹰眼的运行效果1.4小结在本小节中,我们实现了鹰眼功能并讲鹰眼加
18、入了MyGIS,这部分的重点是鹰眼视图和主视图之间的事件交互。推荐您仔细结合例子程序查看代码,如果需要获得进一步的信息, 请查看帮助系统。如果您对这一小节的内容比较熟悉了,就可以开始学习本章最后一小节的内容了。在下一小节中,我们将尝试添加缓冲区分析功能。2缓冲区分析缓冲区分析指为了识别某一地理实体或空间物体对其周围地物影响度而在其周围建立 的具有一定宽度的区域,以确定哪些实体落在了被影响的区域范围之内。缓冲区分析与缓冲区查询不同, 缓冲区查询是不破坏原有空间目标的关系,只是检索到该缓冲区范围内涉及到的目标。 而缓冲区分析是根据设定的距离条件对一类地物建立缓冲区 多边形,存储到一个新的图层中。
19、然后再将新的图层与需要进行缓冲区分析的图层进行叠置 分析,得到所需要的结果。因此,缓冲区分析实际上进行了两步的操作,第一步是建立缓冲 区图层,第二步是进行叠置剪裁分析。缓冲区分析适用于点、线、面对象,女口点状的居民点、线状的河流和面状的作物分布区等,只要地理实体能对周围一定区域形成影响即可使用这种分析方法。ArcGIS的ArcToolBox中的分析工具提供了缓冲区分析的功能,本节实习我们首先使用Geoprocessor方法实现一个简单的缓冲区分析功能,然后将缓冲区分析功能添加到我们的 MyGIS项目中。程序运行前首先需要在D盘下新建一个名为 Temp的文件夹,存放叠置分析生成的文件。2.1 G
20、eoprocessor实现缓冲区分析为了降低开发难度和提高开发效率,ArcGIS Engine中添加了 GeoProcessor类,使用Geoprocessor能帮助用户直接实现一些简单的工具性的功能,所有在ArcToolBox中的功能,基本都可以用 Geoprocessor编程实现。本节我们使用 Geoprocessor实现缓冲区分析的功能。2.1.1 添加控件新建一个C#.Net项目,项目名称为Buffer ,将Form1的名字设置为 MainForm,并添加 ToolbarControl 、MapControl、TOCControl、LicenceControl 和 Button 等五个
21、控件。并 将 ToolbarControl 、TOCControl 的伙伴控件设为 MapControl,Button 控件的 Name属性设 定为btnBuffer ,Text属性设定为“缓冲区分析”。控件布局效果如下图所示。图7控件布局效果在ToolbarControl加载添加数据按钮和地图浏览的功能按钮,如下图所示。图8添加按钮2.1.2代码添加及解释首先添加如下四个命名空间的引用。us ing ESRI.ArcGIS.Carto;using ESRI.ArcGIS.Geoprocessor;using ESRI.ArcGIS.Geoprocess ing;us ing ESRI.Arc
22、GIS.esriSystem;在使用Geoprocessor工具实现缓冲区分析时,需要首先定义一个Geoprocessor对象,因为命名空间ESRI.ArcGIS.Geoprocessing 也包含Geoprocessor类,为了避免混淆,我们使用命名 空间来定义 Geoprocessor ,然后设置 Geoprocessor 中的环境参数, 这里我们使用默认参数。 然 后定义一个操作类 Buffer ,并设置参数,生成缓冲区的参数包含原始图层,缓冲半径和输 出路径,最后使用已定义的 Geoprocessor 对象执行即可。双击“生成缓存区”按钮,添加 代码如下:private void bt
23、nBuffer_Click( object sender, EventArgs e)/ 判断 MapControl 中是否包含图层if ( this .axMapControl1.LayerCount = 0)return ;/ 获取 MapControl 中第一个图层ILayer pLayer = this .axMapControl1.Map.get_Layer(0);/ 输出路径 , 可以自行指定string strOutputPath = D:Buffer.shp ;/ 缓冲半径double dblDistace = 1.0;/ 获取一个 geoprocessor 的实例 , 避免与命
24、名空间 Geoprocessing 中的 Geoprocessor 发生引用 错误ESRI.ArcGIS.Geoprocessor. Geoprocessor gp = new ESRI.ArcGIS.Geoprocessor. Geoprocessor ();/OverwriteOutput 为真时,输出图层会覆盖当前文件夹下的同名图层 gp.OverwriteOutput = true ;/ 创建一个 Buffer 工具的实例ESRI.ArcGIS.AnalysisTools. Buffer buffer = newESRI.ArcGIS.AnalysisTools. Buffer (pL
25、ayer, strOutputPath, dblDistace);/ 执行缓冲区分析IGeoProcessorResult results = null ;results = gp.Execute(buffer,null ) as IGeoProcessorResult ;/ 判断缓冲区是否成功生成if (results.Status !=esriJobStatus .esriJobSucceeded)MessageBox.Show( 图层 + pLayer.Name + 缓冲区生成失败! ); elseMessageBox.Show( 缓冲区生成成功! );/ 将生成图层加入 MapCont
26、rolint index = strOutputPath.LastIndexOf( );this .axMapControl1.AddShapeFile(strOutputPath.Substring(0, index), strOutputPath.Substring(index);,点击“生运行程序, 添加一个图层 (多个图层时本例中默认选择的图层为第一个图层)成缓冲区”,运行结果如图。图9缓冲区生成效果2.1.3小结本例中,我们使用Geoprocessor工具实现了缓冲区分析。从中我们可以得到 Geoprocessor 工具 使用的 一般方法,在使用 Geoprocessor 时,一般需
27、先 定义一个 Geoprocessor对象,然后设置该对象的参数,如本例中的 OverwriteOutput ,再定义一个具体的操作类,如本例中的Buffer类,在设置完操作类的参数后,则通过Geoprocessor的Excute函数来执行。至此,我们已经实现了一个简单的缓冲区分析的功能,从中我们学习 了 Geoprocessor 的使用方法。下一节我们讲对缓冲区份分析功能做进一步的改进,使其具有更强的适用性,并将这个功能添加到MyGIS中。2.2 MyGIS中添加缓冲区分析我们在使用缓冲区分析时,需要设定原始的图层,缓冲半径以及生成缓冲区的保存路径。本节我们将在上一节的基础上进一步实现缓冲区
28、分析,实现缓冲图层,缓冲半径和保存路径的可选设置。2.2.1 添加控件打开项目MyGIS在MyGIS的主菜单添加一个新的菜单项“空间分析” ,并添加子菜单 缓冲区分析”,Name属性修改为“ menuBuffer ”。项目中添加一个新的窗体,名称为“BufferForm ”,Name属性设为“缓冲区分析”,添加四个Label、一个 ComboBox两个 TextBox、三个Butt on控件,控件属性设置如下:表1控件属性设置控件类型Name属性Text属性控件说明Label选择图层:Label缓冲半径:LabellblU nit地图单位十标示当前地图的地图单位Label输出图层:ComboB
29、oxcboLayers所有图层的名称TextBoxtxtBufferDista nee1.0生成缓冲区的缓冲半径TextBoxtxtOutputPath缓冲区文件的输出路径,其ReadOnly属性设为TrueButtonbtnO utputLayer选择缓冲区文件的输出路径Buttonbtn Buffer分析进行缓冲区分析ButtonbtnCancel取消取消222代码添加及解释该项目需添加如下引用:using ESRI.ArcGIS.Controls;using ESRI.ArcGIS.Geoprocessor;using ESRI.ArcGIS.Carto;using ESRI.ArcGI
30、S.Geoprocessing;using ESRI.ArcGIS.esriSystem;首先声明两个成员变量,用于保存地图数据和输出文件的路径。/接收MapControl中的数据private IHookHelper mHookHelper = new HookHelperClass ();/缓冲区文件输岀路径public string strOutputPath;重写BufferForm的构造函数,添加一个参数,用于接收MapControl中的数据。/重写构造函数,添加参数 hook,用于传入MapControl中的数据public BufferForm( object hook)lnit
31、ializeComponent();this .mHookHelper.Hook = hook;添加一个自定义函数,用于根据图层名称获取要素图层并返回。private IFeatureLayer GetFeatureLayer( string layerName) IFeatureLayer pFeatureLayer = null / 遍历图层,获取与名称匹配的图层for ( int i = 0; i this .mHookHelper.FocusMap.LayerCount; i+)ILayer pLayer = this .mHookHelper.FocusMap.get_Layer(i
32、); if (pLayer.Name = layerName) pFeatureLayer = pLayeras IFeatureLayer ; if (pFeatureLayer != null ) return pFeatureLayer;else return null ;BufferForm 在载入时需要加载当前 MapControl 中的图层名称到 cboLayers ,读取当前 地图的地图单位,设置缓冲区文件的默认输出路径, 这里我们将默认输出路径设为a”“”。private void BufferForm_Load( object sender, EventArgs e)/ 传入
33、数据为空时返回if ( null = mHookHelper | null = mHookHelper.Hook | 0 = mHookHelper.FocusMap.LayerCount)return ;/ 获取图层名称并加入 cboLayersfor ( int i = 0; i 0) cboLayers.SelectedIndex = 0;/ 设置生成文件的默认输出路径和名称 string tempDir = D:Temp ;txtOutputPath.Text = System.IO.Path .Combine(tempDir,( string )cboLayers.SelectedI
34、tem + _buffer.shp );/ 设置默认地图单位lblUnits.Text = Convert .ToString(mHookHelper.FocusMap.MapUnits); 双击路径设置按钮,进入代码编辑界面,添加如下代码:private void btnOutputLayer_Click( object sender, EventArgs e) / 定义输出文件路径SaveFileDialog saveDlg = new SaveFileDialog ();/ 检查路径是否存在 saveDlg.CheckPathExists = true ; saveDlg.Filter
35、=Shapefile (*.shp)|*.shp ;/ 保存时覆盖同名文件 saveDlg.OverwritePrompt = true ; saveDlg.Title = 输出路径 ;/ 对话框关闭前还原当前目录 saveDlg.RestoreDirectory = true ; saveDlg.FileName = (string )cboLayers.SelectedItem + _buffer.shp ;/ 读取文件输出路径到 txtOutputPathDialogResult dr = saveDlg.ShowDialog();if (dr = DialogResult .OK) t
36、xtOutputPath.Text = saveDlg.FileName;双击“分析”按钮,添加代码如下:private void btnBuffer_Click( object sender, EventArgs e) / 缓冲距离double bufferDistance;/ 输入的缓冲距离转换为 doubledouble .TryParse(txtBufferDistance.Text.ToString(), out bufferDistance);/ 判断输出路径是否合法if(!System.IO. Directory .Exists(System.IO. Path .GetDirec
37、toryName(txtOutputPath.Text) | .shp != System.IO. Path .GetExtension(txtOutputPath.Text) MessageBox.Show( 输出路径错误 ! ); return ;/ 判断图层个数if (mHookHelper.FocusMap.LayerCount = 0)return ;/ 获取图层IFeatureLayer pFeatureLayer = GetFeatureLayer( string )cboLayers.SelectedItem); if ( null = pFeatureLayer)Messag
38、eBox.Show( 图层 + ( string )cboLayers.SelectedItem + 不存在 !rn );return ;/ 获取一个 geoprocessor 的实例 Geoprocessor gp = new Geoprocessor ();/OverwriteOutput 为真时,输出图层会覆盖当前文件夹下的同名图层 gp.OverwriteOutput =true ;/ 缓冲区保存路径 strOutputPath = txtOutputPath.Text;/ 创建一个 Buffer 工具的实例 ESRI.ArcGIS.AnalysisTools. Buffer buff
39、er = newESRI.ArcGIS.AnalysisTools. Buffer (pFeatureLayer, strOutputPath, bufferDistance.ToString(); / 执行缓冲区分析IGeoProcessorResult results = null ; results = ( IGeoProcessorResult )gp.Execute(buffer, null );/ 判断缓冲区是否成功生成if (results.Status != esriJobStatus .esriJobSucceeded) MessageBox.Show( 图层 + pFeat
40、ureLayer.Name + 缓冲区生成失败! );else this .DialogResult = DialogResult .OK; MessageBox.Show( 缓冲区生成成功! );双击“取消”按钮,添加代码如下:private void btnCancel_Click( object sender, EventArgs e) this .Dispose();,添加代码如下:进入MyGIS的主窗体,双击菜单中的“缓冲区分析” BufferForm bufferForm = new BufferForm (this .axMapControll.Object);if (buffe
41、rForm.ShowDialog() = DialogResult .OK)/获取输岀文件路径string strBufferPath = bufferForm.strOutputPath;/缓冲区图层载入到MapControlint index = strBufferPath.LastlndexOf();this .axMapControl1.AddShapeFile(strBufferPath.Substring(0, index), strBufferPath.Substring(index);至此,代码编辑完成,运行程序,添加数据usa.mxd,选择图层wind,设置缓冲区半径为0.8
42、,点击“分析”,效果如下图所示。如果运行过程中出现错误“正试图在OS加载程序锁内执行托管代码。不要尝试在DllMain或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。”,请采用如下方法解决:把 vs2005 菜单的 调试-异常-Managed Debuggin Assistants-LoaderLock 的选中状 态去掉即可!如果异常(exception )这一项没有的话,在工具-自定义-命令选项卡,选择左边“调试”,找到右边“异常”拖到菜单上。2.2.3小结缓冲区分析是GIS空间分析的基本功能, 这一节我们完成了缓冲区分析的功能,实现了缓冲区分析文件、缓冲半径和输出路径的可选设置,
43、希望您仔细体会并掌握Geoprocessor工具开发空间分析功能的基本方法。3叠置分析叠置分析是GIS中一种常见的分析功能,它是将有关主题层组成的各个数据层面进行叠置产生一个新的数据层面,其结果综合了原来两个或多个层面要素所具有的属性,同时叠置分析不仅生成了新的空间关系,而且还将输入的多个数据层的属性联系起来产生了新的属性关系。ArcGIS中的叠置分析包含 Union (叠置求并)、In tersect(叠置求交)、Ide ntify(叠置标识)、Erase (叠置擦除)、Symmetrical Difference(叠置相交取反)、Update (叠置更新)等。这一小节,我们以叠置求交为例,
44、介绍叠置分析的开发。叠置求交是保留两个图层公共部分的空间图形,并综合两个叠加图层的属性。如下图,反映了叠置求交的原理。叠置求交示意图本节实习将介绍这种方法实现缓冲区分析,我们首先使用 简单的缓冲区分析功能,然后将缓冲区分析功能添加到我们的Geoprocessor方法实现一个 MyGIS项目中。同样,ArcGIS的ArcToolBox中的分析工具提供了缓冲区分析的功能,本节实习我们首先使用Geoprocessor方法实现一个简单的缓冲区分析功能,然后将缓冲区分析功能添加到 我们的MyGIS项目中。程序运行前首先需要在 D盘下新建一个名为 Temp的文件夹,存放叠置分析生成的文件。3.1 Geop
45、rocessor实现叠置分析叠置分析我们同样使用Geoprocessor工具来实现。3.1.1 添加控件新建一个C#.Net项目,项目名称为 OverLay,将Form1的名字设置为 Mai nF orm,并添 加 ToolbarControl、MapControl、TOCControl、LicenceControl和 Button 等五个控件。并将 ToolbarCo ntrol、TOCCo ntrol 的伙伴控件设为 MapCo ntrol,Butt on 控件的 Name属性设定为btnlntersect,Text属性设定为叠置求交”。控件布局效果如下图所示。图12控件布局效果在Tool
46、barControl加载添加数据按钮和地图浏览的功能按钮,如下图所示。图13添加按钮3.1.2代码添加及解释首先添加如下引用:using ESRI.ArcGIS.Carto;using ESRI.ArcGIS.AnalysisTools;using ESRI.ArcGIS.Geoprocessor;using ESRI.ArcGIS.Geoprocessing;与缓冲区分析的实现类似,在使用 Geoprocessor 工具实现叠置分析时,需要首先定义 一个 Geoprocessor 对象,因为命名空间“ ESRI.ArcGIS.Geoprocessing ”也包含 Geoprocessor 类
47、, 为了避免混淆,我们使用命名空间来定义 Geoprocessor ,然后设置 Geoprocessor 中的环境参数, 这里我们使用默认参数。然后定义一个操作类,这里为 Intersect ,然后设置其操作参数, 这里我们仅设置输入的要素,最后使用已定义的 Geoprocessor 对象执行即可。双击“生成 缓存区”按钮,添加代码如下:private void btnIntersect_Click( object sender, EventArgs e)/ 添加两个以上图层时才允许叠置if ( this .axMapControl1.LayerCount 2) return ;ESRI.Ar
48、cGIS.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
49、= 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);intersectTo
50、ol.in_features = pObject;/ 设置输出路径string strTempPath = D:Temp ;string strOutputPath = strTempPath + pInputLayer1.Name + _ + pInputLayer2.Name + _Intersect.shp ;intersectTool.out_feature_class=strOutputPath;/ 执行叠置分析IGeoProcessorResult result = null ;result = gp.Execute(intersectTool, null ) as IGeoPro
51、cessorResult ;/ 判断叠置分析是否成功if (result.Status != ESRI.ArcGIS.esriSystem.esriJobStatus .esriJobSucceeded)MessageBox.Show( 叠置求交失败 ! );elseMessageBoxShow(” 叠置求交成功!”);int index = strOutputPath.LastlndexOf( );this .axMapControl1.AddShapeFile(strOutputPath.Substring(0, index), strOutputPath.Substring(index)
52、;运行程序,添加叠置分析的数据,至少为两个图层,点击“叠置求交”,运行结果如图。图14叠置求交效果3.1.3小结学习完这一小节,细心的同学会发现使用Geoprocessor实现叠置分析与实现缓冲区分析的基本思路是一致的,只是不同的操作方法设置了不同的参数。另外,注意在进行叠置分析时要通过IGpValueTableObject 接口加载多个要素。请您仔细体会缓冲区分析和叠置求交 分析的实现过程的相似点与不同点。下一小节我们将对叠置分析进行进一步学习,并将多种叠置分析功能添加到MyGIS中。3.2 MyGIS中添加叠置分析这一小节我们将在上一节开发的叠置求交的基础上,实现叠置分析中三种最常用的叠置
53、方式,Union(叠置求并)、In tersect (叠置求交)和 Ide ntify(叠置标识)。In tersect (叠置求交)在上节已经介绍,下面简要介绍一下Un io n(叠置求并)和Ide ntify(叠置标识)。叠置求并(Union)保留了两个叠置图层的空间图形和属性信息,进行叠置求和的两个 图层须是多边形图层。输入图层的一个多边形被叠加图层中的多边形弧段分割成多个多边 形,输出图层综合了两个图层的属性。所有要素都将被写入到输出要素类,输出结果具有来自与其叠置的输入要素的属性。IMPUT图15叠置求并(OUTPUTIde ntify(叠置标识)是以输入图层为界,保留边界以内两个多
54、变形的所有多边形,出入图层切割后的多边形也被赋予叠加图层的属性。如下图所示。图16叠置标识(Identify )在通过ArcEngine中的Geoprocessor实现这三种叠置分析时,我们将实现输入图层和 叠置图层的可选设置,叠置方式的可选设置,输出路径的可选设置。3.2.1 添加控件打开项目 MyGIS,在MyGIS的主菜单“空间分析”中添加子菜单“叠置分析”,Name属性修改为menu Overlay ”。项目中添加一个新的窗体,名称为 OverlayForm ”,Name属性设为叠置分析”,添加 四个Label、一个 ComboBox四个TextBox、五个 Butt on控件和一个 GroupBox,控件属性 设置如下:表2控件属性设置控件类型Name属 性Text属性Readonly 属性控件说明Label输入要素:L
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《社会问题第二版》课件第十一章生态环境问题
- 2025年保密教育线上培训考试题参考答案
- 吉安民宿管理办法
- 名校引进管理办法
- 含氯消毒管理办法
- 售后用车管理办法
- 商会印鉴管理办法
- 商品破损管理办法
- 商户合同管理办法
- 商铺买卖管理办法
- 2025年湖南省体育局直属事业单位招聘考试笔试试题(含答案)
- 汽车更换发动机合同协议
- 门式钢管脚手架验收记录表
- 体育旅游课件第二章体育旅游资源
- 水务集团供水有限公司员工行为准则
- PS6000+自动化系统用户操作手册
- 海康威视枪机摄像机检测报告
- 模具加工企业(模具厂)安全生产操作规程
- 《下肢深静脉血栓的插管溶栓》
- GB/T 9652.2-2019水轮机调速系统试验
- GB/T 17421.2-2000机床检验通则第2部分:数控轴线的定位精度和重复定位精度的确定
评论
0/150
提交评论