鷹眼是用於調節全視域范圍內主地圖顯示范圍情況的副地圖。它體現了地圖整體與詳細局部的關系。
用戶可以通過鼠標單擊或者畫框等動作實現鷹眼與主地圖的交互情況。
鷹眼功能的原理是通過主地圖窗口的地圖控件和鷹眼地圖窗口的地圖控件的4個事件即可完成整個實現流程,但這4個事件之間存在一定的邏輯關系。首先我們了解一下這4個事件的觸發條件以及實現的功能。
(1)主地圖窗口地圖控件
OnMapReplace_Event事件是在主地圖控件加載地圖文檔或者圖層時觸發,它主要用來完成主地圖與鷹眼地圖的地圖同步工作。
OnExtentUpdated_Event事件是主地圖的Extent(顯示范圍)屬性值發生變化時觸發,主要的功能是在鷹眼地圖窗口上繪制一個線框用來表示主地圖窗口的顯示范圍。
(2)鷹眼地圖窗口地圖控件
主要用來捕捉鼠標在鷹眼地圖上的動作,並調用相應的處理方法,根據用戶的動作改變主地圖的Extent屬性。
OnMouseDown_Event事件在鼠標單擊(左鍵移動,右鍵選取視域范圍)觸發
OnMouseMove_Event事件在鼠標移動時觸發。
(1)主地圖窗口地圖控件
OnMapReplace_Event事件是在主地圖控件加載地圖文檔或者圖層時觸發,它主要用來完成主地圖與鷹眼地圖的地圖同步工作。
/// <summary> /// 主地圖OnMapReplaced事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void axMapControl1_OnMapReplaced(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMapReplacedEvent e) { //主地圖有地圖或圖層的時候鷹眼加載圖層 if (axMapControl1.LayerCount > 0) { axMapControl2.ClearLayers(); //先清除鷹眼的地圖 //圖層自下而上加載,防止要素間互相壓蓋 for (int i = axMapControl1.Map.LayerCount - 1; i >= 0; i--) { axMapControl2.AddLayer(axMapControl1.get_Layer(i)); } //設置鷹眼地圖魚主地圖相同空間參考系 //必要:防止由於圖層放置順序改變而改變了鷹眼的空間參考系 axMapControl2.SpatialReference = axMapControl1.SpatialReference; //設置鷹眼的顯示范圍=完整顯示(FullExtent) axMapControl2.Extent = axMapControl2.FullExtent; //每次加載或者刪除圖層之后都要刷新一次MapControl axMapControl2.Refresh(); } }
OnExtentUpdated_Event事件是主地圖的Extent(顯示范圍)屬性值發生變化時觸發,主要的功能是在鷹眼地圖窗口上繪制一個線框用來表示主地圖窗口的顯示范圍。
/// <summary> /// 主地圖OnExtentUpdated事件(使用面要素刷新) /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void axMapControl1_OnExtentUpdated(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnExtentUpdatedEvent e) { //刷新axMapControl2 axMapControl2.Refresh(); //以主地圖的Extent作為鷹眼紅線框的大小范圍 IEnvelope pEnvelope = axMapControl1.Extent; //鷹眼強制轉換為IGraphicsContainer //IGraphicsContainer是繪圖容器接口, 主要功能是在MapControl控件類上添加繪圖要素。 IGraphicsContainer pGraphicsContainer = axMapControl2.Map as IGraphicsContainer; //鷹眼強制轉換為pActiveView IActiveView pActiveView = pGraphicsContainer as IActiveView; //刪除鷹眼原有要素 pGraphicsContainer.DeleteAllElements(); //實例化矩形框要素 IRectangleElement pRectangleElement = new RectangleElementClass(); //強轉矩形要素框為要素 IElement pElement = pRectangleElement as IElement; //賦值幾何實體的最小外接矩形, 即包絡線 pElement.Geometry = pEnvelope; //使用面要素刷新(存在覆蓋注釋問題) DrawPolyline2(pGraphicsContainer, pActiveView, pElement); } /// <summary> /// 使用面要素刷新(存在覆蓋注釋問題) /// </summary> /// <param name="pGraphicsContainer"></param> /// <param name="pActiveView"></param> /// <param name="pElement"></param> private static void DrawPolyline2(IGraphicsContainer pGraphicsContainer, IActiveView pActiveView, IElement pElement) { //以下代碼設置要素外框邊線的顏色、透明度屬性 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 = new RgbColorClass(); pColor.NullColor = true; //以下代碼設置要素內部的填充顏色、邊線符號屬性 IFillSymbol pFillSymbol = new SimpleFillSymbolClass(); pFillSymbol.Color = pColor; pFillSymbol.Outline = pOutline; //實現線框的生成 IFillShapeElement pFillShapeElement = pElement as IFillShapeElement; pFillShapeElement.Symbol = pFillSymbol; pGraphicsContainer.AddElement((IElement)pFillShapeElement, 0); //刷新鷹眼視圖的填充要素(繪圖框) pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, pFillShapeElement, null); }
(2)鷹眼地圖窗口地圖控件
主要用來捕捉鼠標在鷹眼地圖上的動作,並調用相應的處理方法,根據用戶的動作改變主地圖的Extent屬性。
OnMouseDown_Event事件在鼠標單擊(左鍵移動,右鍵選取視域范圍)觸發
/// <summary> /// 鷹眼地圖的OnMouseDown事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void axMapControl2_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e) { if (axMapControl2.LayerCount > 0) { //如果e.button==1, 則表示按下的是鼠標左鍵 if (e.button == 1) { axMapControl2.Refresh(); //捕捉鼠標單擊時的地圖坐標 IPoint pPoint = new PointClass(); pPoint.PutCoords(e.mapX, e.mapY); //將地圖的中心點移動到鼠標點擊的點pPoint axMapControl1.CenterAt(pPoint); axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null); } else if (e.button == 2) {//如果e.button==2, 則表示按下的是鼠標右鍵 //鷹眼地圖的TrackRectangle()方法, 隨着鼠標拖動得到一個矩形框 IEnvelope pEnvelope = axMapControl2.TrackRectangle(); axMapControl1.Extent = pEnvelope;//鼠標拖動生成的矩形框范圍 axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null); } } }
OnMouseMove_Event事件在鼠標移動時觸發。
/// <summary> /// 鷹眼地圖的OnMouseMove事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void axMapControl2_OnMouseMove(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseMoveEvent e) { //如果e.button==1, 則表示按下的是鼠標左鍵 if (e.button == 1) { axMapControl2.Refresh(); //捕捉鼠標單擊時的地圖坐標 IPoint pPoint = new PointClass(); pPoint.PutCoords(e.mapX, e.mapY); //將地圖的中心點移動到鼠標點擊的點pPoint axMapControl1.CenterAt(pPoint); axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null); } }
下一篇:ArcGIS Engine開發鷹眼圖的功能(代碼優化篇)
謝謝大家觀看!