ArcGIS Engine開發之鷹眼視圖


鷹眼是GIS軟件的必備功能之一。它是一個MapControl控件,主要用來表示數據視圖中的地理范圍在全圖中的位置。

鷹眼一般具有的功能:

1)鷹眼視圖與數據視圖的地理范圍保持同步。

2)數據視圖的當前范圍能夠在鷹眼視圖中用一個矩形框標示出來。若數據視圖的顯示范圍發生變化,鷹眼視圖中的矩形框位置也會發生變化。

3)在鷹眼中操作視圖,數據視圖中的地理范圍也將同步調整。當鷹眼中用鼠標點擊時,數據視圖能夠移動到被點擊的位置。拖動矩形框可以調整數據視圖中的地圖顯示范圍;在鷹眼視圖上拖動矩形框時,數據視圖能夠以全圖顯示矩形框內的內容。

具體的開發過程:

1)進行鷹眼變量的定義(全局變量)

1  //鷹眼相關變量的定義
2         private bool bCanDrag;//鷹眼地圖上的矩形可移動的標志
3         private IPoint pMoveRectPoint;//記錄在移動鷹眼地圖上的矩形框時鼠標的位置
4         private IEnvelope pEnv;//記錄數據視圖的Extent

2)鷹眼中數據與數據視圖中的數據一致,且鷹眼視圖中的地圖始終顯示為全圖。當數據視圖加載地圖數據時,同時也把數據加載到鷹眼控件中,考慮到鷹眼中只能添加個別全局性的圖層,這里需要對地圖數據進行過濾,逐一添加到鷹眼中。其中Map Control 的OnMapReplaced事件只能在*.mxd文件打開時觸發,加載單一圖層時不被觸發,故將封裝一個單獨的鷹眼同步的方法:

 1  #region 同步鷹眼視圖的方法封裝
 2         private void SynchronizeEagleEye()
 3         {
 4             if (EagleEyeMapControl.LayerCount > 0)
 5             {
 6                 EagleEyeMapControl.ClearLayers();
 7             }
 8             //設置鷹眼和MainMapcontrol中地圖的坐標系統一致
 9             EagleEyeMapControl.SpatialReference = mainMapControl.SpatialReference;
10             for (int i = mainMapControl.LayerCount - 1; i >= 0; i--)
11             {
12                 //是鷹眼視圖與數據視圖的圖層上下順序保持一致
13                 ILayer pLayer = mainMapControl.get_Layer(i);
14                 if (pLayer is IGroupLayer || pLayer is ICompositeLayer)
15                 {
16                     ICompositeLayer pCompositeLayer = (ICompositeLayer)pLayer;
17                     for (int j = pCompositeLayer.Count - 1; j >= 0; j--)
18                     {
19                         ILayer pSubLayer = pCompositeLayer.get_Layer(i);
20                         IFeatureLayer pFeatureLayer = pSubLayer as IFeatureLayer;
21                         if (pFeatureLayer != null)
22                         {
23                             if (pFeatureLayer.FeatureClass.ShapeType != esriGeometryType.esriGeometryPoint && pFeatureLayer.FeatureClass.ShapeType != esriGeometryType.esriGeometryMultipoint)
24                             {
25                                 EagleEyeMapControl.AddLayer(pLayer);
26                             }
27                         }
28                     }
29                 }
30                 else
31                 {
32                     IFeatureLayer pFeatureLayer = pLayer as IFeatureLayer;
33                     if (pFeatureLayer != null)
34                     {
35                         if (pFeatureLayer.FeatureClass.ShapeType != esriGeometryType.esriGeometryPoint && pFeatureLayer.FeatureClass.ShapeType != esriGeometryType.esriGeometryMultipoint)
36                         {
37                             EagleEyeMapControl.AddLayer(pLayer);
38                         }
39                     }
40                     //設置鷹眼地圖的全圖顯示
41                     EagleEyeMapControl.Extent = mainMapControl.FullExtent;
42                     pEnv = mainMapControl.Extent as IEnvelope;
43                     DrawRectangle(pEnv);
44                     EagleEyeMapControl.ActiveView.Refresh();
45                 }
46             }
47         }
48         #endregion

3)封裝好同步鷹眼的方法后,分別在mainMapControl的OnMapReplaced事件和其他操作中進行方法的調用。
4)定義獲取RGB顏色的方法,用來渲染鷹眼中的矩形框和后期其他功能的使用。

 1  #region 獲取RGB顏色
 2         private IRgbColor GetRgbColor(int intR, int intG, int intB)
 3         {
 4             IRgbColor pRgbColor = null;
 5             if (intR < 0 || intR > 255 || intG < 0 || intG > 255 || intB < 0 || intB > 255)
 6             {
 7                 return pRgbColor;
 8             }
 9             pRgbColor = new RgbColorClass();
10             pRgbColor.Red = intR;
11             pRgbColor.Green = intG;
12             pRgbColor.Blue = intB;
13             return pRgbColor;
14         }
15         #endregion

5)封裝繪制矩形框的方法

 1  #region 鷹眼中矩形框繪制的方法封裝
 2         private void DrawRectangle(IEnvelope pEnvelop)
 3         {
 4             //在繪制前,清除鷹眼中之前繪制的矩形框
 5             IGraphicsContainer pGraphicsContainer = EagleEyeMapControl.Map as IGraphicsContainer;
 6             IActiveView pActiveView = pGraphicsContainer as IActiveView;
 7             pGraphicsContainer.DeleteAllElements();
 8             //得到當前視圖范圍
 9             IRectangleElement pRectangleElement = new RectangleElementClass();
10             IElement pElement = pRectangleElement as IElement;
11             pElement.Geometry = pEnvelop;
12             //設置矩形框(實質為中間透明度面)
13             IRgbColor pColor = new RgbColorClass();
14             pColor = GetRgbColor(255, 0, 0);
15             pColor.Transparency = 255;
16             ILineSymbol pOutLine = new SimpleLineSymbolClass();
17             pOutLine.Width = 1;
18             pOutLine.Color = pColor;
19 
20             IFillSymbol pFillSymbol = new SimpleFillSymbolClass();
21             pColor = new RgbColorClass();
22             pColor.Transparency = 0;
23             pFillSymbol.Color = pColor;
24             pFillSymbol.Outline = pOutLine;
25             //向鷹眼中添加矩形框
26             IFillShapeElement pFillShapeElement = pElement as IFillShapeElement;
27             pFillShapeElement.Symbol = pFillSymbol;
28             pGraphicsContainer.AddElement((IElement)pFillShapeElement, 0);
29             //刷新
30             pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
31         }
32         #endregion

6)實現矩形框和數據視圖的聯動。當數據視圖的顯示范圍發生變化時,會觸發OnExtentUpdate事件,在該事件中繪制鷹眼視圖中的方框。獲取數據視圖中的地圖顯示范圍作為矩形框范圍,添加到鷹眼視圖中。

1 private void mainMapControl_OnExtentUpdated(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnExtentUpdatedEvent e)
2         {
3             //得到當前視圖范圍
4             IEnvelope pEnvelop = (IEnvelope)e.newEnvelope;
5             DrawRectangle(pEnvelop);
6         }

7)實現矩形框的拖動和繪制

思路:1.在鷹眼的操作時,若是鼠標左鍵鍵點擊,判斷鼠標點擊是否在矩形框之內。若在則可以進行矩形框的拖動;若不在則使數據視圖以當前點擊點為中心進行顯示。

2.當鼠標右鍵點擊時,可以進行矩形框的繪制,使數據視圖的地圖顯示為矩形框范圍。

代碼:

 1   #region 鷹眼視圖的OnMouseDown事件
 2         private void EagleEyeMapControl_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e)
 3         {
 4             if (EagleEyeMapControl.Map.LayerCount > 0)
 5             {
 6                 //按下鼠標左鍵,移動矩形框
 7                 if (e.button == 1)
 8                 {
 9                     //如果指針落在鷹眼的矩形框中,標記可移動
10                     if (e.mapX > pEnv.XMin && e.mapY > pEnv.YMin && e.mapX < pEnv.XMax && e.mapY < pEnv.YMax)
11                     {
12                         bCanDrag = true;
13                     }
14                     pMoveRectPoint = new PointClass();
15                     pMoveRectPoint.PutCoords(e.mapX, e.mapY);//記錄點擊的第一個點的坐標
16                     mainMapControl.AutoKeyboardScrolling = true;
17                     mainMapControl.AutoMouseWheel = true;
18                 }
19                 //按下鼠標右鍵,繪制矩形框
20                 else if (e.button == 2)
21                 {
22                     IEnvelope pEnvelop = EagleEyeMapControl.TrackRectangle();
23                     IPoint pTemPoint = new PointClass();
24                     pTemPoint.PutCoords(pEnvelop.XMin + pEnvelop.Width / 2, pEnvelop.YMin + pEnvelop.Height / 2);
25                     mainMapControl.Extent = pEnvelop;
26                     //矩形框的高度和數據視圖的高度不一定成正比,這里做一個中心調整
27                     mainMapControl.CenterAt(pTemPoint);
28                     mainMapControl.AutoKeyboardScrolling = true;
29                     mainMapControl.AutoMouseWheel = true;
30                 }
31             }
32 
33         }
34         #endregion

8)在鷹眼視圖的OnMouseMove 事件中實現矩形框的移動

 1  #region 鷹眼視圖的OnMouseMove事件
 2         private void EagleEyeMapControl_OnMouseMove(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseMoveEvent e)
 3         {
 4             if (e.mapX > pEnv.XMin && e.mapY > pEnv.YMin && e.mapX < pEnv.XMax && e.mapY < pEnv.YMax)
 5             {
 6                 //如果鼠標移動到矩形框中,鼠標編程小手,表示可以移動
 7                 EagleEyeMapControl.MousePointer = esriControlsMousePointer.esriPointerHand;
 8                 if (e.button == 2)//如果在內部點點擊鼠標右鍵,將鼠標演示設置為默認樣式
 9                 {
10                     EagleEyeMapControl.MousePointer = esriControlsMousePointer.esriPointerDefault;
11                     mainMapControl.AutoKeyboardScrolling = true;
12                     mainMapControl.AutoMouseWheel = true;
13                 }
14             }
15             else
16             {
17                 //在其位置將鼠標設為默認樣式
18                 EagleEyeMapControl.MousePointer = esriControlsMousePointer.esriPointerDefault;
19                 mainMapControl.AutoKeyboardScrolling = true;
20                 mainMapControl.AutoMouseWheel = true;
21             }
22             if (bCanDrag)
23             {
24                 double Dx, Dy;//記錄鼠標移動的距離
25                 Dx = e.mapX - pMoveRectPoint.X;
26                 Dy = e.mapY - pMoveRectPoint.Y;
27                 pEnv.Offset(Dx, Dy);//根據偏移量更改pEnv位置
28                 pMoveRectPoint.PutCoords(e.mapX, e.mapY);
29                 DrawRectangle(pEnv);
30                 mainMapControl.Extent = pEnv;
31             }
32 
33         }
34         #endregion

9)在鷹眼視圖的OnMouseUp事件中判斷鼠標是否點擊

 1  #region 鷹眼視圖的OnMouseUp事件
 2         private void EagleEyeMapControl_OnMouseUp(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseUpEvent e)
 3         {
 4             if (e.button == 1 && pMoveRectPoint != null)
 5             {
 6                 if (e.mapX == pMoveRectPoint.X && e.mapY == pMoveRectPoint.Y)
 7                 {
 8                     mainMapControl.CenterAt(pMoveRectPoint);
 9                 }
10                 bCanDrag = false;
11             }
12             
13         }
14         #endregion

綜上述,一個鷹眼功能成功的實現


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM