AE实现类似于魔兽争霸地图的鹰眼效果

using System;
using System.Collections.Generic;
using System.Text;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.SystemUI;


namespace WMS.Class
{
    public class OverViewManager
    {


        #region 字段
        private AxMapControl MainMap;
        private AxMapControl OverViewMap;


        private IFillShapeElement _OverViewElement = new RectangleElementClass();//鹰眼图Element
        private IEnvelope _CurrentEnveop = null;
        protected bool _LeftButtonDown = false;
        #endregion


        #region 构造器
        public OverViewManager(AxMapControl sMainMap, AxMapControl sOverViewMap)
        {
            MainMap = sMainMap;
            OverViewMap = sOverViewMap;
            OverViewMap.Extent = OverViewMap.FullExtent;
            
            _OverViewElement.Symbol = DefineSimpleFillSymbol();
            _CurrentEnveop = MainMap.Extent;
            MainMap.OnExtentUpdated += new IMapControlEvents2_Ax_OnExtentUpdatedEventHandler(MainMap_OnExtentUpdated);
            MainMap.OnMapReplaced += new IMapControlEvents2_Ax_OnMapReplacedEventHandler(MainMap_OnMapReplaced);
            MainMap.OnViewRefreshed += new IMapControlEvents2_Ax_OnViewRefreshedEventHandler(MainMap_OnViewRefreshed);
            OverViewMap.OnMouseMove += new IMapControlEvents2_Ax_OnMouseMoveEventHandler(OverViewMap_OnMouseMove);
            OverViewMap.OnMouseDown += new IMapControlEvents2_Ax_OnMouseDownEventHandler(OverViewMap_OnMouseDown);
            OverViewMap.OnMouseUp += new IMapControlEvents2_Ax_OnMouseUpEventHandler(OverViewMap_OnMouseUp);


            InitOverViewMap(OverViewMap.Extent);
        }


        
        #endregion
        
        #region 地图事件
        /// <summary>
        /// 该事件在地图加载MXD文档时触发
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void MainMap_OnMapReplaced(object sender, IMapControlEvents2_OnMapReplacedEvent e)
        {
            OverViewMap.ClearLayers();
            int count = MainMap.LayerCount;
            for (int i = count - 1; i >= 0; i--)
            {
                ILayer layer = MainMap.get_Layer(i);
                OverViewMap.AddLayer(layer);
            }
            InitOverViewMap(OverViewMap.Extent);
        }


        protected void MainMap_OnExtentUpdated(object sender, IMapControlEvents2_OnExtentUpdatedEvent e)
        {
            UpdateOverViewMap(e.newEnvelope as IEnvelope);
        }
        /// <summary>
        /// 该事件主要用于在添加图层后,主鹰眼视图图层一致
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void MainMap_OnViewRefreshed(object sender, IMapControlEvents2_OnViewRefreshedEvent e)
        {
            int count = MainMap.LayerCount;
            if (count != OverViewMap.LayerCount)
            {
                OverViewMap.ClearLayers();
                for (int i = count - 1; i >= 0; i--)
                {
                    ILayer layer = MainMap.get_Layer(i);
                    OverViewMap.AddLayer(layer);
                }
                InitOverViewMap(OverViewMap.Extent);
                UpdateOverViewMap(MainMap.Extent);
            } 
        }
        #endregion


        #region 鹰眼图事件
       
        protected void OverViewMap_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
        {
            if (e.button == 1)
            {
                _LeftButtonDown = true;
                IPoint cPt = new PointClass();
                cPt.X = e.mapX; cPt.Y = e.mapY;
                _CurrentEnveop.CenterAt(cPt);
                MainMap.Extent = _CurrentEnveop;
            }
        }


        protected void OverViewMap_OnMouseMove(object sender, IMapControlEvents2_OnMouseMoveEvent e)
        {
            if (_LeftButtonDown)
            {
                IPoint cPt = new PointClass();
                cPt.X = e.mapX; cPt.Y = e.mapY;
                _CurrentEnveop.CenterAt(cPt);
                MainMap.Extent = _CurrentEnveop;
            }
        }


        protected void OverViewMap_OnMouseUp(object sender, IMapControlEvents2_OnMouseUpEvent e)
        {
            _LeftButtonDown = false;
        }


        #endregion


        #region 私有方法
        private void InitOverViewMap(IEnvelope evp)
        {
            if (MainMap.SpatialReference == null)
            {
                ISpatialReferenceFactory m_SpFactory = new SpatialReferenceEnvironment();
                ISpatialReference psp = m_SpFactory.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984);
                MainMap.SpatialReference = psp;
            }
            OverViewMap.SpatialReference = MainMap.SpatialReference;


            evp.Expand(-evp.Width*0.38, -evp.Height*0.4, false);
            IElement element = _OverViewElement as IElement;
            element.Geometry = evp;
            OverViewMap.ActiveView.GraphicsContainer.DeleteAllElements();
            OverViewMap.ActiveView.GraphicsContainer.AddElement(element, 0);
            OverViewMap.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
        }


        private void UpdateOverViewMap(IEnvelope evp)
        {      
            _CurrentEnveop = evp;
            IPoint pt = new PointClass();
            pt.X = evp.XMax - evp.Width / 2;
            pt.Y = evp.YMax - evp.Height / 2;
            IEnvelope evp2 = ((IElement)_OverViewElement).Geometry.Envelope;
            evp2.CenterAt(pt);


            IElement element=(IElement)_OverViewElement;
            element.Geometry = evp2;
            OverViewMap.ActiveView.GraphicsContainer.UpdateElement(element);
            OverViewMap.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
        }


        private ISimpleFillSymbol DefineSimpleFillSymbol()
        {
            ISimpleFillSymbol _SimpleFillSymbol = new SimpleFillSymbolClass();


            IRgbColor rgbColor = new RgbColorClass();
            rgbColor.Red = 0;
            rgbColor.Green = 255;
            rgbColor.Blue = 0;
            rgbColor.Transparency = 255;
            ILineSymbol lineSymbol = new SimpleLineSymbolClass();
            lineSymbol.Width = 1.5;
            lineSymbol.Color = rgbColor;


            IRgbColor rgbColor2 = new RgbColorClass();
            rgbColor2.Red = 255;
            rgbColor2.Green = 0;
            rgbColor2.Blue = 0;
            rgbColor2.Transparency = 0;
            _SimpleFillSymbol.Color = rgbColor2;


            _SimpleFillSymbol.Outline = lineSymbol;
            return _SimpleFillSymbol;
        }
        public void OverViewLodMxd(string pFilePath)
        {
            OverViewMap.LoadMxFile(pFilePath);
        }
        #endregion
  
        
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值