鷹眼是用於調節全視域範圍內主地圖顯示範圍狀況的副地圖。它體現了地圖總體與詳細局部的關係。html
用戶能夠經過鼠標單擊或者畫框等動做實現鷹眼與主地圖的交互狀況。優化
鷹眼功能的原理是經過主地圖窗口的地圖控件和鷹眼地圖窗口的地圖控件的4個事件便可完成整個實現流程,但這4個事件之間存在必定的邏輯關係。首先咱們瞭解一下這4個事件的觸發條件以及實現的功能。spa
(1)主地圖窗口地圖控件
OnMapReplace_Event事件是在主地圖控件加載地圖文檔或者圖層時觸發,它主要用來完成主地圖與鷹眼地圖的地圖同步工做。
OnExtentUpdated_Event事件是主地圖的Extent(顯示範圍)屬性值發生變化時觸發,主要的功能是在鷹眼地圖窗口上繪製一個線框用來表示主地圖窗口的顯示範圍。code
(2)鷹眼地圖窗口地圖控件htm
主要用來捕捉鼠標在鷹眼地圖上的動做,並調用相應的處理方法,根據用戶的動做改變主地圖的Extent屬性。blog
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開發鷹眼圖的功能(代碼優化篇)
謝謝你們觀看!
原文出處:https://www.cnblogs.com/edcoder/p/11731946.html