较为完整的鹰眼实现,跟大家共享一下

时间:2021-09-03 19:04:55
主要实现了一下几点:
1.加载mxd文件同步;OnMapReplaced事件
2.加载图层文件同步;OnItemAdded事件
3.TOC中图层勾选状态与鹰眼中图层可见状态同步;ContentsChanged事件
4.鹰眼视图中右键框选主视图中显示区域;
5.鹰眼视图中左键单击确定矩形框中心;
6.TOC右键菜单删除图层;
 
 
  using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using ESRI.ArcGIS.Carto;using System.Diagnostics;using ESRI.ArcGIS.Geometry;using ESRI.ArcGIS.Display;using ESRI.ArcGIS.Controls;namespace DEMO1{    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();        }        IActiveViewEvents_Event pAE;        private void axMapControl1_OnMapReplaced(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMapReplacedEvent e)        {            axMapControl2.ClearLayers();//每次主视图地图更换时,清空鹰眼中原有图层            IMap pMap = e.newMap as IMap;//参数e是object类型,要进行接口转换                        int n = pMap.LayerCount;            for (int i = n - 1; i >= 0; i--)            {                axMapControl2.AddLayer(pMap.get_Layer(i));            }            this.pAE = e.newMap as IActiveViewEvents_Event;            pAE.ItemAdded += new IActiveViewEvents_ItemAddedEventHandler(this.OnItemAdded);            pAE.ContentsChanged += new IActiveViewEvents_ContentsChangedEventHandler(pAE_ContentsChanged);        }        void pAE_ContentsChanged()        {            IBasicMap map = null;            ILayer layer = null;            Object other = null;            Object index = null;            esriTOCControlItem item = esriTOCControlItem.esriTOCControlItemNone;            axTOCControl1.GetSelectedItem(ref item, ref map, ref layer, ref other, ref index);            ILayer player;            for (int i = 0; i < axMapControl2.LayerCount; i++)            {                player = axMapControl2.get_Layer(i);                if (player.Name == layer.Name)                {                    if (layer.Visible == true)                        player.Visible = true;                    else                        player.Visible = false;                    axMapControl2.Refresh();                    break;                }            }        }        private void Form1_Load(object sender, EventArgs e)        {            //用代码设置伙伴控件更保险            axTOCControl1.SetBuddyControl(axMapControl1);            axToolbarControl1.SetBuddyControl(axMapControl1);            //禁用鹰眼MapControl的滚轮放大缩小功能            axMapControl2.AutoMouseWheel = false;            IMap pMap;            pMap = axMapControl1.Map;//主视图             pAE = pMap as IActiveViewEvents_Event;            pAE.ItemAdded += new IActiveViewEvents_ItemAddedEventHandler(this.OnItemAdded);            pAE.ContentsChanged+=new IActiveViewEvents_ContentsChangedEventHandler(pAE_ContentsChanged);        }        private void OnItemAdded(object item)        {            ILayer pLayer;            pLayer = item as ILayer;            axMapControl2.AddLayer(pLayer,0);//鹰眼视图            axMapControl2.Refresh();        }        private void axMapControl1_OnExtentUpdated(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnExtentUpdatedEvent e)        {            try            {                ESRI.ArcGIS.Geometry.IEnvelope envelope = (ESRI.ArcGIS.Geometry.IEnvelope)e.newEnvelope;                ESRI.ArcGIS.Carto.IGraphicsContainer gc = axMapControl2.Map as ESRI.ArcGIS.Carto.IGraphicsContainer;                ESRI.ArcGIS.Carto.IActiveView ac = gc as ESRI.ArcGIS.Carto.IActiveView;                //在绘制前,清除axMapControl2中的内容                gc.DeleteAllElements();                ESRI.ArcGIS.Carto.IElement elment = new ESRI.ArcGIS.Carto.RectangleElementClass();                elment.Geometry = envelope;                //设置鹰眼中的红线                //产生一个线符号对象                ESRI.ArcGIS.Display.ILineSymbol outLineSymbol = new ESRI.ArcGIS.Display.SimpleLineSymbolClass();                outLineSymbol.Width = 2;                outLineSymbol.Color = GetColor(255, 0, 0, 255);                //设置颜色属性                //设置填充符号的属性                ESRI.ArcGIS.Display.IFillSymbol fillsymbol = new ESRI.ArcGIS.Display.SimpleFillSymbolClass();                fillsymbol.Color = GetColor(9, 0, 0, 0);                fillsymbol.Outline = outLineSymbol;                ESRI.ArcGIS.Carto.IFillShapeElement fillshapeelement = elment as ESRI.ArcGIS.Carto.IFillShapeElement;                fillshapeelement.Symbol = fillsymbol;                gc.AddElement((ESRI.ArcGIS.Carto.IElement)fillshapeelement, 0);                ac.PartialRefresh(ESRI.ArcGIS.Carto.esriViewDrawPhase.esriViewGraphics, null, null);            }            catch(Exception eCatch)            {                MessageBox.Show(eCatch.ToString()+"\n鹰眼中绘制红色矩形框出错");            }        }        private ESRI.ArcGIS.Display.IRgbColor GetColor(int r, int g, int b, int t)        {            ESRI.ArcGIS.Display.IRgbColor rgb = new ESRI.ArcGIS.Display.RgbColorClass();            rgb.Red = r;            rgb.Green = g;            rgb.Blue = b;            rgb.Transparency = (byte)t;            return rgb;        }        //右键画矩形选定主视图显示范围        private void axMapControl2_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e)        {            if (e.button == 2)            {                try                {                    IPoint pPoint =new PointClass();                    pPoint.X = e.mapX;                    pPoint.Y = e.mapY;                    IEnvelope pEnvelop = axMapControl2.TrackRectangle();                    axMapControl1.Extent = pEnvelop;                }                catch                {                }            }        }        private void axMapControl2_OnMouseMove(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseMoveEvent e)        {            if (e.button == 1)            {                try                {                    IPoint pPoint = new PointClass();                    pPoint.X = e.mapX;                    pPoint.Y = e.mapY;                                        IEnvelope pEnvelop = axMapControl1.Extent as IEnvelope;                    pEnvelop.CenterAt(pPoint);                    IGraphicsContainer pGraphicContainer = axMapControl2.Map as IGraphicsContainer;                    IActiveView pAV = pGraphicContainer as IActiveView;                    pGraphicContainer.DeleteAllElements();                    ESRI.ArcGIS.Carto.IElement elment = new ESRI.ArcGIS.Carto.RectangleElementClass();                    elment.Geometry = pEnvelop;                    //设置鹰眼中的红线                    //产生一个线符号对象                    ESRI.ArcGIS.Display.ILineSymbol outLineSymbol = new ESRI.ArcGIS.Display.SimpleLineSymbolClass();                    outLineSymbol.Width = 2;                    outLineSymbol.Color = GetColor(255, 0, 0, 255);                    //设置颜色属性                    //设置填充符号的属性                    ESRI.ArcGIS.Display.IFillSymbol fillsymbol = new ESRI.ArcGIS.Display.SimpleFillSymbolClass();                    fillsymbol.Color = GetColor(9, 0, 0, 0);                    fillsymbol.Outline = outLineSymbol;                    ESRI.ArcGIS.Carto.IFillShapeElement fillshapeelement = elment as ESRI.ArcGIS.Carto.IFillShapeElement;                    fillshapeelement.Symbol = fillsymbol;                    pGraphicContainer.AddElement((ESRI.ArcGIS.Carto.IElement)fillshapeelement, 0);                    pAV.PartialRefresh(ESRI.ArcGIS.Carto.esriViewDrawPhase.esriViewGraphics, null, null);                }                catch                {                }            }        }        private void axMapControl2_OnMouseUp(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseUpEvent e)        {            if (e.button == 1)            {                try                {                    IPoint pPoint = new PointClass();                    pPoint.X = e.mapX;                    pPoint.Y = e.mapY;                    IEnvelope pEnvelop = axMapControl1.Extent as IEnvelope;                    pEnvelop.CenterAt(pPoint);                    axMapControl1.Extent = pEnvelop;                }                catch                {                                    }            }        }        private void 删除图层ToolStripMenuItem_Click(object sender, EventArgs e)        {            if (SelectedLayer != null)            {                axMapControl1.Map.DeleteLayer(SelectedLayer);                axMapControl2.Map.DeleteLayer(SelectedLayer);                SelectedLayer = null;            }        }        ILayer SelectedLayer;        private void axTOCControl1_OnMouseDown(object sender, ITOCControlEvents_OnMouseDownEvent e)        {            if (e.button == 2)            {                IBasicMap map = null;                ILayer layer = null;                Object other = null;                Object index = null;                esriTOCControlItem item = esriTOCControlItem.esriTOCControlItemNone;                axTOCControl1.HitTest(e.x, e.y, ref item, ref map, ref layer, ref other, ref index);                                if (item == esriTOCControlItem.esriTOCControlItemLayer)                {                    SelectedLayer = layer;                    TOCMenuStrip1.Show(axTOCControl1, e.x, e.y);                }            }        }    }}