放大鏡,在地圖的瀏覽過程當中在主地圖和次地圖中起到很好的輔助做用,函數
要實現放大鏡功能主要就是經過兩個mapControl控件,主地圖控件是mapControlMain,放大鏡控件是UserControl_Magnifier,實現關鍵點有兩點:一、如何使兩個控件使用的數據保持一致;二、如何繪製放大鏡中的元素框。工具
當主地圖添加地圖圖層數據就會觸發接口IActiveViewEvents接口中的地圖添加事件OnLayerAdded,或者圖層的刪除等操做,放大鏡的控件就會將圖層數據添加到放大鏡視圖中。 mapControl1表明的是放大鏡中的地圖控件spa
1 /// <summary> 2 /// 加載事件 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="e"></param> 6 private void UserControl_MagnifyingGlass_Load(object sender, EventArgs e) 7 { 8 if (!m_BInitialized) return; 9 load(); 10 addElement(); 11 IActiveViewEvents activeViewEvents = (IActiveViewEvents)m_ActiveView; 12 activeViewEvents.OnLayerAdded += activeViewEvents_OnLayerAdded; 13 activeViewEvents.OnLayerDeleted += activeViewEvents_OnLayerDeleted; 14 } 15 16 /// <summary> 17 /// OnLayerAdded事件 18 /// </summary> 19 /// <param name="layer"></param> 20 void activeViewEvents_OnLayerAdded(ILayer layer) 21 { 22 load(); 23 addElement(); 24 } 25 /// <summary> 26 /// 加載函數 27 /// </summary> 28 private void load() { 29 if (!m_BInitialized) return; 30 mapControl1.FocusMap = m_ActiveView.FocusMap.Clone(); 31 mapControl1.Extent = m_ActiveView.Extent; 32 mapControl1.ActiveView.DisplayTransformation.MapScale =3; mapControl1.PartialRefresh(ViewDrawPhaseType.ViewAll); 33 }
顯示框採用的是曲線元素和線元素(ILineElemnet和ICurveElement)。code
放大鏡的功能主要包括兩種操做,第一:當鼠標在主地圖上移動的時候,放大鏡的範圍以鼠標移動的地方爲中心按照必定的比例進行顯示,圓和十字元素的中心就是放大鏡地圖的中心,本示例中比例固定設置爲3,放大鏡地圖中的範圍顯示框跟着變化;第二,主地圖的視圖範圍發生變化時,放大鏡地圖的顯示範圍和顯示框也會跟着變化。orm
一、當鼠標在主地圖上移動的時候,會觸發MouseMove事件,那麼放大鏡的地圖範圍就會以鼠標所移動的座標爲中心進行範圍顯示。視頻
1 /// <summary> 2 /// MouseMove事件 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="e"></param> 6 private void mapControl_MouseMove(object sender, MouseEventArgs e) 7 { 8 IMapControl mapControl = m_Application.MapControl; 9 IMapControl mapControl1 = m_Magnifier.GetMapControl(); 10 PIE.Geometry.IPoint point = mapControl.ToMapPoint(e.X, e.Y); 11 m_Point = point; 12 mapControl1.CenterAt(point); 13 m_Magnifier.addElement(); 14 } 15 16 /// <summary> 17 /// 添加準星函數(繪製放大鏡地圖中的顯示框一個圓和一個十字形) 18 /// </summary> 19 public void addElement() { 20 IEnvelope extent = mapControl1.Extent; 21 IGraphicsContainer graphicsContainer = mapControl1.ActiveView.GraphicsContainer; 22 graphicsContainer.DeleteAllElements(); 23 24 IPointCollection line1 = new Polyline(); 25 line1.AddPoint((extent.XMin + extent.XMax) / 2, extent.YMin); 26 line1.AddPoint((extent.XMin + extent.XMax) / 2, extent.YMax); 27 28 ILineSymbol symbol = new SimpleLineSymbol(); 29 symbol.Color = Color.Red; 30 31 ILineElement lineElement1 = new LineElement(); 32 lineElement1.Geometry = line1 as IGeometry; 33 lineElement1.Symbol = symbol; 34 35 IPointCollection line2 = new Polyline(); 36 line2.AddPoint(extent.XMin, (extent.YMin + extent.YMax) / 2); 37 line2.AddPoint(extent.XMax, (extent.YMin + extent.YMax) / 2); 38 ILineElement lineElement2 = new LineElement(); 39 lineElement2.Geometry = line2 as IGeometry; 40 lineElement2.Symbol = symbol; 41 42 IArc arc = new Arc(); 43 arc.PutCoords((extent.XMin + extent.XMax) / 2, (extent.YMin + extent.YMax) / 2); 44 arc.StartAngle = 0; 45 arc.EndAngle = 360; 46 arc.SemiMajor = (extent.XMax - extent.XMin) / 4; 47 arc.SemiMinor = (extent.XMax - extent.XMin) / 4; 48 49 ICurveElement curveElement = new CurveElement(); 50 curveElement.Geometry = arc as IGeometry; 51 curveElement.Symbol = symbol; 52 53 graphicsContainer.AddElement(lineElement1); 54 graphicsContainer.AddElement(lineElement2); 55 graphicsContainer.AddElement(curveElement); 56 57 mapControl1.PartialRefresh(ViewDrawPhaseType.ViewAll); 58 } 59 /// <summary> 60 /// OnVisibleBoundsUpdated事件 61 /// </summary> 62 /// <param name="displayTransformation"></param> 63 /// <param name="bVisibleBoundChanged"></param> 64 private void TransformEvent_OnVisibleBoundsUpdated(IDisplayTransformation displayTransformation, bool bVisibleBoundChanged) 65 { 66 IMapControl mapControl1 = m_Magnifier.GetMapControl(); 67 68 PIE.Carto.IActiveView activeView = m_HookHelper.ActiveView; 69 PIE.Geometry.IPoint point = (activeView.Extent as PIE.Geometry.IGeometry).Centroid(); 70 mapControl1.ActiveView.PanTo(point); 71 mapControl1.ActiveView.DisplayTransformation.MapScale = 3; 72 73 mapControl1.CenterAt(m_Point); 74 m_Magnifier.addElement(); 75 mapControl1.PartialRefresh(ViewDrawPhaseType.ViewAll); 76 }
二、當主地圖mapControlMain範圍發生變化時,會觸發OnVisibleBoundsUpdated事件,那麼放大鏡的顯示框的位置和範圍應跟着發生變化。blog
1 ITransformEvents transformEvent = (ITransformEvents)activeView.DisplayTransformation; transformEvent.OnVisibleBoundsUpdated += TransformEvent_OnVisibleBoundsUpdated; 2 /// <summary> 3 /// OnVisibleBoundsUpdated事件 4 /// </summary> 5 /// <param name="displayTransformation"></param> 6 /// <param name="bVisibleBoundChanged"></param> 7 private void TransformEvent_OnVisibleBoundsUpdated(IDisplayTransformation displayTransformation, bool bVisibleBoundChanged) 8 { 9 IMapControl mapControl1 = m_Magnifier.GetMapControl(); 10 11 PIE.Carto.IActiveView activeView = m_HookHelper.ActiveView; 12 PIE.Geometry.IPoint point = (activeView.Extent as PIE.Geometry.IGeometry).Centroid(); 13 mapControl1.ActiveView.PanTo(point); 14 mapControl1.ActiveView.DisplayTransformation.MapScale = 3; 15 16 mapControl1.CenterAt(m_Point); 17 m_Magnifier.addElement(); 18 mapControl1.PartialRefresh(ViewDrawPhaseType.ViewAll); 19 }
代碼路徑:教程
項目名稱接口 |
百度雲盤地址下/PIE示例程序/13.小工具集錦/地圖平移校訂/ PIEMapApplication1事件 |
數據路徑 |
百度雲盤地址下/PIE示例數據/柵格數據/04.World/World.tif |
視頻路徑 |
百度雲盤地址下/PIE視頻教程/13.小工具集錦/地圖放大鏡.avi |
注意:
在地圖初始化的時候,圖層樹控件須要手動綁定地圖控件:
tocControlMain.SetBuddyControl(mapControlMain as PIE.Carto.IPmdContents);