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
物件進行賦值,然後再呼叫axMapControl
的CenterAt
方法改變主檢視的顯示範圍。
/// <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.重新整理檢視,讓新增的元素可以顯示出來。
通過axMapControl
的IActiveView
的PartialRefresh
方法進行重新整理
axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
或者通過介面跳轉到IActiveView
IActiveView pActiveView = pGraphicsContainer as IActiveView;
pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
其中esriViewDrawPhase.esriViewGraphics
為列舉值表示繪製註釋。