鹰眼图,是GIS的一个基本功能,在鹰眼图上可以像从空中俯视一样查看地图框中所显示的地图在整个图中的位置,是对全局地图的一种概述表达,能够起到很好的空间提示和导航的作用。网上有很多Arcengine 二次开发的相关的鹰眼图的例子,思路差不多。 现在呢,具体介绍下基于我们PIE SDK是如何实现这基本工具鹰眼图功能的基本实现。
要实现鹰眼图功能主要就是通过两个mapControl控件,主地图控件是mapControlMain,鹰眼图控件是mapHawkEyeControl,实现关键点有两点:1、如何使两个控件使用的数据保持一致;2、如何绘制鹰眼图控件中的显示框。
一、数据:为了更好的便于读者理解,鹰眼图的数据采用静止数据(非动态数据),即当地图初始化的时候鹰眼图就自动加载一个地图文档。
1 /// <summary> 2 /// 鹰眼图初始化 3 /// </summary> 4 private void MapHawkEyeControlInitial() 5 { 6 //1、初始化鹰眼图框样式 7 m_DrawPolygonElement = new PolygonElement(); 8 //创建一个线元素符号(用于轮廓线样式) 9 ILineSymbol lineSymbol=new SimpleLineSymbol(); 10 lineSymbol.Color=Color.Red; 11 lineSymbol.Width = 1; 12 //设置面的填充符号 13 IFillSymbol symbol = new SimpleFillSymbol(); 14 symbol.OutlineSymbol = lineSymbol;//设置面的轮廓线颜色 15 symbol.Color = Color.FromArgb(20, Color.Yellow);//设置面的填充色和透明色 16 m_DrawPolygonElement.Symbol = symbol; 17 18 //2、加载pmd 19 LoadPmd(); 20 } 21 22 /// <summary> 23 /// 鹰眼图加载pmd 24 /// </summary> 25 private void LoadPmd() 26 { 27 //选择加载的地图文档 28 OpenFileDialog openDialog = new OpenFileDialog(); 29 openDialog.Filter = "地图文档(*.pmd)|*.pmd"; 30 openDialog.Multiselect = false; 31 if (openDialog.ShowDialog() != DialogResult.OK) return; 32 33 string pmdFilePath = openDialog.FileName; 34 if (string.IsNullOrEmpty(pmdFilePath)) return; 35 mapHawkEyeControl.LoadPmdFile(pmdFilePath); 36 37 //初始化鹰眼图中显示框 38 m_DrawPolygonElement.Geometry = mapHawkEyeControl.ActiveView.Extent as PIE.Geometry.IGeometry;
mapHawkEyeControl.ActiveView.GraphicsContainer.AddElement(m_DrawPolygonElement);
mapHawkEyeControl.ActiveView.PartialRefresh(PIE.Carto.ViewDrawPhaseType.ViewAll); 39 }
二、绘制鹰眼图的显示框
为了便于资源的管理,显示框采用的是面元素(IPolygonElement),m_DrawPolygonElement是一个全局变量,通过只在初始化LoadPmd()的时候添加一次面元素,在相关事件的操作中只改变显示框的位置和大小不改边显示的样式,这样可以使加载的速度更快而且减少内存资源的消耗。
鹰眼图的功能主要包括三种操作,第一:当主地图的范围发生变化的时候,鹰眼图中的范围显示框跟着变化;第二在鹰眼图中左键点击后,主地图以鹰眼图中点击点为中心显示;第三在鹰眼图中右键拉框后,主地图显示鹰眼图拉框绘制的范围;
而绘制显示框,主要发生在主视图和鹰眼图控件相应响应事件中,即mapControlMain的OnExtentUpdated事件和OnMapReplaced事件(暂不做介绍),mapHawkEyeControl控件的MouseDown事件。
1、当主地图mapControlMain范围发生变化时,会触发OnExtentUpdated事件,那么鹰眼图显示框的位置应该跟着发生变化。
1 /// <summary> 2 /// 主地图范围发生变化时 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="sizeChanged"></param> 6 /// <param name="newEnvelope"></param> 7 private void mapControlMain_OnExtentUpdated(object sender, bool sizeChanged, PIE.Geometry.IEnvelope newEnvelope) 8 { 9 if (mapControlMain.ActiveView.FullExtent == null) return; 10 m_DrawPolygonElement.Geometry = newEnvelope as PIE.Geometry.IGeometry; 11 mapHawkEyeControl.ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll); 12 }
2、当鼠标在鹰眼图mapHawkEyeControl控件上左右键操作时,会触发MouseDown事件,然后主地图会发生相应的变化。
1 /// <summary> 2 /// 鹰眼图点击事件 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="e"></param> 6 private void mapHawkEyeControl_MouseDown(object sender, MouseEventArgs e) 7 { 8 if (e.Button==MouseButtons.Left) 9 { 10 PIE.Geometry.IPoint point = new PIE.Geometry.Point(); 11 point = mapHawkEyeControl.ToMapPoint(e.X, e.Y); 12 mapControlMain.ActiveView.PanTo(point); 13 } 14 else if(e.Button==MouseButtons.Right) 15 { 16 PIE.Geometry.IEnvelope envelop = mapHawkEyeControl.TrackRectangle(); 17 mapControlMain.ActiveView.Extent = envelop; 18 } 19 mapControlMain.ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll); 20 }
代码路径:
项目名称 |
百度云盘地址下/PIE示例程序/13.小工具集锦/地图鹰眼图/PIEMapApplication1 |
数据路径 |
百度云盘地址下/PIE示例数据/栅格数据/04.World/World.tif |
视频路径 |
百度云盘地址下/PIE视频教程/13.小工具集锦/地图鹰眼图.avi |
注意:
在地图初始化的时候,图层树控件需要手动绑定地图控件:
tocControlMain.SetBuddyControl(mapControlMain as PIE.Carto.IPmdContents);
效果图: