《ArcGIS Engine C#实例开发教程》各个模块的集合.doc
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《《ArcGIS Engine C#实例开发教程》各个模块的集合.doc》由会员分享,可在线阅读,更多相关《《ArcGIS Engine C#实例开发教程》各个模块的集合.doc(77页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、在上一讲中,我们完成了 MapControl 和 PageLayoutControl 两种视图的同步工作,本讲我们将完成状态栏信息的添加与实现。 应用程序的状态栏一般用来显示程序的当前状态,当前所使用的工具。 GIS 应用程序一般也在状态栏显示当前光标的坐标、比例尺等信息。 学习完本讲内容,您将学会状态栏编程的基本方法,并且能够在我们的程序的状态栏中添加且显示以下信息: 当前所用工具信息 当前比例尺 当前坐标 1、 添加状态栏项目 在设计视图中,点击窗体中的状态栏,在其属性面板中找到“ Items ”项,单击其右边的按钮,在下拉框中选择“ StatusLabel ”,单击“添加按钮”,依次添加
2、四个 StatusLabel ,依次修改属性参数如下表所示: 序号 Name 属性 Text 属性 Spring 属性 说明 1 MessageLabel 就绪 False 当前所用工具信息 2 Blank True 占位 3 ScaleLabel 比例尺 False 当前比例尺 4 CoordinateLabel 当前坐标 False 当前坐标 设置好之后如下图所示: Tips : 我们设计出的状态栏最终如下所示: 就绪 ( Blank ) 比例尺 当前坐标 Spring 属性表示可以按状态栏剩余空间自动伸缩。所以加入 Blank 项目,只是为了占个位子,以达到 ScaleLabel 和 C
3、oordinateLabel 项目右对齐而 MessageLabel 项目左对齐的目的。 2、 显示当前所用工具信息 首先添加 axToolbarControl1 的 OnMouseMove 事件 ( 相信大家看了以上的教程,已经知道怎么添加事件了吧,还不知道的建议再温习下前几讲的内容 ) 。在其事件响应函数代码如下: private void axToolbarControl1_OnMouseMove(object sender, IToolbarControlEvents_OnMouseMoveEvent e) / 取得鼠标所在工具的索引号 int index = axToolbarCon
4、trol1.HitTest(e.x, e.y, false); if (index != -1) / 取得鼠标所在工具的 ToolbarItem IToolbarItem toolbarItem = axToolbarControl1.GetItem(index); / 设置状态栏信息 MessageLabel.Text = toolbarItem mand.Message; else MessageLabel.Text = 就绪 ; 3、 显示当前比例尺 添加 axMapControl1 的 OnMouseMove 事件,其代码如下: private void axMapControl1_O
5、nMouseMove(object sender, IMapControlEvents2_OnMouseMoveEvent e) / 显示当前比例尺 ScaleLabel.Text = 比例尺 1: + (long)this.axMapControl1.MapScale).ToString(); 4、 显示当前坐标 显示当前坐标也是 axMapControl1 的 OnMouseMove 事件中响应,故只要在 axMapControl1_OnMouseMove 函数中添加如下代码即可: / 显示当前坐标 CoordinateLabel.Text = 当前坐标 X = + e.mapX.ToSt
6、ring() + Y = + e.mapY.ToString() + + this.axMapControl1.MapUnits; 按 F5 编译运行,可以看到,我们的程序已经能够正常工作了。但是细心的你可能会发现,当前坐标的后面的坐标单位为“ esriUnknownUnits ”或“ esriMeters ”之类,即系统在正常单位的前面加上了“ esri ”,追求完美的我们自然看得不舒服。那就进行简单的替换吧。 首先定义个全局坐标单位变量 sMapUnits ,如下所示: private string sMapUnits; 再 Form1_Load 函数中进行初始化: sMapUnits =
7、 Unknown; 添加 axMapControl1 控件的 OnMapReplaced 事件,在事件响应函数中进行坐标单位替换,代码如下: private void axMapControl1_OnMapReplaced(object sender, IMapControlEvents2_OnMapReplacedEvent e) esriUnits mapUnits = axMapControl1.MapUnits; switch (mapUnits) case esriUnits.esriCentimeters: sMapUnits = Centimeters; break; case
8、esriUnits.esriDecimalDegrees: sMapUnits = Decimal Degrees; break; case esriUnits.esriDecimeters: sMapUnits = Decimeters; break; case esriUnits.esriFeet: sMapUnits = Feet; break; case esriUnits.esriInches: sMapUnits = Inches; break; case esriUnits.esriKilometers: sMapUnits = Kilometers; break; case e
9、sriUnits.esriMeters: sMapUnits = Meters; break; case esriUnits.esriMiles: sMapUnits = Miles; break; case esriUnits.esriMillimeters: sMapUnits = Millimeters; break; case esriUnits.esriNauticalMiles: sMapUnits = NauticalMiles; break; case esriUnits.esriPoints: sMapUnits = Points; break; case esriUnits
10、.esriUnknownUnits: sMapUnits = Unknown; break; case esriUnits.esriYards: sMapUnits = Yards; break; 5、 编译运行 按 F5 编译运行程序。如果你足够细心的话,相信你已经成功了! 在本讲中,介绍中 StatusStrip 控件的基本使用方法和 AE 中当所用工具信息、当前比例尺和当前坐标的显示调用方法。 在上一讲中,我们实现了状态栏的相关信息显示,在这一讲中我们将要实现鹰眼功能。 所谓的鹰眼,就是一个缩略地图,上面有一个矩形框,矩形框区域就是当前显示的地图区域,拖动矩形框可以改变当前地图显示的位置
11、,改变矩形框的大小,可以改变当前地图的显示区域大小,从起到导航的作用。鹰眼是地图浏览中常用的功能之一。 关于鹰眼的实现方式,最常用的是用一个 MapControl 控件显示地图全图,并在上面画一个红色矩形框表示当前地图的显示范围,并实现鹰眼 MapControl 与主窗体的 MapControl 互动。本讲最终效果如下所示: 图 1 鹰眼效果 1 、添加鹰眼控件 由于本教程在第一讲中没有预先考虑到鹰眼所放的位置,故我们要先稍微调整一下程序框架,并添加一个 MapControl 用于显示鹰眼。 在本教程中,我们将鹰眼放在图层控件的下方,调整方法如下: ( 1 )在设计视图中,选择 tabCont
12、rol1 控件,即放图层和属性的那个容器,将其 Dock 属性设为 None ,并用鼠标拖拽将其缩小。把工具箱中的 SplitContainer 控件拖到窗体的左窗格,即放在 tabControl1 控件的旁边。并将其 Orientation 属性设置为 Horizontal 。 ( 2 )选中 tabControl1 控件,按 Ctrl+X 剪切,再选中刚才粘贴到 SplitContainer2 的 Panel1 中,如图 2 所示。操作完成后效果如图 3 所示。 图 2 图 3 ( 3 )再选中 SplitContainer2 控件(如果不好选中,直接以属性面板中选择 SplitConta
13、iner2 ),将其 Dock 属性设置为 Fill 。再选中 tabControl1 ,将其 Dock 属性也设置为 Fill 。 ( 4 )从工具箱中选择 MapControl 控件并拖到 SplitContainer2 的 Panel2 ,作为鹰眼控件。最终效果如图 4 所示。 图 4 2 、鹰眼的实现 ( 1 )载入地图到鹰眼控件 当地图载入到主 Map 控件时,同时也载入到鹰眼控件,在 axMapControl1_OnMapReplaced 事件响应函数(此函数上一讲中已经添加了)中添加如下代码: private void axMapControl1_OnMapReplaced(ob
14、ject sender, IMapControlEvents2_OnMapReplacedEvent e) / 前面代码省略 / 当主地图显示控件的地图更换时,鹰眼中的地图也跟随更换 this.axMapControl2.Map = new MapClass(); / 添加主地图控件中的所有图层到鹰眼控件中 for (int i = 1; i = this.axMapControl1.LayerCount; i+) this.axMapControl2.AddLayer(this.axMapControl1.get_Layer(this.axMapControl1.LayerCount - i
15、); / 设置 MapControl 显示范围至数据的全局范围 this.axMapControl2.Extent = this.axMapControl1.FullExtent; / 刷新鹰眼控件地图 this.axMapControl2.Refresh(); ( 2 )绘制鹰眼矩形框 为鹰眼控件 MapControl1 添加 OnExtentUpdated 事件,此事件是在主 Map 控件的显示范围改变时响应,从而相应更新鹰眼控件中的矩形框。其响应函数代码如下: private void axMapControl1_OnExtentUpdated(object sender, IMapCo
16、ntrolEvents2_OnExtentUpdatedEvent e) / 得到新范围 IEnvelope pEnv = (IEnvelope)e.newEnvelope; IGraphicsContainer pGra = axMapControl2.Map as IGraphicsContainer; IActiveView pAv = pGra as IActiveView; / 在绘制前,清除 axMapControl2 中的任何图形元素 pGra.DeleteAllElements(); IRectangleElement pRectangleEle = new Rectangle
17、ElementClass(); 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; pO
18、utline.Color = pColor; / 设置颜色属性 pColor = new RgbColorClass(); pColor.Red = 255; pColor.Green = 0; pColor.Blue = 0; pColor.Transparency = 0; / 设置填充符号的属性 IFillSymbol pFillSymbol = new SimpleFillSymbolClass(); pFillSymbol.Color = pColor; pFillSymbol.Outline = pOutline; IFillShapeElement pFillShapeEle =
19、 pEle as IFillShapeElement; pFillShapeEle.Symbol = pFillSymbol; pGra.AddElement(IElement)pFillShapeEle, 0); / 刷新 pAv.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null); ( 3 )鹰眼与主 Map 控件互动 为鹰眼控件 MapControl2 添加 OnMouseDown 事件,代码如下: private void axMapControl2_OnMouseDown(object sender, IMap
20、ControlEvents2_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.
21、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.esriViewGeogra
22、phy, null, null); 为鹰眼控件 MapControl2 添加 OnMouseMove 事件,主要实现按下鼠标左键的时候移动矩形框,同时也改变主的图控件的显示范围。代码如下: private void axMapControl2_OnMouseMove(object sender, IMapControlEvents2_OnMouseMoveEvent e) / 如果不是左键按下就直接返回 if (e.button != 1) return; IPoint pPoint = new PointClass(); pPoint.PutCoords(e.mapX, e.mapY); t
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ArcGIS Engine C#实例开发教程 ArcGIS Engine C#实例开发教程各个模块的集合 ArcGIS C# 实例 开发 教程 各个 模块 集合
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内