鷹眼圖,是GIS的一個基本功能,在鷹眼圖上能夠像從空中俯視同樣查看地圖框中所顯示的地圖在整個圖中的位置,是對全局地圖的一種概述表達,可以起到很好的空間提示和導航的做用。網上有不少Arcengine 二次開發的相關的鷹眼圖的例子,思路差很少。 如今呢,具體介紹下基於咱們PIE SDK是如何實現這基本工具鷹眼圖功能的基本實現。工具
要實現鷹眼圖功能主要就是經過兩個mapControl控件,主地圖控件是mapControlMain,鷹眼圖控件是mapHawkEyeControl,實現關鍵點有兩點:一、如何使兩個控件使用的數據保持一致;二、如何繪製鷹眼圖控件中的顯示框。spa
1、數據:爲了更好的便於讀者理解,鷹眼圖的數據採用靜止數據(非動態數據),即當地圖初始化的時候鷹眼圖就自動加載一個地圖文檔。code
1 /// <summary> 2 /// 鷹眼圖初始化 3 /// </summary> 4 private void MapHawkEyeControlInitial() 5 { 6 //一、初始化鷹眼圖框樣式 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 //二、加載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 }
2、繪製鷹眼圖的顯示框視頻
爲了便於資源的管理,顯示框採用的是面元素(IPolygonElement),m_DrawPolygonElement是一個全局變量,經過只在初始化LoadPmd()的時候添加一次面元素,在相關事件的操做中只改變顯示框的位置和大小不改邊顯示的樣式,這樣可使加載的速度更快並且減小內存資源的消耗。blog
鷹眼圖的功能主要包括三種操做,第一:當主地圖的範圍發生變化的時候,鷹眼圖中的範圍顯示框跟着變化;第二在鷹眼圖中左鍵點擊後,主地圖以鷹眼圖中點擊點爲中心顯示;第三在鷹眼圖中右鍵拉框後,主地圖顯示鷹眼圖拉框繪製的範圍;教程
而繪製顯示框,主要發生在主視圖和鷹眼圖控件相應響應事件中,即mapControlMain的OnExtentUpdated事件和OnMapReplaced事件(暫不作介紹),mapHawkEyeControl控件的MouseDown事件。事件
一、當主地圖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 }
二、當鼠標在鷹眼圖mapHawkEyeControl控件上左右鍵操做時,會觸發MouseDown事件,而後主地圖會發生相應的變化。ci
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);
效果圖: