- GIS论坛-GIS空间站 ( http://bbs.gissky.net/Default.asp )
-- 编程技术交流 ( http://bbs.gissky.net/ShowForum.asp?forumid=22 )
--- [分享]鹰眼的另一种表现 ( http://bbs.gissky.net/ShowPost.asp?id=44000 )


作者:Andyjiang
发表时间:2008-5-2 16:33:18

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Controls;
/*
 * 鹰眼视图的简单实现,只是通过拖动鹰眼视图的区域实现在主视图中的显示:
 */
namespace OverView
{
    public partial class MainForm : Form
    {
        #region "界面初始化"

        public MainForm()
        {
            InitializeComponent();
        }

        private void MainForm_Load(object sender, EventArgs e)
        {
            try
            {
                string strFileName = Application.StartupPath + @"\数据\房地产策划信息系统.mxd";
                //在数据视图中加载地图,供查询操作
                if (axMapControl2.CheckMxFile(strFileName))
                {
                    axMapControl2.LoadMxFile(strFileName);
                }
                else
                {
                    MessageBox.Show("错误的数据路径:" + strFileName);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error01 in MainForm.cs" + ex.Message);
            }
        }

        #endregion "界面初始化"

        #region "鹰眼地图"

        /* 实现功能:
         * 1、鹰眼控件会根据主控件的视图范围生成一个来导航
         * 2、在鹰眼控件里点击左键移动,红色距形框会跟着鼠标移动,主控件的视图范围会根据红色距形框位置而做出相应的移动
         * 3、在鹰眼控件中可以通过按住鼠标右键来拖动,生成一个新的红色距形框,来导航         
         * 实现步骤如下(通过多个例子综合而成,write by booker,2008.4.12
         */
        //1.鹰眼地图资源载入
        //当数据视图文档发生变化后,把文档加载到鹰眼视图的地图控件axMapControl1中
        private void axMapControl2_OnMapReplaced(object sender, IMapControlEvents2_OnMapReplacedEvent e)
        {
            //加载地图文档到MapControl中
            axMapControl1.LoadMxFile(axMapControl2.DocumentFilename, null, null);
            //设置MapControl显示范围至数据的全局范围
            axMapControl1.Extent = axMapControl1.FullExtent;
        }

        //2.绘制鹰眼矩形框
        private void axMapControl2_OnExtentUpdated(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnExtentUpdatedEvent e)
        {
            // 得到新范围
            IEnvelope pEnv = (IEnvelope)e.newEnvelope;
            IGraphicsContainer pGra = axMapControl1.Map as IGraphicsContainer;
            IActiveView pAv = pGra as IActiveView;
            //在绘制前,清除鹰眼axMapControl1中的任何图形元素
            pGra.DeleteAllElements();
            IRectangleElement pRectangleEle = new RectangleElementClass();
            IElement pEle = pRectangleEle as IElement;
            pEle.Geometry = pEnv;
            //设置鹰眼图中的红线框
            IRgbColor pColor = new RgbColorClass();
            pColor.Red = 255;
            pColor.Green = 0;
            pColor.Blue = 0;
            pColor.Transparency = 255;
            //产生一个线符号对象
            ILineSymbol pOutline = new SimpleLineSymbolClass();
            pOutline.Width = 2;
            pOutline.Color = pColor;
            //设置颜色属性
            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;
            IFillShapeElement pFillShapeEle = pEle as IFillShapeElement;
            pFillShapeEle.Symbol = pFillSymbol;
            pGra.AddElement((IElement)pFillShapeEle, 0);
            //刷新
            pAv.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
        }

        //3. 实现互动
        private void axMapControl1_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e)
        {
            /*
            IPoint pPt = new PointClass();
            pPt.PutCoords(e.mapX, e.mapY);
            //改变主控件的视图范围
            axMapControl2.CenterAt(pPt);
            */
            if (e.button == 1)
            {
                IPoint pPt = new PointClass();
                pPt.X = e.mapX;
                pPt.Y = e.mapY;
                IEnvelope pEnvelope = this.axMapControl1.TrackRectangle();
                this.axMapControl2.Extent = pEnvelope;
            }
        }

        private void axMapControl1_OnMouseMove(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseMoveEvent e)
        {
            if (e.button == 1)
            {
                IPoint pPt = new PointClass();
                pPt.X = e.mapX;
                pPt.Y = e.mapY;
                //
                IEnvelope pEnvelope = this.axMapControl2.Extent as IEnvelope;
                pEnvelope.CenterAt(pPt);
                this.axMapControl2.Extent = pEnvelope;
            }
        }

        #endregion "鹰眼地图"
    }
}



作者:tsing_feng
发表时间:2008-5-3 22:35:29

Good


发表您的观点,进入该主题参与讨论...


作者:GIS攀登
发表时间:2008-5-4 9:59:00

Very Good!


发表您的观点,进入该主题参与讨论...


作者:兔八哥
发表时间:2008-5-5 8:26:49

赞一个。


发表您的观点,进入该主题参与讨论...


作者:王明亮
发表时间:2008-6-8 0:31:46

呵呵 ,为什么在vb+mapx下就能很容易实现的功能要用这么复杂的过程去完成呢 ?当然很欣赏楼主的资源公用风格,


发表您的观点,进入该主题参与讨论...


作者:zhuminglong
发表时间:2008-7-23 15:47:58

谢谢楼主,这代码对我很有用啊!


发表您的观点,进入该主题参与讨论...


作者:gzstyxb
发表时间:2008-8-10 11:53:19

有更好的做法,就是把该功能封装成独立的组件。这样便于独立、重复使用。


发表您的观点,进入该主题参与讨论...


Powered by GIS空间站 © 2002-2007