1. 程式人生 > >ArcGIS Engine 開發 (五)鷹眼功能的實現,將影象元素(element)顯示在檢視上的步驟

ArcGIS Engine 開發 (五)鷹眼功能的實現,將影象元素(element)顯示在檢視上的步驟

ArcGIS Engine 基於C#的開發

介面

之前在介面的左下角加了一個小的mapControl這個就是用來顯示鷹眼檢視的,如圖: 在這裡插入圖片描述

思路

關鍵有兩點: 1,主控制元件axMapControl1和鷹眼控制元件axMapControl2資料的共享(保持一致); 2,如何繪製鷹眼控制元件中的顯示方框,然後讓主檢視的顯示範圍根據鷹眼檢視中的顯示方框發生相應變化。

主要用到的介面

:IEnvelope是指地物的外接矩形; :Map 物件通過 IGraphicsContainer 介面來管理這些元素物件。 :地圖除了地理資料外,還可以擁有元素(Element),主要分為:圖形元素(graphic element)和框架元素(frame element)

主控制元件axMapControl1和鷹眼控制元件axMapControl2資料的共享

        /// <summary>
        /// 地圖發生改變事件
        /// </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)
            {
                for (int i = 0; i <= axMapControl1.Map.LayerCount - 1; ++i)
                {
                    axMapControl2.Map.AddLayer(axMapControl1.Map.get_Layer(i));
                }
                axMapControl2.Extent = axMapControl1.FullExtent;//設定鷹眼檢視為全域性檢視
                axMapControl2.Refresh();
            }
        }

滑鼠在鷹眼檢視上的點選和移動事件

過程為先例項一個point物件,然後將當前鷹眼檢視的mapX,Y座標通過PutCoords方法對point物件進行賦值,然後再呼叫axMapControlCenterAt方法改變主檢視的顯示範圍。

        /// <summary>
        /// 鷹眼檢視上滑鼠點選事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void axMapControl2_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e)
        {
            if (axMapControl2.Map.LayerCount > 0)
            {
                if (e.button == 1)//左鍵將所點選的位置,設定為主檢視的中心
                {
                    IPoint pPoint = new PointClass();
                    pPoint.PutCoords(e.mapX, e.mapY);//設定point物件的座標
                    axMapControl1.CenterAt(pPoint);
                    axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
                }
                else if (e.button == 2)//右鍵拉框範圍設定為主檢視顯示範圍
                {
                    IEnvelope pEnv = axMapControl2.TrackRectangle();//獲得拉框的範圍
                    axMapControl1.Extent = pEnv;
                    axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
                }
            }

        }
        /// <summary>
        /// 鷹眼檢視上滑鼠移動事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void axMapControl2_OnMouseMove(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseMoveEvent e)
        {
            if (e.button == 1)//左鍵點選移動,倆個檢視聯動
            {
                IPoint pPoint = new PointClass();
                pPoint.PutCoords(e.mapX, e.mapY);
                axMapControl1.CenterAt(pPoint);
                axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
            }
        }

主檢視檢視範圍變化,對鷹眼檢視進行畫框

        /// <summary>
        /// 主窗體檢視範圍變化
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void axMapControl1_OnExtentUpdated(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnExtentUpdatedEvent e)
        {
            //獲得當前地圖檢視的外包矩形
            IEnvelope pEnvelope = (IEnvelope)e.newEnvelope;
            //獲得GraphicsContainer物件
            IGraphicsContainer pGraphicsContainer = axMapControl2.Map as IGraphicsContainer;

            IActiveView pActiveView = pGraphicsContainer as IActiveView;
            //清除物件中的所有圖形元素
            pGraphicsContainer.DeleteAllElements();
            
            //獲得矩形圖形元素
            IRectangleElement pRectangleEle = new RectangleElementClass();
            IElement pElement = pRectangleEle as IElement;
            pElement.Geometry = pEnvelope;
           
            //設定FillShapeElement物件的symbol
            IFillShapeElement pFillShapeEle = pElement as IFillShapeElement;
            pFillShapeEle.Symbol = getFillSymbol();
            //進行填充
            pGraphicsContainer.AddElement((IElement)pFillShapeEle, 0);
            //重新整理檢視
            pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
        }
        /// <summary>
        /// 獲得鷹眼檢視顯示方框的symbol
        /// </summary>
        /// <returns></returns>
        private IFillSymbol getFillSymbol()
        {
            //矩形框的邊界線顏色
            IRgbColor pColor = new RgbColorClass();
            pColor.Red = 255;
            pColor.Green = 0;
            pColor.Blue = 0;
            pColor.Transparency = 255;
            //邊界線
            ILineSymbol pOutline = new SimpleLineSymbolClass();
            pOutline.Width = 3;
            pOutline.Color = pColor;
            //symbol的背景色
            pColor = new RgbColorClass();
            pColor.Red = 255;
            pColor.Green = 0;
            pColor.Blue = 0;
            pColor.Transparency = 0;
            //獲得顯示的圖形元素
            IFillSymbol pFillSymbol = new SimpleFillSymbolClass();
            pFillSymbol.Color = pColor;
            pFillSymbol.Outline = pOutline;
            return pFillSymbol;
        }

重點: 將影象元素顯示在檢視上一般的步驟為:

1. 產生一個新的元素物件(element);

主要分為:圖形元素(graphic element)和框架元素(frame element),這裡的鷹眼檢視中新增的元素為矩形圖形元素,通過

IRectangleElement pRectangleEle = new RectangleElementClass();
IElement pElement = pRectangleEle as IElement;

例項RectangleElement物件,然後再跳轉到RectangleElementClass實現的IElement介面上。

2.確定元素(element)顯示時使用的Symbol(符號)和Geometry(幾何形體物件);

這裡Geometry(幾何形體物件)比較好確定通過事件引數,然後呼叫其屬性直接獲得其外包矩形

IEnvelope pEnvelope = (IEnvelope)e.newEnvelope;
pElement.Geometry = pEnvelope;

但是要注意的是設定Symbol(符號)屬性卻不屬於IElement介面的範疇,它屬於IFillShapeElement介面的規範內容所有要先由IElement介面跳轉到IFillShapeElement介面,然後再將getFillSymbol()方法獲取到的Symbol(符號)賦值給該物件。

IFillShapeElement pFillShapeEle = pElement as IFillShapeElement;
 pFillShapeEle.Symbol = getFillSymbol();

3.使用IGraphicsContainer.AddElement把元素新增到檢視中去;、 之前在主要使用到的介面中說到我們通過GraphicsContainer物件來管理元素物件,我們可以通過IMap介面跳轉到該介面

IGraphicsContainer pGraphicsContainer = axMapControl2.Map as IGraphicsContainer;

然後可以通過該物件清除圖形元素:

pGraphicsContainer.DeleteAllElements();

最後將獲得的元素(element),新增到檢視中去

pGraphicsContainer.AddElement((IElement)pFillShapeEle, 0);

4.重新整理檢視,讓新增的元素可以顯示出來。 通過axMapControlIActiveViewPartialRefresh方法進行重新整理

axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);

或者通過介面跳轉到IActiveView

IActiveView pActiveView = pGraphicsContainer as IActiveView;
pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);

其中esriViewDrawPhase.esriViewGraphics為列舉值表示繪製註釋。