ArcGIS Engine二次开发入门1PPT_第1页
ArcGIS Engine二次开发入门1PPT_第2页
ArcGIS Engine二次开发入门1PPT_第3页
ArcGIS Engine二次开发入门1PPT_第4页
ArcGIS Engine二次开发入门1PPT_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

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

文档简介

GIS工程设计开发综合实习,张文、黄长青武汉大学遥感信息工程学院,基于C#.NET和AO/AE的GIS设计与开发,1,2020年5月1日,2,Part5:,ArcGISEngine二次开发入门,2020年5月1日,ArcGISEngine二次开发入门,3,5.1ArcGISEngine简介5.2ArcGISEngine开发起步5.3属性查询5.4空间查询5.5BaseCommand开发实例5.6BaseTool开发实例5.7通过代码添加图层5.8构建一个简单的GIS应用5.9问题解决方法及帮助文档的使用,2020年5月1日,5.1ArcGISEngine简介,ArcGISEngine的功能十分强大。作为ArcGISEngine开发者,您可以实现以下列出的和其他更多的功能,这包括:用多个图层来显示地图,例如道路、水系、边界等地图的漫游和缩放地图上要素的确认地图上要素的查询和定位根据属性值显示注记根据航片或者卫片显示图像绘制几何图形,例如点、线、弧、多边形添加描述性的文字,4,2020年5月1日,沿着线选择或者选择矩形、某一范围内、多边形等内部的要素选择距离在某一范围内的要素利用SQL语言来寻找和选择要素利用专题地图来渲染要素,如唯一值法、分级法和点状密度法动态显示实时地图或者时序数据根据地理编码来寻找位置转换您地图的坐标系根据几何操作来生成缓冲区、计算差值,或者进行求交、求并等运算编辑要素形状或者旋转地图创建并更新要素的几何形状及其属性,5,2020年5月1日,编辑要素(EditingFeatures),ArcGISEngine开发包让您构建出能创建、修改和删除geodatabase中矢量要素或者shapefile文件的应用程序。标准的ArcGISEngineRuntime能够让编辑shapefile文件或者personalgeodatabase中简单要素的程序运行。然而,要构建企业级geodatabase的全部功能,就需要ArcGISEngineRuntime中的GeodatabaseUpdate选项。,6,2020年5月1日,空间建模和分析,空间建模和通过增加ArcGISEngineRuntime中的Spatial选项,您能够扩展ArcGISEngine的功能。这个选项(Spatial选项)能提供一系列强劲的空间建模和分析功能。您能够创建、查询、表达和分析基于象元的栅格数据,能够集成栅格和矢量数据进行分析,能够从已有数据挖掘出新的信息,能够从多层数据中查询信息,能够在ArcGISEngine应用程序中完美集成基于象元的栅格数据和矢量数据。,7,2020年5月1日,三维可视化等,ArcGISEngineRuntime中的3D选项让您通过使用Scene和Globe控件来有效的表达和分析区域及全球数据。例如,您能够:显示Scene和Globe文档展示交互性的透视图,包括漫游、缩放、旋转、倾斜、模拟飞行以便于表达和分析显示真实世界的表面要素,例如楼房展示视域和可见范围分析、场景高度内插、剖面分析和最短距离分析,8,2020年5月1日,这个例子将引导您创建第一个简单的地图显示程序,并添加基本的缩放和漫游功能。如果您之前没有接触过ArcGISEngine的开发,那么这个例子是您迈入ArcGISEngine二次开发大门的极好例子,如果您之前没有接触C#.NET,也无需担心,这个例子将从零开始引导您一步一步完成任务。,5.2ArcGISEngine开发起步第一个简单的地图显示程序,9,2020年5月1日,首先打开MicrosoftVisualStudio2005,点击菜单栏中的“文件”“新建项目”,在弹出的对话框中选择新建一个C#的Windows应用程序,之后更改项目名称为“MapView”,更改文件的路径为个人实习文件夹,点击“确定”即可。,创建一个新的工程,图23新建项目对话框,10,2020年5月1日,点击编译器最左侧的“工具箱”,在弹出的选择项中找到“ArcGISWindowsForms”项,单击其中的MapControl,之后在Form1的空白处单击鼠标左键不放并拖拽鼠标,直到调整MapControl到合适的大小再松开鼠标(您也可以直接在工具箱中双击MapControl,该控件则会自动加入到Form1中)。用同样的方法,再将LicenseControl添加到Form1中。,添加控件及引用,图24工具箱,11,2020年5月1日,如果您在工具箱中找不到MapControl,则请依次尝试以下两种解决方案。首先单击工具栏,待工具箱弹出之后,在工具箱的任意位置上单击鼠标右键,从弹出菜单中选择“重置工具箱”。如果这一步操作之后仍然无法看到MapControl,则请滑动工具栏右侧的滚动条至最底部,找到“常规”选项卡,然后在“常规”选项卡上单击鼠标右键,在弹出菜单中单击“选择项(I)”,在弹出的对话框中找到“AxLicenseControl”和“AxMapControl”,将这两项前的复选框打上勾,最后点击确定即可(如果在“.NETFramework组件”这个面板中找不到这两项,则选择“COM组件”面板,在“ESRILicenseControl”和“ESRIMapControl”前面打勾)。,图25重置工具箱,12,2020年5月1日,图26选择项,图27选择工具箱项,13,2020年5月1日,图28选择工具箱项,14,2020年5月1日,添加好MapControl和LicenseControl之后,调整Form1和MapControl的位置与大小,如下图所示:,图29窗体布局,15,2020年5月1日,在MapControl上单击鼠标右键,选择“属性”,则会弹出MapControl的属性设置面板,在之前也介绍过,通过这个面板可以完成许多简单的工作。如图所示,点击“Map”面板,之后点击按钮,在弹出的对话框中选择下图所示的路径(注:笔者的ArcGIS安装在D盘,若您的ArcGIS装在别的盘符,请做相应修改),再在此路径下选择“States”,点击“Open”。之后在MapControl的属性页上点击“确定”即可。,添加地图,图30文件添加路径,16,2020年5月1日,至此,我们已经完成了一个最简单的地图显示程序,下面一起来看一下成果吧。点击“启动调试”按钮(或者在“调试”菜单下选择相应命令,或者按键盘的F5键),可以得到如下的运行结果。,图31“启动调试”按钮,17,2020年5月1日,图32初次运行结果,18,2020年5月1日,我们没有书写任何代码,就得到了一个最简单的地图显示程序。但这个程序还不能与用户交互,下一步我们需要添加一些代码,让程序能响应用户的鼠标,完成放大和全图显示的功能。,添加基本的代码,图33MapControl控件支持的所有方法,19,2020年5月1日,双击MapControl控件,可以进入代码编辑界面。从窗口上方的下拉列表框中,我们能够看到MapControl能够响应的所有事件(关于每个事件的详细使用方法等请参见帮助系统,第六章对帮助系统有更加详细的介绍)。双击MapControl进入代码编辑界面的时候,默认的是“OnMouseDown”事件,下一步就需要在这个事件中添加响应鼠标的相关代码。请您在PrivateSubAxMapControl1_OnMouseDown函数中添加如下代码:if(e.button=1)this.axMapControl1.Extent=this.axMapControl1.TrackRectangle();elseif(e.button=2)this.axMapControl1.Extent=this.axMapControl1.FullExtent;,20,2020年5月1日,再次运行程序,鼠标左键在地图上拉框可以实现地图的放大功能,而右键单击地图则会还原地图的全图显示。,图34任意比例尺放大功能,21,2020年5月1日,如果将代码替换如下,则能实现左键放大,右键漫游的功能。if(e.button=1)this.axMapControl1.Extent=this.axMapControl1.TrackRectangle();elseif(e.button=2)this.axMapControl1.Pan();,22,2020年5月1日,下面我们依次来看看这些代码都代表什么意思。首先看来第一段:if(e.button=1)this.axMapControl1.Extent=this.axMapControl1.TrackRectangle();elseif(e.button=2)this.axMapControl1.Extent=this.axMapControl1.FullExtent;这个代码是一个IfElse条件语句,关于“e”的详细定义及其中包含的各参数,请参考帮助中与“IMapControlEvents2,OnMouseDownEventHandlerdelegate”关键字相关的内容。,代码解释,23,2020年5月1日,可以根据e中包含的“button”值来判断鼠标的单击操作是来自何处,若button值为1,则为鼠标左键,2代表鼠标右键,4代表鼠标中键。当判断得到是鼠标左键单击时,执行“AxMapControl1.Extent=AxMapControl1.TrackRectangle”这条语句,其中,等号右侧是调用了“TrackRectangle”方法,这个方法是在地图上拖拽出一个矩形,之后将这个矩形赋值给当前地图的显示区域(Extent),这样就实现了地图的放大功能。类似的,若鼠标右键单击,则将全图范围赋值给当前的显示范围,实现了地图的全图显示功能。第二段代码与第一段结构一样,只是在右键的相应事件上略有不同,这是调用了“Pan”方法,实现了地图的漫游功能。,24,2020年5月1日,通过这个例子,我们制作出了一个最简单的地图浏览程序MapView,并能响应一些基本的鼠标操作。在MapControl的属性页中,其实还有许多内容您可以尝试,例如在“General”面板中可以直接加入地图文件(*.mxd或者*.mxt),您也可以利用刚才的方式一次性多加入一些图层而不仅仅加入“States”一个,同时可以更改各图层的叠放次序,也可以在“Data”面板中设置地图的旋转角度(Rotation)等,您还可以设置MapControl的显示方式,是否支持地图的预览功能,边框样式等等。您可以做一些尝试,看看能得到哪些有趣的结果,这些尝试对您今后熟悉ArcGISEngine的开发是有一定帮助的。如果需要重置MapControl,只需要点击“Data”面板中的“Reset”按钮。当您完成了这个例子,并做了一些积极的尝试之后,您就可以接着学习下一个小节的内容了。,小结,25,2020年5月1日,查询是GIS中非常重要的一个功能,下面将分别介绍属性查询和空间查询的制作方法。,5.3属性查询,添加控件,如果上一小节的工程已经关闭,则将其打开,如果您之后又在MapControl中添加了一些别的数据,请将其删除,只保留一个“states”图层,请务必注意这一步,这直接关系到您下面的工作能否顺利进行。用之前讲过的方式,在窗体中添加一个Label和一个TextBox。将Label的“Text”属性修改为“StateName”,结果如下:,图35Label控件和TextBox控件,26,2020年5月1日,首先添加引用。点击菜单栏上的“项目”“添加引用”,在弹出的对话框中同时选择“ESRI.ArcGIS.Carto”和“ESRI.ArcGIS.Geodatabase”(选择的时候按下Ctrl键以同时选择多个),点击确定。之后双击TextBox1控件,进入代码编辑界面。在代码编辑区域的最上方输入以下内容:usingESRI.ArcGIS.Carto;usingESRI.ArcGIS.Geodatabase;如下图所示:,添加引用和代码,图36引用添加位置,27,2020年5月1日,图37添加引用对话框,28,2020年5月1日,之后在控件TextBox的事件中选择KeyUp,在KeyUp事件中添加以下代码:,图38KeyPress方法,29,2020年5月1日,if(e.KeyCode=Keys.Enter)/定义图层,要素游标,查询过滤器,要素IFeatureLayerpFeatureLayer;IFeatureCursorpFeatureCursor;IQueryFilterpQueryFilter;IFeaturepFeature;/获取图层pFeatureLayer=this.axMapControl1.Map.get_Layer(0)asIFeatureLayer;/如果图层名称不是states,程序退出if(pFeatureLayer.Name!=states)return;/清除上次查询结果this.axMapControl1.Map.ClearSelection();/pQueryFilter的实例化pQueryFilter=newQueryFilterClass();/设置查询过滤条件pQueryFilter.WhereClause=STATE_NAME=+txtStateName.Text+;,30,2020年5月1日,/查询pFeatureCursor=pFeatureLayer.Search(pQueryFilter,true);/获取查询到的要素pFeature=pFeatureCursor.NextFeature();/判断是否获取到要素if(pFeature!=null)/选择要素this.axMapControl1.Map.SelectFeature(pFeatureLayer,pFeature);/放大到要素this.axMapControl1.Extent=pFeature.Shape.Envelope;else/没有得到pFeature的提示MessageBox.Show(没有找到名为+txtStateName.Text+的州,提示);,31,2020年5月1日,运行程序,分别向编辑框中输入“Texas”和“RS”,键入回车,如下图所示:,图39Texas州查询结果,32,2020年5月1日,图40RS查询结果,33,2020年5月1日,if(e.KeyCode=Keys.Enter)上述代码是一个判断语句,即当用户输入回车的时候,开始进行查询。下面两行代码是定义查询的范围,默认为上一小节中添加的图层“states”,如果找不到这个图层则自动退出。/获取图层pFeatureLayer=this.axMapControl1.Map.get_Layer(0)asIFeatureLayer;/如果图层名称不是states,程序退出if(pFeatureLayer.Name!=states)return;/清除上次查询结果this.axMapControl1.Map.ClearSelection();这一部分是生成一个新的查询器,选择条件(WhereClause)就是检索是否有与用户输入相符的州,并将结果从查询得到的pCursor中读取出来。,代码解释,34,2020年5月1日,/判断是否获取到要素if(pFeature!=null)/选择要素this.axMapControl1.Map.SelectFeature(pFeatureLayer,pFeature);/放大到要素this.axMapControl1.Extent=pFeature.Shape.Envelope;else/没有得到pFeature的提示MessageBox.Show(没有找到名为+txtStateName.Text+的州,提示);这一部分是一个判断语句,若查询得到的结果为空,则刷新地图,弹出对话框通知用户没有查询到结果,并退出程序。如果查询得到的结果不为空,则将这个结果加入地图的选择集,并将地图的显示范围定为查询结果的外轮廓,这样得到的州将高亮显示同时居中放大到屏幕中心。,35,2020年5月1日,这一部分中,我们接触到了基本的属性查询。但是在这个例子中,我们不能实现对属性表中任意属性字段的查询(在这个程序中,我们只能查询州名STATE_NAME,而不能对别的字段进行查询),而且这个查询不支持模糊查询。为了使查询变的更加丰富,更加人性化,请您参考IQueryFilter接口中WhereClause属性的设置方法,拓展WhereClause可以得到许多有趣的结果。在书写代码的过程中,对任何有疑问的地方,或者您想要拓展的位置,都可以在帮助系统中查询相关的接口和属性,查看最原始的定义,帮助系统中的解释和定义对于您熟悉ArcObjects,熟悉ArcGISEngine的二次开发以及后续的工作都是十分重要的,请一定不要忽视这个环节。如果您已经尝试了一些变化,或者对本小节的内容比较熟悉了,则可以进入下一小节的学习。,小结,36,2020年5月1日,上一小节我们已经学习了如何进行属性查询,在这一小节中,我们将继续学习GIS中的另一种查询方式空间查询。如果上一小节的工程已经关闭,则将其打开,如果您之后又在MapControl中添加了一些别的数据,请将其删除,只保留一个“states”图层,请务必注意这一步,这直接关系到您下面的工作能否顺利进行。我们接着上一小节的内容继续完善。在窗体中添加一个Button,将其Text属性修改为“点查询”。,5.4空间查询,添加控件,图41添加“点查询”按钮,37,2020年5月1日,利用上一小节讲的方式,添加引用“ESRI.ArcGIS.Geometry”,并在类中添加一个全局变量nMouseFlag,如下图所示:,添加引用和代码,图42添加引用“ESRI.ArcGIS.Geometry”,38,2020年5月1日,之后在类中添加一个公共函数,用来根据屏幕像素计算实际的地理距离privatedoubleConvertPixelToMapUnits(IActiveViewactiveView,doublepixelUnits)doublerealWorldDiaplayExtent;intpixelExtent;doublesizeOfOnePixel;doublemapUnits;/获取设备中视图显示宽度,即像素个数pixelExtent=activeView.ScreenDisplay.DisplayTransformation.get_DeviceFrame().right-activeView.ScreenDisplay.DisplayTransformation.get_DeviceFrame().left;/获取地图坐标系中地图显示范围realWorldDiaplayExtent=activeView.ScreenDisplay.DisplayTransformation.VisibleBounds.Width;/每个像素大小代表的实际距离sizeOfOnePixel=realWorldDiaplayExtent/pixelExtent;/地理距离mapUnits=pixelUnits*sizeOfOnePixel;returnmapUnits;,39,2020年5月1日,此后,双击Button1,进入Button的Click事件,向其中添加如下代码:/标记点查询mMouseFlag=1;/设置鼠标形状this.axMapControl1.MousePointer=ESRI.ArcGIS.Controls.esriControlsMousePointer.esriPointerCrosshair;(注:上两行代码应该书写在一行,由于空间有限,这里写为两行)最后将MapControl控件的OnMouseDown事件中已有的代码清除,替换为以下代码:if(mMouseFlag=1)IFeatureLayerpFeatureLayer;IFeatureClasspFeatureClass;/获取图层和要素类,为空时返回pFeatureLayer=this.axMapControl1.Map.get_Layer(0)asIFeatureLayer;if(pFeatureLayer.Name!=states)return;pFeatureClass=pFeatureLayer.FeatureClass;if(pFeatureClass=null)return;IActiveViewpActiveView;IPointpPoint;doublelength;,40,2020年5月1日,/获取视图范围pActiveView=this.axMapControl1.ActiveView;/获取鼠标点击屏幕坐标pPoint=pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x,e.y);/2个像素大小的屏幕距离转换为地图距离length=ConvertPixelToMapUnits(pActiveView,2);ITopologicalOperatorpTopoOperator;IGeometrypGeoBuffer;ISpatialFilterpSpatialFilter;/根据缓冲半径生成空间过滤器pTopoOperator=pPointasITopologicalOperator;pGeoBuffer=pTopoOperator.Buffer(length);pSpatialFilter=newSpatialFilterClass();pSpatialFilter.Geometry=pGeoBuffer;/根据图层类型选择缓冲方式switch(pFeatureClass.ShapeType)caseesriGeometryType.esriGeometryPoint:pSpatialFilter.SpatialRel=esriSpatialRelEnum.esriSpatialRelContains;break;caseesriGeometryType.esriGeometryPolyline:pSpatialFilter.SpatialRel=esriSpatialRelEnum.esriSpatialRelCrosses;break;caseesriGeometryType.esriGeometryPolygon:pSpatialFilter.SpatialRel=esriSpatialRelEnum.esriSpatialRelIntersects;break;,41,2020年5月1日,/定义空间过滤器的空间字段pSpatialFilter.GeometryField=pFeatureClass.ShapeFieldName;IQueryFilterpQueryFilter;IFeatureCursorpFeatureCursor;IFeaturepFeature;/利用要素过滤器查询要素pQueryFilter=pSpatialFilterasIQueryFilter;pFeatureCursor=pFeatureLayer.Search(pQueryFilter,true);pFeature=pFeatureCursor.NextFeature();intfieldIndex;if(pFeature!=null)/选择指定要素this.axMapControl1.Map.ClearSelection();this.axMapControl1.Map.SelectFeature(ILayer)pFeatureLayer,pFeature);this.axMapControl1.Refresh();fieldIndex=pFeature.Fields.FindField(STATE_NAME);MessageBox.Show(查找到“+pFeature.get_Value(fieldIndex)+”,提示);,42,2020年5月1日,运行程序,结果如右图所示:,图43空间查询运行结果,43,2020年5月1日,距离转换函数请您自行参看帮助系统中对相关接口的具体定义和解释。Button1的Click事件中是将nMouseFlag设置为1,并将鼠标在MapControl上的形状改变为十字丝状。/获取视图范围pActiveView=this.axMapControl1.ActiveView;/获取鼠标点击屏幕坐标pPoint=pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x,e.y);/屏幕距离转换为地图距离length=ConvertPixelToMapUnits(pActiveView,2);上述代码是在MapControl的OnMouseDown事件中,当您单击鼠标左键的时候,将屏幕上的点转换成地图上的点(关键在于坐标值的转换),方便后续操作。/根据缓冲半径生成空间过滤器pTopoOperator=pPointasITopologicalOperator;pGeoBuffer=pTopoOperator.Buffer(length);pSpatialFilter=newSpatialFilterClass();pSpatialFilter.Geometry=pGeoBuffer;,代码解释,44,2020年5月1日,这一部分是将2个像素的距离转换成实际的地理距离,并以这个距离为半径,上一步生成的点为中心,生成一个缓冲区。,45,2020年5月1日,上述代码是设置pSpatialFilter的各项参数,供后续查询,包括空间查询的几何形状(之前生成的缓冲区),空间查询的方式(相交,包含等)以及Shape字段。这两句代码是找出“STATE_NAME”所在的列数,并将其显示出来。,46,2020年5月1日,在本节中我们完成更多的空间查询功能,其中有点查询、线查询、矩形查询、圆查询新建一个C#.Net工程,向工程中添加控件,如下图所示:其中包括MapControl,4个Button,一个TextBox,进一步完善空间查询,47,2020年5月1日,通过在控件属性中添加地图的方法,向Mapcontrol中添加例子数据。(例子数据是位于World文件夹下的Continents.lyr)如下图所示:下面我们在MainForm的代码页添加空间查询的函数。本例中我们需要添加ESRI.ArcGIS.Carto、ESRI.ArcGIS.Geometry、ESRI.ArcGIS.Geodatabase、ESRI.ArcGIS.Controls四个个命名空间,并且我们仍然需要上节中的ConvertPixelToMapUnits(IActiveViewactiveView,doublepixelUnits)函数,请自行添加。空间查询函数代码如下:/空间查询/MapControl/空间查询方式/字段名称/查询得到的要素名称,48,2020年5月1日,privatestringQuerySpatial(AxMapControlmapControl,IGeometrygeometry,stringfieldName),49,202

温馨提示

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

评论

0/150

提交评论