鷹眼是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
綜上述,一個鷹眼功能成功的實現