好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

arcgisengine二次开发——提高篇.pdf

90页
  • 卖家[上传人]:赵**
  • 文档编号:341164169
  • 上传时间:2022-12-06
  • 文档格式:PDF
  • 文档大小:5.29MB
  • 文本预览
  • 下载提示
  • 常见问题
    • 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!ArcGIS Engine 二次开发提高篇-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!ArcGIS Engine 二次开发 提高篇 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!1 缩略图(鹰眼)鹰眼功能是 GIS 的主要功能之一,当地图范围很大时,它可以很好的为用户指明当前地图的范围在本小节中我们将学习如何制作这种鹰眼1.1 添加控件 新建一个 C#.Net 项目,项目名称为 OverView,将 Form1 的名字设置为MainForm,并添加 ToolbarControl、两个 MapControl 和 LicenceControl 等四个控件布局如下图所示左边的 axMapControl1 用于地图数据显示和操作,右边 axMapControl2 用于鹰眼显示图 1 界面布局 在 ToolbarControl 加载添加数据按钮和地图浏览的功能按钮,如下图所示,并将 ToolbarControl 的伙伴控件设为 axMapControl1。

      图 2 添加按钮 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!-3-1.2 代码添加及解释 鹰眼用来显示主窗体当前视图范围在全景视图中的位置,在ArcMap 中使用一个线框在鹰眼视图中标识当主视图中的视图范围改变时,鹰眼中的线框随之改变,当拖动鹰眼视图中的红线框时,主视图中的视图范围也随之改变下面开始实现鹰眼功能,添加 using ESRI.ArcGIS.Carto、using ESRI.ArcGIS.Geometry、using ESRI.ArcGIS.Display 三个引用首先在 axMapControl1 中视图范围改变时鹰眼窗体要做出对应的响应,即绘制线框并显示,在 OnExtentUpdated 事件中添加代码如下:private void axMapControl1_OnExtentUpdated(object sender,ESRI.ArcGIS.Controls.IMapControlEvents2_OnExtentUpdatedEvent e)/创建鹰眼中线框 IEnvelope pEnv=(IEnvelope)e.newEnvelope;IRectangleElement pRectangleEle=new RectangleElementClass();IElement pEle=pRectangleEle as 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=pColor;/设置颜色属性 pColor.Red=255;pColor.Green=0;pColor.Blue=0;pColor.Transparency=0;/设置线框填充符号的属性 IFillSymbol pFillSymbol=new SimpleFillSymbolClass();pFillSymbol.Color=pColor;pFillSymbol.Outline=pOutline;IFillShapeElement pFillShapeEle=pEle as IFillShapeElement;pFillShapeEle.Symbol=pFillSymbol;欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!-4-/得到鹰眼视图中的图形元素容器 IGraphicsContainer pGra=axMapControl2.Map as IGraphicsContainer;IActiveView pAv=pGra as IActiveView;/在绘制前,清除 axMapControl2 中的任何图形元素 pGra.DeleteAllElements();/鹰眼视图中添加线框 pGra.AddElement(IElement)pFillShapeEle,0);/刷新鹰眼 pAv.PartialRefresh(esriViewDrawPhase.esriViewGraphics,null,null);当鼠标点击鹰眼窗体时,主窗体 Extent 随之改变。

      在 axMapControl2 的OnMouseDown 事件中添加代码如下: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();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,null);/按下鼠标右键绘制矩形框 else if(e.button=2)IEnvelope pEnvelop=this.axMapControl2.TrackRectangle();this.axMapControl1.Extent=pEnvelop;this.axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography,null,null);欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!-5-当鼠标在鹰眼窗体移动时,主窗体 Extent 随之改变。

      在 axMapControl2 的OnMouseMove 事件中添加代码如下:private void axMapControl2_OnMouseMove(object 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,null,null);下面代码用于实现 axMapControl2与 axMapControl1的数据的同步更新,获取主视图中视图范围最大的图层作为鹰眼中的视图这个更新由两部分组成,一个是对 axMapControl1添加地图文档(mxd文件)的响应,通过axMapControl1的 OnMapReplace事件实现,一个是对 axMapControl1添加单个图层的响应,通过 axMapControl1的 OnFullExtentUpdated 事件实现。

      我们获取主视图中的视图范围最大的图层写成一个独立的函数,方便调用private ILayer GetOverviewLayer(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;欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!-6-然后在 axMapControl1的 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;/刷新鹰眼控件地图 this.axMapControl2.Refresh();在 axMapControl1 的 OnFullExtentUpdated 添加代码,用于实现在主视图添加图层时,实现对鹰眼视图的更新。

      代码如下:private void axMapControl1_OnFullExtentUpdated(object sender,ESRI.ArcGIS.Controls.IMapControlEvents2_OnFullExtentUpdatedEvent e)/获取鹰眼图层 this.axMapControl2.AddLayer(this.GetOverviewLayer(this.axMapControl1.Map);/设置 MapControl 显示范围至数据的全局范围 this.axMapControl2.Extent=this.axMapControl1.FullExtent;/刷新鹰眼控件地图 this.axMapControl2.Refresh();本例的示例数据无特别要求,使用前面章节实例数据即可运行程序,添加地图数据,可以在主视图进行相关操作,鹰眼视图同步响应,在鹰眼视图可以移动红线框可以同步更新主视图的视图范围,在鹰眼视图单击右键拉框可以重新绘制红线框,效果如下:欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!-7-图 3 鹰眼效果 1.3 MyGIS 中添加鹰眼 在上一讲中的最后一节,我们创建了一个简单的GIS 系统 MyGIS,这里,我们讲鹰眼功能嵌入到我们的系统中。

      在这里我们对实现的思路做一个介绍,请您自己动手完善 MyGIS首先需要修改一下 MyGIS 窗体的控件布局,我们讲鹰眼视图放到图层管理器的下方,需要在控件容器 SpliterContainer1 的 Panel1 中添加一个水平分隔的SpliterContainer,然后将图层管理器空间 TOCControl 和鹰眼视图 MapControl 分别置于上下。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.