ArcGIS_Engine二次开发——提高篇_第1页
ArcGIS_Engine二次开发——提高篇_第2页
ArcGIS_Engine二次开发——提高篇_第3页
ArcGIS_Engine二次开发——提高篇_第4页
ArcGIS_Engine二次开发——提高篇_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、ArcGISEngine二次开发提高篇1缩略图(鹰眼)鹰眼功能是GIS的主要功能之一,当地图范围很大时,它可以很好的为用户指明当前地图的范围。在本小节中我们将学习如何制作这种鹰眼。1.1添加控件新建一个C#.Net项目,项目名称为OverView,将Forml的名字设置为MainForm,并添加Toolbarcontrol、两个MapControl和LicenceControl等四个控件。布局如下图所示。左边的axMapControl1用于地图数据显示和操作,右边axMapControl2用于鹰眼显示。图1界面布局在ToolbarControl加载添加数据按钮和地图浏览的功能按钮,如下图所示,

2、并将ToolbarControl的伙伴控件设为axMapControl1。图2添加按钮代码添加及解释鹰眼用来显示主窗体当前视图范围在全景视图中的位置,在ArcMap中使用一个线框在鹰眼视图中标识。当主视图中的视图范围改变时,鹰眼中的线框随之改变,当拖动鹰眼视图中的红线框时,主视图中的视图范围也随之改变。下面开始实现鹰眼功能,添加usingESRI.ArcGIS.Carto、usingESRI.ArcGIS.Geometry、usingESRI.ArcGIS.Display三个引用。首先在axMapControll中视图范围改变时鹰眼窗体要做出对应的响应,即绘制线框并显示,在OnExtentUp

3、dated事件中添加代码如下:privatevoidaxMapControl1_OnExtentUpdated(objectsender,ESRI.ArcGIS.Controls.IMapControlEvents2_OnExtentUpdatedEvente)/创建鹰眼中线框IEnvelopepEnv=(IEnvelope)e.newEnvelope;IRectangleElementpRectangleEle=newRectangleElementClass();IElementpEle=pRectangleEleasIElement;pEle.Geometry=pEnv;/设置线框的边线

4、对象,包括颜色和线宽IRgbColorpColor=newRgbColorClass();pColor.Red=255;pColor.Green=0;pColor.Blue=0;pColor.Transparency=255;/产生一个线符号对象ILineSymbolpOutline=newSimpleLineSymbolClass();pOutline.Width=2;pOutline.Color=pColor;/设置颜色属性pColor.Red=255;pColor.Green=0;pColor.Blue=0;pColor.Transparency=0;/设置线框填充符号的属性IFillS

5、ymbolpFillSymbol=newSimpleFillSymbolClass();pFillSymbol.Color=pColor;pFillSymbol.Outline=pOutline;IFillShapeElementpFillShapeEle=pEleasIFillShapeElement;pFillShapeEle.Symbol=pFillSymbol;/得到鹰眼视图中的图形元素容器IGraphicsContainerpGra=axMapControl2.MapasIGraphicsContainer;IActiveViewpAv=pGraasIActiveView;/在绘制前

6、,清除axMapControl2中的任何图形元素pGra.DeleteAllElements();/鹰眼视图中添加线框pGra.AddElement(IElement)pFillShapeEle,0);/刷新鹰眼pAv.PartialRefresh(esriViewDrawPhase.esriViewGraphics,null,null);当鼠标点击鹰眼窗体时,主窗体Extent随之改变。在axMapControl2的OnMouseDown事件中添加代码如下:privatevoidaxMapControl2_OnMouseDown(objectsender,ESRI.ArcGIS.Contro

7、ls.IMapControlEvents2_OnMouseDownEvente)if(this.axMapControl2.Map.LayerCount!=0)/按下鼠标左键移动矩形框if(e.button=1)IPointpPoint=newPointClass();pPoint.PutCoords(e.mapX,e.mapY);IEnvelopepEnvelope=this.axMapControl1.Extent;pEnvelope.CenterAt(pPoint);this.axMapControl1.Extent=pEnvelope;this.axMapControl1.Active

8、View.PartialRefresh(esriViewDrawPhase.esriViewGeography,null,null);/按下鼠标右键绘制矩形框elseif(e.button=2)IEnvelopepEnvelop=this.axMapControl2.TrackRectangle();this.axMapControl1.Extent=pEnvelop;this.axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography,null,null);当鼠标在鹰眼窗体移动时,主窗体Extent随

9、之改变。在axMapControl2的OnMouseMove事件中添加代码如下:privatevoidaxMapControl2_OnMouseMove(objectsender,ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseMoveEvente)/如果不是左键按下就直接返回if(e.button!=1)return;IPointpPoint=newPointClass();pPoint.PutCoords(e.mapX,e.mapY);this.axMapControl1.CenterAt(pPoint);this.axMapControl1.

10、ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography,null,null);下面代码用于实现axMapControl2与axMapControl1的数据的同步更新,获取主视图中视图范围最大的图层作为鹰眼中的视图。这个更新由两部分组成,一个是对axMapControll添加地图文档(mxd文件)的响应,通过axMapControll的OnMapReplace事件实现,一个是对axMapControll添加单个图层的响应,通过axMapControll的OnFullExtentUpdated事件实现。我们获取主视图中的视图范围最

11、大的图层写成一个独立的函数,方便调用。privateILayerGetOverviewLayer(IMapmap)/获取主视图的第一个图层ILayerpLayer=map.get_Layer(0);/遍历其他图层,并比较视图范围的宽度,返回宽度最大的图层ILayerpTempLayer=null;for(inti=1;imap.LayerCount;i+)pTempLayer=map.get_Layer(i);if(pLayer.AreaOfInterest.WidthpTempLayer.AreaOfInterest.Width)pLayer=pTempLayer;returnpLayer;

12、然后在axMapControll的OnMapReplaced事件中调用。privatevoidaxMapControl1_OnMapReplaced(objectsender,IMapControlEvents2_OnMapReplacedEvente)/获取鹰眼图层this.axMapControl2.AddLayer(this.GetOverviewLayer(this.axMapControl1.Map);/设置MapControl显示范围至数据的全局范围this.axMapControl2.Extent=this.axMapControl1.FullExtent;/刷新鹰眼控件地图th

13、is.axMapControl2.Refresh();在axMapControll的OnFullExtentUpdated添加代码,用于实现在主视图添加图层时,实现对鹰眼视图的更新。代码如下:privatevoidaxMapControl1_OnFullExtentUpdated(objectsender,ESRI.ArcGIS.Controls.IMapControlEvents2_OnFullExtentUpdatedEvente)获取鹰眼图层this.axMapControl2.AddLayer(this.GetOverviewLayer(this.axMapControl1.Map);

14、/设置MapControl显示范围至数据的全局范围this.axMapControl2.Extent=this.axMapControl1.FullExtent;/刷新鹰眼控件地图this.axMapControl2.Refresh();本例的示例数据无特别要求,使用前面章节实例数据即可。运行程序,添加地图数据,可以在主视图进行相关操作,鹰眼视图同步响应,在鹰眼视图可以移动红线框可以同步更新主视图的视图范围,在鹰眼视图单击右键拉框可以重新绘制红线框,效果如下:图3鹰眼效果MyGIS中添加鹰眼在上一讲中的最后一节,我们创建了一个简单的GIS系统MyGIS,这里,我们讲鹰眼功能嵌入到我们的系统中。

15、在这里我们对实现的思路做一个介绍,请您自己动手完善MyGIS。首先需要修改一下MyGIS窗体的控件布局,我们讲鹰眼视图放到图层管理器的下方,需要在控件容器SpliterContainerl的Panell中添加一个水平分隔的SpliterContainer,然后将图层管理器空间TOCControl和鹰眼视图MapControl分别置于上下的容器中,并将其属性Dock分别设为Fill。另外,在此种窗体布局情况下,直接在TOCControl控件属性中设置伙伴控件无效,如图所示。我们需要在MainForm的Load事件中为TOCControl设置伙伴控件为axMapControll。添加代码如下:pr

16、ivatevoidForm1_Load(objectsender,EventArgse)设置axTOCControl1的伙伴控件this.axTOCControl1.SetBuddyControl(axMapControl1.Object);图4TOCControl控件属性中设置伙伴控件然后依次添加本例中的代码,即可完成,运行效果如下图所示:国日鼻I-目3L灯也匚日HnrindA&口shi訥mRcnunUeim0sttwE图5MyGIS中鹰眼的运行效果1.4小结在本小节中,我们实现了鹰眼功能并讲鹰眼加入了MyGIS,这部分的重点是鹰眼视图和主视图之间的事件交互。推荐您仔细结合例子程序查看代码,

17、如果需要获得进一步的信息,请查看帮助系统。如果您对这一小节的内容比较熟悉了,就可以开始学习本章最后一小节的内容了。在下一小节中,我们将尝试添加缓冲区分析功能。ArcGISEngine高级功能开发2缓冲区分析缓冲区分析指为了识别某一地理实体或空间物体对其周围地物影响度而在其周围建立的具有一定宽度的区域,以确定哪些实体落在了被影响的区域范围之内。缓冲区分析与缓冲区查询不同,缓冲区查询是不破坏原有空间目标的关系,只是检索到该缓冲区范围内涉及到的目标。而缓冲区分析是根据设定的距离条件对一类地物建立缓冲区多边形,存储到一个新的图层中。然后再将新的图层与需要进行缓冲区分析的图层进行叠置分析,得到所需要的结

18、果。因此,缓冲区分析实际上进行了两步的操作,第一步是建立缓冲区图层,第二步是进行叠置剪裁分析。缓冲区分析适用于点、线、面对象,如点状的居民点、线状的河流和面状的作物分布区等,只要地理实体能对周围一定区域形成影响即可使用这种分析方法。图6点线面的缓冲区分析ArcGIS的ArcToolBox中的分析工具提供了缓冲区分析的功能,本节实习我们首先使用Geoprocessor方法实现一个简单的缓冲区分析功能,然后将缓冲区分析功能添加到我们的MyGIS项目中。程序运行前首先需要在D盘下新建一个名为Temp的文件夹,存放叠置分析生成的文件。Geoprocessor实现缓冲区分析为了降低开发难度和提高开发效率

19、,ArcGISEngine中添加了GeoProcessor类,使用Geoprocessor能帮助用户直接实现一些简单的工具性的功能,所有在ArcToolBox中的功能,基本都可以用Geoprocessor编程实现。本节我们使用Geoprocessor实现缓冲区分析的功能。添加控件新建一个C#.Net项目,项目名称为Buffer,将Form1的名字设置为MainForm,并添加Toolbarcontrol、MapControl、TOCControl、LicenceControl和Button等五个控件。并将Toolbarcontrol、TOCControl的伙伴控件设为MapControl,Bu

20、tton控件的Name属性设定为btnBuffer,Text属性设定为“缓冲区分析”控件布局效果如下图所示。图7控件布局效果在ToolbarControl加载添加数据按钮和地图浏览的功能按钮,如下图所示。图8添加按钮2.1.2代码添加及解释首先添加如下四个命名空间的引用。usingESRI.ArcGIS.Carto;usingESRI.ArcGIS.Geoprocessor;usingESRI.ArcGIS.Geoprocessing;usingESRI.ArcGIS.esriSystem;在使用Geoprocessor工具实现缓冲区分析时,需要首先定义一个Geoprocessor对象,因为命

21、名空间“ESRI.ArcGIS.Geoprocessing也包含Geoprocessor类,为了避免混淆,我们使用命名空间来定义Geoprocessor,然后设置Geoprocessor中的环境参数,这里我们使用默认参数。然后定义一个操作类Buffer,并设置参数,生成缓冲区的参数包含原始图层,缓冲半径和输出路径,最后使用已定义的Geoprocessor对象执行即可。双击“生成缓存区”按钮,添加代码如下:privatevoidbtnBuffer_Click(objectsender,EventArgse)判断MapControl中是否包含图层if(this.axMapControl1.Laye

22、rCount=0)return;获取MapControl中第一个图层ILayerpLayer=this.axMapControl1.Map.get_Layer(0);/输出路径,可以自行指定stringstrOutputPath=D:Buffer.shp;/缓冲半径doubledblDistace=1.0;获取一个geoprocessor的实例,避免与命名空间Geoprocessing中的Geoprocessor发生引用错误ESRI.ArcGIS.Geoprocessor.Geoprocessorgp=newESRI.ArcGIS.Geoprocessor.Geoprocessor();/Ov

23、erwriteOutput为真时,输出图层会覆盖当前文件夹下的同名图层gp.OverwriteOutput=true;创建一个Buffer工具的实例ESRI.ArcGIS.AnalysisTools.Bufferbuffer=newESRI.ArcGIS.AnalysisTools.Buffer(pLayer,strOutputPath,dblDistace);/执行缓冲区分析IGeoProcessorResultresults=null;results=gp.Execute(buffer,null)asIGeoProcessorResult;/判断缓冲区是否成功生成if(results.St

24、atus!=esriJobStatus.esriJobSucceeded)MessageBox.Show(图层+pLayer.Name+缓冲区生成失败!);elseMessageBox.Show(缓冲区生成成功!);将生成图层加入MapControlintindex=strOutputPath.LastIndexOf();this.axMapControl1.AddShapeFile(strOutputPath.Substring(0,index),strOutputPath.Substring(index);运行程序,添加一个图层(多个图层时本例中默认选择的图层为第一个图层),点击“生成缓冲

25、区”运行结果如图。图9缓冲区生成效果2.1.3小结本例中,我们使用Geoprocessor工具实现了缓冲区分析。从中我们可以得到Geoprocessor工具使用的一般方法,在使用Geoprocessor时,一般需先定义一个Geoprocessor对象,然后设置该对象的参数,如本例中的OverwriteOutput,再定义一个具体的操作类,如本例中的Buffer类,在设置完操作类的参数后,则通过Geoprocessor的Excute函数来执行。至此,我们已经实现了一个简单的缓冲区分析的功能,从中我们学习了Geoprocessor的使用方法。下一节我们讲对缓冲区份分析功能做进一步的改进,使其具有更

26、强的适用性,并将这个功能添加到MyGIS中。MyGIS中添加缓冲区分析我们在使用缓冲区分析时,需要设定原始的图层,缓冲半径以及生成缓冲区的保存路径。本节我们将在上一节的基础上进一步实现缓冲区分析,实现缓冲图层,缓冲半径和保存路径的可选设置。2.2.1添加控件打开项目MyGIS,在MyGIS的主菜单添加一个新的菜单项“空间分析”并添加子菜单“缓冲区分析”Name属性修改为“menuBuffer”项目中添加一个新的窗体,名称为“BufferForm”Name属性设为“缓冲区分析”,添加四个Label、一个ComboBox、两个TextBox、三个Button控件,控件属性设置如下:表1控件属性设置

27、控件类型Name属性Text属性控件说明Label选择图层:Label缓冲半径:LabellblUnit地图单位标示当前地图的地图单位Label输出图层:ComboBoxcboLayers所有图层的名称TextBoxtxtBufferDistance1.0生成缓冲区的缓冲半径TextBoxtxtOutputPath缓冲区文件的输出路径,其Readonly属性设为TrueButtonbtnOutputLayer选择缓冲区文件的输出路径ButtonbtnBuffer分析进行缓冲区分析ButtonbtnCancel取消取消2.2.2代码添加及解释该项目需添加如下引用:usingESRI.ArcGIS

28、.Controls;usingESRI.ArcGIS.Geoprocessor;usingESRI.ArcGIS.Carto;usingESRI.ArcGIS.Geoprocessing;usingESRI.ArcGIS.esriSystem;首先声明两个成员变量,用于保存地图数据和输出文件的路径。接收MapControI中的数据privateIHookHelpermHookHelper=newHookHelperClass();/缓冲区文件输出路径pubIicstringstrOutputPath;重写BufferForm的构造函数,添加一个参数,用于接收MapControl中的数据。重写构

29、造函数,添加参数hook,用于传入MapControI中的数据pubIicBufferForm(objecthook)InitiaIizeComponent();this.mHookHeIper.Hook=hook;添加一个自定义函数,用于根据图层名称获取要素图层并返回。privateIFeatureLayerGetFeatureLayer(stringIayerName)IFeatureLayerpFeatureLayer=nuII;/遍历图层,获取与名称匹配的图层for(inti=0;ithis.mHookHelper.FocusMap.LayerCount;i+)ILayerpLayer

30、=this.mHookHelper.FocusMap.get_Layer(i);if(pLayer.Name=layerName)pFeatureLayer=pLayerasIFeatureLayer;if(pFeatureLayer!=null)returnpFeatureLayer;elsereturnnull;BufferForm在载入时需要加载当前MapControl中的图层名称到cboLayers,读取当前地图的地图单位,设置缓冲区文件的默认输出路径,这里我们将默认输出路径设为“D:Temp”。privatevoidBufferForm_Load(objectsender,Event

31、Argse)/传入数据为空时返回if(null=mHookHelper|null=mHookHelper.Hook|0=mHookHelper.FocusMap.LayerCount)return;获取图层名称并加入cboLayersfor(inti=0;i0)cboLayers.SelectedIndex=0;/设置生成文件的默认输出路径和名称stringtempDir=D:Temp;txtOutputPath.Text=System.IO.Path.Combine(tempDir,(string)cboLayers.SelectedItem+_buffer.shp);/设置默认地图单位lb

32、lUnits.Text=Convert.ToString(mHookHelper.FocusMap.MapUnits);双击路径设置按钮,进入代码编辑界面,添加如下代码:privatevoidbtnOutputLayer_Click(objectsender,EventArgse)/定义输出文件路径SaveFileDialogsaveDlg=newSaveFileDialog();/检查路径是否存在saveDlg.CheckPathExists=true;saveDlg.Filter=Shapefile(*.shp)|*.shp;/保存时覆盖同名文件saveDlg.OverwritePromp

33、t=true;saveDlg.Title=输出路径;/对话框关闭前还原当前目录saveDlg.RestoreDirectory=true;saveDlg.FileName=(string)cboLayers.SelectedItem+_buffer.shp;读取文件输出路径至UtxtOutputPathDialogResultdr=saveDlg.ShowDialog();if(dr=DialogResult.OK)txtOutputPath.Text=saveDlg.FileName;双击“分析”按钮,添加代码如下:privatevoidbtnBuffer_Click(objectsende

34、r,EventArgse)/缓冲距离doublebufferDistance;输入的缓冲距离转换为doubledouble.TryParse(txtBufferDistance.Text.ToString(),outbufferDistance);/判断输出路径是否合法if(!System.IO.Directory.Exists(System.IO.Path.GetDirectoryName(txtOutputPath.Text)|.shp!=System.IO.Path.GetExtension(txtOutputPath.Text)MessageBox.Show(输出路径错误!);retu

35、rn;/判断图层个数if(mHookHelper.FocusMap.LayerCount=0)return;/获取图层IFeatureLayerpFeatureLayer=GetFeatureLayer(string)cboLayers.SelectedItem);if(null=pFeatureLayer)MessageBox.Show(图层+(string)cboLayers.Selectedltem+不存在!rn);return;获取一个geoprocessor的实例Geoprocessorgp=newGeoprocessor();/OverwriteOutput为真时,输出图层会覆盖当

36、前文件夹下的同名图层gp.OverwriteOutput=true;/缓冲区保存路径strOutputPath=txtOutputPath.Text;创建一个Buffer工具的实例ESRl.ArcGlS.AnalysisTools.Bufferbuffer=newESRl.ArcGlS.AnalysisTools.Buffer(pFeatureLayer,strOutputPath,bufferDistance.ToString();/执行缓冲区分析lGeoProcessorResultresults=null;results=(lGeoProcessorResult)gp.Execute(b

37、uffer,null);/判断缓冲区是否成功生成if(results.Status!=esriJobStatus.esriJobSucceeded)MessageBox.Show(图层+pFeatureLayer.Name+缓冲区生成失败!);elsethis.DialogResult=DialogResult.OK;MessageBox.Show(缓冲区生成成功!);双击“取消”按钮,添加代码如下:privatevoidbtnCancel_Click(objectsender,EventArgse)this.Dispose();进入MyGIS的主窗体,双击菜单中的“缓冲区分析”添加代码如下:

38、BufferFormbufferForm=newBufferForm(this.axMapControl1.Object);if(bufferForm.ShowDialog()=DialogResult.OK)/获取输出文件路径stringstrBufferPath=bufferForm.strOutputPath;缓冲区图层载入到MapControlintindex=strBufferPath.LastlndexOf();this.axMapControl1.AddShapeFile(strBufferPath.Substring(0,index),strBufferPath.Substri

39、ng(index);至此,代码编辑完成,运行程序,添加数据usa.mxd,选择图层wind,设置缓冲区半径为0.8,点击“分析”效果如下图所示。五曲EE3%*hHflLi.*nil;!I.-fli.图10缓冲区分析效果如果运行过程中出现错误“正试图在OS加载程序锁内执行托管代码。不要尝试在DIIMain或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。”请采用如下方法解决:把vs2005菜单的调试异常-ManagedDebugginAssistants-LoaderLock的选中状态去掉即可!如果异常(exception)这一项没有的话,在工具自定义命令选项卡,选择左边“调试”,找到右

40、边“异常”拖到菜单上。2.2.3小结缓冲区分析是GIS空间分析的基本功能,这一节我们完成了缓冲区分析的功能,实现了缓冲区分析文件、缓冲半径和输出路径的可选设置,希望您仔细体会并掌握Geoprocessor工具开发空间分析功能的基本方法。3叠置分析叠置分析是GIS中一种常见的分析功能,它是将有关主题层组成的各个数据层面进行叠置产生一个新的数据层面,其结果综合了原来两个或多个层面要素所具有的属性,同时叠置分析不仅生成了新的空间关系,而且还将输入的多个数据层的属性联系起来产生了新的属性关系。ArcGIS中的叠置分析包含Union(叠置求并)、Intersect(叠置求交)、Identify(叠置标识

41、)、Erase(叠置擦除)、SymmetricalDifference(叠置相交取反)、Update(叠置更新)等。这一小节,我们以叠置求交为例,介绍叠置分析的开发。叠置求交是保留两个图层公共部分的空间图形,并综合两个叠加图层的属性。如下图,反映了叠置求交的原理。图11叠置求交示意图本节实习将介绍这种方法实现缓冲区分析,我们首先使用Geoprocessor方法实现一个简单的缓冲区分析功能,然后将缓冲区分析功能添加到我们的MyGIS项目中。同样,ArcGIS的ArcToolBox中的分析工具提供了缓冲区分析的功能,本节实习我们首先使用Geoprocessor方法实现一个简单的缓冲区分析功能,然后

42、将缓冲区分析功能添加到我们的MyGIS项目中。程序运行前首先需要在D盘下新建一个名为Temp的文件夹,存放叠置分析生成的文件。Geoprocessor实现叠置分析叠置分析我们同样使用Geoprocessor工具来实现。添加控件新建一个C#.Net项目,项目名称为OverLay,将Form1的名字设置为MainForm,并添加Toolbarcontrol、MapControl、TOCControl、LicenceControl和Button等五个控件。并将Toolbarcontrol、TOCControl的伙伴控件设为MapControl,Button控件的Name属性设定为btnInterse

43、ct,Text属性设定为“叠置求交”控件布局效果如下图所示。ArcG(5EnaineTaolbarContraIArzGESEngineTO(Name:axTOCConArcGtSEnaine間自口ControlName:axMap匸oritroll图12控件布局效果在ToolbarControl加载添加数据按钮和地图浏览的功能按钮,如下图所示。图13添加按钮3.1.2代码添加及解释首先添加如下引用:usingESRI.ArcGIS.Carto;usingESRI.ArcGIS.AnalysisTools;usingESRI.ArcGIS.Geoprocessor;usingESRI.ArcG

44、IS.Geoprocessing;与缓冲区分析的实现类似,在使用Geoprocessor工具实现叠置分析时,需要首先定义一个Geoprocessor对象因为命名空间“ESRI.ArcGIS.Geoprocessing也包含Geoprocessor类,为了避免混淆,我们使用命名空间来定义Geoprocessor,然后设置Geoprocessor中的环境参数,这里我们使用默认参数。然后定义一个操作类,这里为Intersect,然后设置其操作参数,这里我们仅设置输入的要素,最后使用已定义的Geoprocessor对象执行即可。双击“生成缓存区”按钮,添加代码如下:privatevoidbtnInte

45、rsect_Click(objectsender,EventArgse)/添加两个以上图层时才允许叠置if(this.axMapControl1.LayerCount2)return;ESRI.ArcGIS.Geoprocessor.Geoprocessorgp=newESRI.ArcGIS.Geoprocessor.Geoprocessor();/OverwriteOutput为真时,输出图层会覆盖当前文件夹下的同名图层gp.OverwriteOutput=true;/创建叠置分析实例IntersectintersectTool=newIntersect();获取MapControI中的前两

46、个图层ILayerpInputLayer1=this.axMapControl1.get_Layer(0);ILayerpInputLayer2=this.axMapControI1.get_Layer(1);转换为object类型objectinputfeature1=pInputLayer1;objectinputfeature2=pInputLayer2;/设置参与叠置分析的多个对象IGpVaIueTabIeObjectpObject=newGpVaIueTabIeObjectCIass();pObject.SetCoIumns(2);pObject.AddRow(refinputfea

47、ture1);pObject.AddRow(refinputfeature2);intersectTooI.in_features=pObject;/设置输出路径stringstrTempPath=D:Temp;stringstrOutputPath=strTempPath+pInputLayer1.Name+_+pInputLayer2.Name+_Intersect.shp;intersectTooI.out_feature_cIass=strOutputPath;/执行叠置分析IGeoProcessorResuItresuIt=nuII;resuIt=gp.Execute(interse

48、ctTooI,nuII)asIGeoProcessorResuIt;/判断叠置分析是否成功if(resuIt.Status!=ESRI.ArcGIS.esriSystem.esriJobStatus.esriJobSucceeded)MessageBox.Show(叠置求交失败!);elseMessageBox.Show(叠置求交成功!”);intindex=strOutputPath.LastlndexOf();this.axMapControl1.AddShapeFile(strOutputPath.Substring(0,index),strOutputPath.Substring(in

49、dex);运行程序,添加叠置分析的数据,至少为两个图层,点击“叠置求交,运行结果如图。图14叠置求交效果3.1.3小结学习完这一小节,细心的同学会发现使用Geoprocessor实现叠置分析与实现缓冲区分析的基本思路是一致的,只是不同的操作方法设置了不同的参数。另外,注意在进行叠置分析时要通过IGpValueTableObject接口加载多个要素。请您仔细体会缓冲区分析和叠置求交分析的实现过程的相似点与不同点。下一小节我们将对叠置分析进行进一步学习,并将多种叠置分析功能添加到MyGIS中。MyGIS中添加叠置分析这一小节我们将在上一节开发的叠置求交的基础上,实现叠置分析中三种最常用的叠置方式,

50、Union(叠置求并)、Intersect(叠置求交)和Identify(叠置标识)oIntersect(叠置求交)在上节已经介绍,下面简要介绍一下Union(叠置求并)和Identify(叠置标识)。叠置求并(Union)保留了两个叠置图层的空间图形和属性信息,进行叠置求和的两个图层须是多边形图层。输入图层的一个多边形被叠加图层中的多边形弧段分割成多个多边形,输出图层综合了两个图层的属性。所有要素都将被写入到输出要素类,输出结果具有来自与其叠置的输入要素的属性。IMPUT图15叠置求并(Union)Identify(叠置标识)是以输入图层为界,保留边界以内两个多变形的所有多边形,出入图层切割

51、后的多边形也被赋予叠加图层的属性。如下图所示。inputauTPur图16叠置标识(Identify)在通过ArcEngine中的Geoprocessor实现这三种叠置分析时,我们将实现输入图层和叠置图层的可选设置,叠置方式的可选设置,输出路径的可选设置。3.2.1添加控件打开项目MyGIS,在MyGIS的主菜单“空间分析”中添加子菜单“叠置分析”,Name属性修改为“menuOverlay”。项目中添加一个新的窗体,名称为“OverlayForm”,Name属性设为“叠置分析”,添加四个Label、一个ComboBox、四个TextBox、五个Button控件和一个GroupBox,控件属性

52、设置如下:表2控件属性设置控件类型Name属性Text属性Readonly属性控件说明Label输入要素:Label叠置要素:Label叠置方式:Label输出图层:TextBoxtxtInputFeatTrue保存输入要素路径TextBoxtxtOverlayFeatTrue保存叠置要素路径TextBoxtxtOutputPathTrue叠置结果的输出路径TextBoxtxtMessageTrue叠置分析处理过程消息,Multiline属性设为True,ScrollBars属性设为VerticalDock属性设为FillComboBoxcboOverLay叠置分析的方式ButtonbtnIn

53、putFeat选择输入要素ButtonbtnOverlayFeat选择叠置要素ButtonbtnOutputLayer选择叠置分析结果的输出路径ButtonbtnBuffer分析进行叠置分析ButtonbtnCancel取消取消GroupBox处理过程消息作为txtMessage的容器3.2.2代码添加及解释该工程需要添加如下引用:usingESRI.ArcGIS.Controls;usingESRI.ArcGIS.AnalysisTools;usingESRI.ArcGIS.Geoprocessing;首先声明一个成员变量,用于保存叠置分析输出文件的路径。publicstringstrOut

54、putPath;OverlayForm在载入时需要加载三种叠置方式到cboOverlay中,并且需要设置缓冲区文件的默认输出路径,这里我们将默认输出路径设为“D:Temp”。privatevoidOverlayForm_Load(objectsender,EventArgse)/加载叠置方式this.cboOverLay.Items.Add(求交(Intersect);this.cboOverLay.Items.Add(求并(Union);this.cboOverLay.Items.Add(标识(Identity);this.cboOverLay.SelectedIndex=0;/设置默认输出

55、路径stringtempDir=D:Temp;txtOutputPath.Text=tempDir;双击输入要素的文件选择按钮,进入代码编辑界面,添加代码如下:privatevoidbtnInputFeat_Click(objectsender,EventArgse)定义OpenfileDialogOpenFileDialogopenDIg=newOpenFileDialog();openDlg.Filter=Shapefile(*.shp)|*.shp;openDlg.Title=选择第一个要素;/检验文件和路径是否存在openDlg.CheckFileExists=true;openDlg

56、.CheckPathExists=true;/初试化初试打开路径openDlg.InitialDirectory=D:Temp;读取文件路径到txtFeaturel中if(openDlg.ShowDialog()=DialogResult.OK)this.txtInputFeat.Text=openDlg.FileName;类似的,双击叠置要素的文件选择按钮,添加代码如下;privatevoidbtnOverlayFeat_Click(objectsender,EventArgse)定义OpenfileDialogOpenFileDialogopenDlg=newOpenFileDialog(

57、);openDlg.Filter=Shapefile(*.shp)|*.shp;openDlg.Title=选择第二个要素;/检验文件和路径是否存在openDlg.CheckFileExists=true;openDlg.CheckPathExists=true;/初试化初试打开路径openDlg.InitialDirectory=D:Temp;读取文件路径到txtFeature2中if(openDlg.ShowDialog()=DialogResult.OK)this.txtOverlayFeat.Text=openDlg.FileName;双击输出图层的路径选择按钮,添加代码如下:priv

58、atevoidbtnOutputLayer_Click(objectsender,EventArgse)/定义输出文件路径SaveFileDialogsaveDlg=newSaveFileDialog();/检查路径是否存在saveDlg.CheckPathExists=true;saveDlg.Filter=Shapefile(*.shp)|*.shp;/保存时覆盖同名文件saveDlg.OverwritePrompt=true;saveDlg.Title=输出路径;/对话框关闭前还原当前目录saveDlg.RestoreDirectory=true;saveDlg.FileName=(st

59、ring)cboOverLay.SelectedItem+.shp;读取文件输出路径至UtxtOutputPathDialogResultdr=saveDlg.ShowDialog();if(dr=DialogResult.OK)txtOutputPath.Text=saveDlg.FileName;双击“分析”按钮,添加代码如下。privatevoidbtnOverLay_Click(objectsender,EventArgse)/判断是否选择要素if(this.txtInputFeat.Text=|this.txtInputFeat.Text=null|this.txtOverlayFe

60、at.Text=|this.txtOverlayFeat.Text=null)txtMessage.Text=请设置叠置要素!;return;ESRI.ArcGIS.Geoprocessor.Geoprocessorgp=newESRI.ArcGIS.Geoprocessor.Geoprocessor();/OverwriteOutput为真时,输出图层会覆盖当前文件夹下的同名图层gp.OverwriteOutput=true;/设置参与叠置分析的多个对象objectinputFeat=this.txtInputFeat.Text;objectoverlayFeat=this.txtOverl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论