您好,欢迎访问三七文档
当前位置:首页 > 机械/制造/汽车 > 综合/其它 > ArcGIS-Engine二次开发——提高篇
ArcGISEngine高级功能开发ArcGISEngine二次开发——提高篇ArcGISEngine高级功能开发1缩略图(鹰眼)鹰眼功能是GIS的主要功能之一,当地图范围很大时,它可以很好的为用户指明当前地图的范围。在本小节中我们将学习如何制作这种鹰眼。1.1添加控件新建一个C#.Net项目,项目名称为OverView,将Form1的名字设置为MainForm,并添加ToolbarControl、两个MapControl和LicenceControl等四个控件。布局如下图所示。左边的axMapControl1用于地图数据显示和操作,右边axMapControl2用于鹰眼显示。图1界面布局在ToolbarControl加载添加数据按钮和地图浏览的功能按钮,如下图所示,并将ToolbarControl的伙伴控件设为axMapControl1。图2添加按钮1.2代码添加及解释鹰眼用来显示主窗体当前视图范围在全景视图中的位置,在ArcMap中使用一个线框在鹰眼视图中标识。当主视图中的视图范围改变时,鹰眼中的线框随之改变,当拖动鹰眼视图中的红线框时,主视图中的视图范围也随之改变。下面开始实现鹰眼功能,添加usingESRI.ArcGIS.Carto、usingESRI.ArcGIS.Geometry、usingESRI.ArcGIS.Display三个引用。首先在axMapControl1中视图范围改变时鹰眼窗体要做出对应的响应,即绘制线框并显示,在OnExtentUpdated事件中添加代码如下:privatevoidaxMapControl1_OnExtentUpdated(objectsender,ESRI.ArcGIS.Controls.IMapControlEvents2_OnExtentUpdatedEvente){//创建鹰眼中线框IEnvelopepEnv=(IEnvelope)e.newEnvelope;IRectangleElementpRectangleEle=newRectangleElementClass();IElementpEle=pRectangleEleasIElement;pEle.Geometry=pEnv;//设置线框的边线对象,包括颜色和线宽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;//设置线框填充符号的属性IFillSymbolpFillSymbol=newSimpleFillSymbolClass();pFillSymbol.Color=pColor;pFillSymbol.Outline=pOutline;IFillShapeElementpFillShapeEle=pEleasIFillShapeElement;pFillShapeEle.Symbol=pFillSymbol;//得到鹰眼视图中的图形元素容器IGraphicsContainerpGra=axMapControl2.MapasIGraphicsContainer;IActiveViewpAv=pGraasIActiveView;//在绘制前,清除axMapControl2中的任何图形元素pGra.DeleteAllElements();//鹰眼视图中添加线框pGra.AddElement((IElement)pFillShapeEle,0);//刷新鹰眼pAv.PartialRefresh(esriViewDrawPhase.esriViewGraphics,null,null);}当鼠标点击鹰眼窗体时,主窗体Extent随之改变。在axMapControl2的OnMouseDown事件中添加代码如下:privatevoidaxMapControl2_OnMouseDown(objectsender,ESRI.ArcGIS.Controls.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.ActiveView.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随之改变。在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.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography,null,null);}下面代码用于实现axMapControl2与axMapControl1的数据的同步更新,获取主视图中视图范围最大的图层作为鹰眼中的视图。这个更新由两部分组成,一个是对axMapControl1添加地图文档(mxd文件)的响应,通过axMapControl1的OnMapReplace事件实现,一个是对axMapControl1添加单个图层的响应,通过axMapControl1的OnFullExtentUpdated事件实现。我们获取主视图中的视图范围最大的图层写成一个独立的函数,方便调用。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;}然后在axMapControl1的OnMapReplaced事件中调用。privatevoidaxMapControl1_OnMapReplaced(objectsender,IMapControlEvents2_OnMapReplacedEvente){//获取鹰眼图层this.axMapControl2.AddLayer(this.GetOverviewLayer(this.axMapControl1.Map));//设置MapControl显示范围至数据的全局范围this.axMapControl2.Extent=this.axMapControl1.FullExtent;//刷新鹰眼控件地图this.axMapControl2.Refresh();}在axMapControl1的OnFullExtentUpdated添加代码,用于实现在主视图添加图层时,实现对鹰眼视图的更新。代码如下:privatevoidaxMapControl1_OnFullExtentUpdated(objectsender,ESRI.ArcGIS.Controls.IMapControlEvents2_OnFullExtentUpdatedEvente){//获取鹰眼图层this.axMapControl2.AddLayer(this.GetOverviewLayer(this.axMapControl1.Map));//设置MapControl显示范围至数据的全局范围this.axMapControl2.Extent=this.axMapControl1.FullExtent;//刷新鹰眼控件地图this.axMapControl2.Refresh();}本例的示例数据无特别要求,使用前面章节实例数据即可。运行程序,添加地图数据,可以在主视图进行相关操作,鹰眼视图同步响应,在鹰眼视图可以移动红线框可以同步更新主视图的视图范围,在鹰眼视图单击右键拉框可以重新绘制红线框,效果如下:图3鹰眼效果1.3MyGIS中添加鹰眼在上一讲中的最后一节,我们创建了一个简单的GIS系统MyGIS,这里,我们讲鹰眼功能嵌入到我们的系统中。在这里我们对实现的思路做一个介绍,请您自己动手完善MyGIS。首先需要修改一下MyGIS窗体的控件布局,我们讲鹰眼视图放到图层管理器的下方,需要在控件容器SpliterContainer1的Panel1中添加一个水平分隔的SpliterContainer,然后将图层管理器空间TOCControl和鹰眼视图MapControl分别置于上下的容器中,并将其属性Dock分别设为Fill。另外,在此种窗体布局情况下,直接在TOCControl控件属性中设置伙伴控件无效,如图所示。我们需要在MainForm的Load事件中为TOCControl设置伙伴控件为axMapControl1。添加代码如下:privatevoidForm1_Load(objectsender,EventArgse){//设置axTOCControl1的伙伴控件this.axTOCControl1.SetBuddyControl(axMapControl1.Object);}图4TOCControl控件属性中设置伙伴控件然后依次添加本例中的代码,即可完成,运行效果如下图所示:图5MyGIS中鹰眼的运行效果1.4小结在本小节中,我们实现了鹰眼功能并讲鹰眼加入了MyGIS,这部分的重点是鹰眼视图和主视图之间的事件交互。推荐您仔细结合例子程序查看代码,如果需要获得进一步的信息,请查看帮助系统。如果您对这一小节的内容比较熟悉了,就可以开始学习本章最后一小节的内容了。在下一小节中,我们将尝试添加缓冲区分析功能。ArcGISEngine高级功能开发2缓冲区分析缓冲区分析指为了识别某一地理实体或空间物体对其周围地物影响度而在其周围建立的具有一
本文标题:ArcGIS-Engine二次开发——提高篇
链接地址:https://www.777doc.com/doc-4622362 .html