第5章_ArcGISEngine二次开发(基本功能).ppt.ppt

上传人:仙人指路1688 文档编号:2300337 上传时间:2023-02-10 格式:PPT 页数:109 大小:8.53MB
返回 下载 相关 举报
第5章_ArcGISEngine二次开发(基本功能).ppt.ppt_第1页
第1页 / 共109页
第5章_ArcGISEngine二次开发(基本功能).ppt.ppt_第2页
第2页 / 共109页
第5章_ArcGISEngine二次开发(基本功能).ppt.ppt_第3页
第3页 / 共109页
第5章_ArcGISEngine二次开发(基本功能).ppt.ppt_第4页
第4页 / 共109页
第5章_ArcGISEngine二次开发(基本功能).ppt.ppt_第5页
第5页 / 共109页
点击查看更多>>
资源描述

《第5章_ArcGISEngine二次开发(基本功能).ppt.ppt》由会员分享,可在线阅读,更多相关《第5章_ArcGISEngine二次开发(基本功能).ppt.ppt(109页珍藏版)》请在三一办公上搜索。

1、第5章:ArcGIS Engine二次开发(基本功能),这个例子将引导您创建第一个简单的地图显示程序,并添加基本的缩放和漫游功能。如果您之前没有接触过ArcGIS Engine的开发,那么这个例子是您迈入ArcGIS Engine二次开发大门的极好例子,如果您之前没有接触过Visual Basic.NET,也无需担心,这个例子将从零开始引导您一步一步完成任务。,1 ArcGIS Engine二次开发入门,1.1 ArcGIS Engine开发起步第一个简单的地图显示程序,首先打开Microsoft Visual Studio 2005,点击菜单栏中的“文件”“新建项目”,在弹出的对话框中选择新

2、建一个Visual Basic的Windows应用程序,之后更改项目名称为“MapView”,更改文件的路径为个人实习文件夹,点击“确定”即可。,1.1.1 创建一个新的工程,图23 新建项目对话框,点击编译器最左侧的“工具箱”,在弹出的选择项中找到“ArcGIS Windows Forms”项,单击其中的MapControl,之后在Form1的空白处单击鼠标左键不放并拖拽鼠标,直到调整MapControl到合适的大小再松开鼠标(您也可以直接在工具箱中双击MapControl,该控件则会自动加入到Form1中)。用同样的方法,再将LicenseControl添加到Form1中。,1.1.2 添

3、加控件及引用,图24 工具箱,如果您在工具箱中找不到MapControl,则请依次尝试以下两种解决方案。首先单击工具栏,待工具箱弹出之后,在工具箱的任意位置上单击鼠标右键,从弹出菜单中选择“重置工具箱”。如果这一步操作之后仍然无法看到MapControl,则请滑动工具栏右侧的滚动条至最底部,找到“常规”选项卡,然后在“常规”选项卡上单击鼠标右键,在弹出菜单中单击“选择项(I)”,在弹出的对话框中找到“AxLicenseControl”和“AxMapControl”,将这两项前的复选框打上勾,最后点击确定即可(如果在“.NET Framework组件”这个面板中找不到这两项,则选择“COM 组件

4、”面板,在“ESRI LicenseControl”和“ESRI MapControl”前面打勾)。,图25 重置工具箱,图26 选择项,图27 选择工具箱项,图28 选择工具箱项,添加好MapControl和LicenseControl之后,调整Form1和MapControl的位置与大小,如下图所示:,图29 窗体布局,在MapControl上单击鼠标右键,选择“属性”,则会弹出MapControl的属性设置面板,在之前也介绍过,通过这个面板可以完成许多简单的工作。如图所示,点击“Map”面板,之后点击 按钮,在弹出的对话框中选择下图所示的路径(注:笔者的ArcGIS安装在D盘,若您的Ar

5、cGIS装在别的盘符,请做相应修改),再在此路径下选择“States”,点击“Open”。之后在MapControl的属性页上点击“确定”即可。,1.1.3 添加地图,图30 文件添加路径,至此,我们已经完成了一个最简单的地图显示程序,下面一起来看一下成果吧。点击“启动调试”按钮(或者在“调试”菜单下选择相应命令,或者按键盘的F5键),可以得到如下的运行结果。,图31“启动调试”按钮,图32 初次运行结果,我们没有书写任何代码,就得到了一个最简单的地图显示程序。但这个程序还不能与用户交互,下一步我们需要添加一些代码,让程序能响应用户的鼠标,完成放大和全图显示的功能。,3.1.4 添加基本的代码

6、,图33 MapControl控件支持的所有方法,双击MapControl控件,可以进入代码编辑界面。从窗口上方的下拉列表框中,我们能够看到MapControl能够响应的所有事件(关于每个事件的详细使用方法等请参见帮助系统,第六章对帮助系统有更加详细的介绍)。双击MapControl进入代码编辑界面的时候,默认的是“OnMouseDown”事件,下一步就需要在这个事件中添加响应鼠标的相关代码。请您在Private Sub AxMapControl1_OnMouseDown函数中添加如下代码:If e.button=1 Then AxMapControl1.Extent=AxMapControl

7、1.TrackRectangle ElseIf e.button=2 Then AxMapControl1.Extent=AxMapControl1.FullExtentEnd If,再次运行程序,鼠标左键在地图上拉框可以实现地图的放大功能,而右键单击地图则会还原地图的全图显示。,图34 任意比例尺放大功能,如果将代码替换如下,则能实现左键放大,右键漫游的功能。If e.button=1 Then AxMapControl1.Extent=AxMapControl1.TrackRectangle ElseIf e.button=2 Then AxMapControl1.Pan()End If,

8、下面我们依次来看看这些代码都代表什么意思。首先看来第一段:If e.button=1 Then AxMapControl1.Extent=AxMapControl1.TrackRectangle ElseIf e.button=2 Then AxMapControl1.Extent=AxMapControl1.FullExtentEnd If这个代码是一个If Else条件语句,关于“e”的详细定义及其中包含的各参数,请参考帮助中与“IMapControlEvents2,OnMouseDownEventHandler delegate”关键字相关的内容。,3.1.5 代码解释,可以根据e中包含

9、的“button”值来判断鼠标的单击操作是来自何处,若button值为1,则为鼠标左键,2代表鼠标右键,4代表鼠标中键。当判断得到是鼠标左键单击时,执行“AxMapControl1.Extent=AxMapControl1.TrackRectangle”这条语句,其中,等号右侧是调用了“TrackRectangle”方法,这个方法是在地图上拖拽出一个矩形,之后将这个矩形赋值给当前地图的显示区域(Extent),这样就实现了地图的放大功能。类似的,若鼠标右键单击,则将全图范围赋值给当前的显示范围,实现了地图的全图显示功能。第二段代码与第一段结构一样,只是在右键的相应事件上略有不同,这是调用了“P

10、an”方法,实现了地图的漫游功能。,通过这个例子,我们制作出了一个最简单的地图浏览程序MapView,并能响应一些基本的鼠标操作。在MapControl的属性页中,其实还有许多内容您可以尝试,例如在“General”面板中可以直接加入地图文件(*.mxd或者*.mxt),您也可以利用刚才的方式一次性多加入一些图层而不仅仅加入“States”一个,同时可以更改各图层的叠放次序,也可以在“Data”面板中设置地图的旋转角度(Rotation)等,您还可以设置MapControl的显示方式,是否支持地图的预览功能,边框样式等等。您可以做一些尝试,看看能得到哪些有趣的结果,这些尝试对您今后熟悉ArcG

11、IS Engine的开发是有一定帮助的。如果需要重置MapControl,只需要点击“Data”面板中的“Reset”按钮。当您完成了这个例子,并做了一些积极的尝试之后,您就可以接着学习下一个小节的内容了。,3.1.6 小结,查询是GIS中非常重要的一个功能,下面将分别介绍属性查询和空间查询的制作方法。,3.2 属性查询,3.2.1 添加控件,如果上一小节的工程已经关闭,则将其打开,如果您之后又在MapControl中添加了一些别的数据,请将其删除,只保留一个“states”图层,请务必注意这一步,这直接关系到您下面的工作能否顺利进行。用之前讲过的方式,在窗体中添加一个Label和一个Text

12、Box。将Label的“Text”属性修改为“StateName”,结果如下:,图35 Label控件和TextBox控件,首先添加引用。点击菜单栏上的“项目”“添加引用”,在弹出的对话框中同时选择“ESRI.ArcGIS.Carto”和“ESRI.ArcGIS.Geodatabase”(选择的时候按下Ctrl键以同时选择多个),点击确定。之后双击TextBox1控件,进入代码编辑界面。在代码编辑区域的最上方输入以下内容:Imports ESRI.ArcGIS.CartoImports ESRI.ArcGIS.Geodatabase如下图所示:,3.2.2 添加引用和代码,图36 引用添加位置

13、,图37 添加引用对话框,之后在TextBox1的事件中选择KeyPress,在KeyPress事件中添加以下代码:If e.KeyChar=Microsoft.VisualBasic.ChrW(Keys.Return)Then Dim pFeatureLayer As IFeatureLayer Dim pCursor As IFeatureCursor,图38 KeyPress方法,Dim pFilter As IQueryFilter Dim pFeature As IFeature pFeatureLayer=Me.AxMapControl1.Map.Layer(0)If Not pF

14、eatureLayer.Name=states Then Exit Sub Me.AxMapControl1.Map.ClearSelection()pFilter=New QueryFilter pFilter.WhereClause=STATE_NAME=&TextBox1.Text&pCursor=pFeatureLayer.Search(pFilter,True)pFeature=pCursor.NextFeature If pFeature Is Nothing Then Me.AxMapControl1.Refresh()MessageBox.Show(没有找到名为&TextBox

15、1.Text&的州,Infomation,MessageBoxButtons.OK)Exit Sub Else Me.AxMapControl1.Map.SelectFeature(pFeatureLayer,pFeature)Me.AxMapControl1.Extent=pFeature.Shape.Envelope End If End If,运行程序,分别向编辑框中输入“Texas”和“RS”,键入回车,如下图所示:,图39 Texas州查询结果,图40 RS查询结果,If e.KeyChar=Microsoft.VisualBasic.ChrW(Keys.Return)Then上述代

16、码是一个判断语句,即当用户输入回车的时候,开始进行查询。下面两行代码是定义查询的范围,默认为上一小节中添加的图层“states”,如果找不到这个图层则自动退出。pFeatureLayer=Me.AxMapControl1.Map.Layer(0)If Not pFeatureLayer.Name=states Then Exit SubMe.AxMapControl1.Map.ClearSelection()是为了将上一次的查询结果清除。pFilter=New QueryFilterpFilter.WhereClause=STATE_NAME=&TextBox1.Text&pCursor=pF

17、eatureLayer.Search(pFilter,True)pFeature=pCursor.NextFeature这一部分是生成一个新的查询器,选择条件(WhereClause)就是检索是否有与用户输入相符的州,并将结果从查询得到的pCursor中读取出来。,3.2.3 代码解释,If pFeature Is Nothing ThenMe.AxMapControl1.Refresh()MessageBox.Show(没有找到名为&TextBox1.Text&的州,Infomation,MessageBoxButtons.OK)Exit SubElseMe.AxMapControl1.Ma

18、p.SelectFeature(pFeatureLayer,pFeature)Me.AxMapControl1.Extent=pFeature.Shape.EnvelopeEnd If 这一部分是一个判断语句,若查询得到的结果为空,则刷新地图,弹出对话框通知用户没有查询到结果,并退出程序。如果查询得到的结果不为空,则将这个结果加入地图的选择集,并将地图的显示范围定为查询结果的外轮廓,这样得到的州将高亮显示同时居中放大到屏幕中心。,这一部分中,我们接触到了基本的属性查询。但是在这个例子中,我们不能实现对属性表中任意属性字段的查询(在这个程序中,我们只能查询州名STATE_NAME,而不能对别的字

19、段进行查询),而且这个查询不支持模糊查询。为了使查询变的更加丰富,更加人性化,请您参考IQueryFilter接口中WhereClause属性的设置方法,拓展WhereClause可以得到许多有趣的结果。在书写代码的过程中,对任何有疑问的地方,或者您想要拓展的位置,都可以在帮助系统中查询相关的接口和属性,查看最原始的定义,帮助系统中的解释和定义对于您熟悉ArcObjects,熟悉ArcGIS Engine的二次开发以及后续的工作都是十分重要的,请一定不要忽视这个环节。如果您已经尝试了一些变化,或者对本小节的内容比较熟悉了,则可以进入下一小节的学习。,3.2.4 小结,上一小节我们已经学习了如何

20、进行属性查询,在这一小节中,我们将继续学习GIS中的另一种查询方式空间查询。如果上一小节的工程已经关闭,则将其打开,如果您之后又在MapControl中添加了一些别的数据,请将其删除,只保留一个“states”图层,请务必注意这一步,这直接关系到您下面的工作能否顺利进行。我们接着上一小节的内容继续完善。在窗体中添加一个Button,将其Text属性修改为“点查询”。,3.3 空间查询,3.3.1 添加控件,图41 添加“点查询”按钮,利用上一小节讲的方式,添加引用“ESRI.ArcGIS.Geometry”,并在类中添加一个全局变量nMouseFlag,如下图所示:,3.3.2添加引用和代码,

21、图42 添加引用“ESRI.ArcGIS.Geometry”,之后在类中添加一个公共函数,用来根据屏幕像素计算实际的地理距离Public Function ConvertPixelsToMapUnits(ByVal pActiveView As IActiveView,ByVal pixelUnits As Double)As Double Dim realWorldDisplayExtent As Double Dim pixelExtent As Integer Dim sizeOfOnePixel As Double pixelExtent=pActiveView.ScreenDispl

22、ay.DisplayTransformation.DeviceFrame.Right-pActiveView.ScreenDisplay.DisplayTransformation.DeviceFrame.Left realWorldDisplayExtent=pActiveView.ScreenDisplay.DisplayTransformation.VisibleBounds.Width sizeOfOnePixel=realWorldDisplayExtent/pixelExtent ConvertPixelsToMapUnits=pixelUnits*sizeOfOnePixelEn

23、d Function,此后,双击Button1,进入Button的Click事件,向其中添加如下代码:nMouseFlag=1Me.AxMapControl1.MousePointer=ESRI.ArcGIS.Controls.esriControlsMousePointer.esriPointerCrosshair(注:上两行代码应该书写在一行,由于空间有限,这里写为两行)最后将MapControl控件的OnMouseDown事件中已有的代码清除,替换为以下代码:If nMouseFlag=1 Then Dim pFeatureLayer As IFeatureLayer Dim pFeat

24、ureClass As IFeatureClass Dim pSpatialFilter As ISpatialFilter Dim pFilter As IQueryFilter Dim pActiveView As IActiveView Dim pPoint As IPoint,Dim pBuffer As IGeometry Dim length As Double Dim n As Long Dim pTopo As ITopologicalOperator Dim pCursor As IFeatureCursor Dim pFeature As IFeature pFeature

25、Layer=Me.AxMapControl1.Map.Layer(0)If Not pFeatureLayer.Name=states Then Exit Sub pFeatureClass=pFeatureLayer.FeatureClass If pFeatureClass Is Nothing Then Exit Sub pActiveView=Me.AxMapControl1.Map pPoint=pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x,e.y)length=ConvertPixelsToMapUni

26、ts(pActiveView,2),pTopo=pPoint pBuffer=pTopo.Buffer(length)pSpatialFilter=New SpatialFilter pSpatialFilter.Geometry=pBuffer Select Case pFeatureClass.ShapeType Case esriGeometryType.esriGeometryPoint pSpatialFilter.SpatialRel=esriSpatialRelEnum.esriSpatialRelContains Case esriGeometryType.esriGeomet

27、ryPolyline pSpatialFilter.SpatialRel=esriSpatialRelEnum.esriSpatialRelCrosses Case esriGeometryType.esriGeometryPolygon pSpatialFilter.SpatialRel=esriSpatialRelEnum.esriSpatialRelIntersects End Select pSpatialFilter.GeometryField=pFeatureClass.ShapeFieldName pFilter=pSpatialFilter,pCursor=pFeatureLa

28、yer.Search(pFilter,False)pFeature=pCursor.NextFeature If pFeature Is Nothing Then Exit Sub Me.AxMapControl1.Map.ClearSelection()Me.AxMapControl1.Map.SelectFeature(pFeatureLayer,pFeature)Me.AxMapControl1.Refresh()n=pFeature.Fields.FindField(STATE_NAME)MessageBox.Show(pFeature.Value(n),StateName,Messa

29、geBoxButtons.OK)End If 运行程序,结果如右图所示:,图43 空间查询运行结果,距离转换函数请您自行参看帮助系统中对相关接口的具体定义和解释。Button1的Click事件中是将nMouseFlag设置为1,并将鼠标在MapControl上的形状改变为十字丝状。pActiveView=Me.AxMapControl1.MappPoint=pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x,e.y)上述代码是在MapControl的OnMouseDown事件中,当您单击鼠标左键的时候,将屏幕上的点转换成

30、地图上的点(关键在于坐标值的转换),方便后续操作。length=ConvertPixelsToMapUnits(pActiveView,2)pTopo=pPointpBuffer=pTopo.Buffer(length),3.3.3代码解释,这一部分是将2个像素的距离转换成实际的地理距离,并以这个距离为半径,上一步生成的点为中心,生成一个缓冲区。,上述代码是设置pSpatialFilter的各项参数,供后续查询,包括空间查询的几何形状(之前生成的缓冲区),空间查询的方式(相交,包含等)以及Shape字段。n=pFeature.Fields.FindField(STATE_NAME)Messag

31、eBox.Show(pFeature.Value(n),StateName,MessageBoxButtons.OK)这两句代码是找出“STATE_NAME”所在的列数,并将其显示出来。,在本节中我们完成更多的空间查询功能,其中有点查询、线查询、矩形查询、圆查询新建一个VB.Net工程,向工程中添加控件,如下图所示:其中包括MapControl,4个Button,一个TextBox,3.3.4 进一步完善空间查询,通过在控件属性中添加地图的方法,向Mapcontrol中添加例子数据。(例子数据是位于World文件夹下的Continents.lyr)如下图所示:添加完毕后我们向工程中添加一个公共

32、的代码模块。在下图所示的菜单中选择添加模块菜单项。,在弹出的菜单中选择模块完成添加。,在模块中添加公共代码。(模块中的代码可以同时被多个类进行使用,属于公共模块),在设计页面双击点查询按钮,进入点击按钮响应事件填写如下代码。Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)Handles Button1.Click 点查询 nMouseFlag=1 Me.AxMapControl1.MousePointer=ESRI.ArcGIS.Controls.esriControlsMo

33、usePointer.esriPointerCrosshairEnd Sub相应的线查询、矩形查询、圆查询添加同样的代码,但nMouseFlag得值要有所改变。线查询:nMouseFlag=2矩形查询:nMouseFlag=3圆查询:nMouseFlag=4为MapControl控件添加OnMouseDown事件,填入以下代码,点击运行,运行效果如下图所示:,仔细研读代码,您会发现,在这部分中我们并没有用到什么新的知识,只是在结构上做了调整,应为空间查询都是需要使用一个IGeometry对象进行空间求交进行查询的。所以我们将公共的代码放在公共的模块中进行调用。有心的同学可能发现,我们为了判断用

34、户在MapControl上的操作,我们引入了一个全局变量nMouseFlag,程序中多一个全局变量,对程序的结构的封闭性就有所破坏,能不能去掉这个全局变量而是Mapcontrol自主判断是哪个功能进行操作呢?答案是肯定的,我们可以使用BaseCommand和BaseTool来完成这个工作,详细的用法在3.4和3.5小节将会介绍。,3.3.5小结,在这一小节中,我们学习了如何进行简单的空间查询。空间查询不仅包括点查询,还包括线查询,矩形查询,多边形查询等(为了实现这些功能,可以参考MapControl中的TrackRectangle等方法)。对于这一小节的代码,强烈建议您参看帮助系统中对相关接口

35、的解释和定义,以进一步熟悉接口的使用,这对后面的学习以及掌握ArcGIS Engine二次开发是极有好处的。如果您对这一部分比较熟悉了,可以进入下一小节。在第四章中,我们介绍了控件命令(Control Commands),并提到ArcGIS Engine允许用户自定义开发一些控件命令,在下两小节中,我们将具体学习如何开发。,3.4 BaseCommand开发实例在这一小节中,我们将学习BaseCommand的开发步骤。BaseCommand的功能与Button的功能类似,是当鼠标点击按钮的时候,MapControl控件会对其中的命令做出相应而无需额外的操作。在这一小节中,我们将制作一个“定比例尺放大”的按钮,当鼠标单击按钮时,地图将居中放大一倍。3.4.1添加控件如果上一小节的程序已经关闭,则重新打开,同时保证MapControl控件中加载了至少一个图层。在主窗体(frmMain)中添加一个Button,将其Text属性更改为“居中放大”。,3.3.5小结,在类别中选中ArcGIS,在末班中选择BaseTool,并将名称更改为“toolPointQuery”,点击添加,出现如下对话框:,The End!,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号