ArcEngine开发——地图浏览

对于GIS来说,地图的浏览功能(包括大小缩放、漫游、历史视图控制等)是一项最基础的功能,在所有的GIS系统中都要求实现。利用ArcEngine开发的GIS中实现这些功能不止一种方法。当然最简单的方法是利用ArcEngine的内置Command控件来与地图显示控件进行交互,另外也可以通过ArcEngine类库的相应接口和方法来实现。本文结合一个入门级实例讲述不同方法来实现地图浏览功能。

先上效果图,如下:

2010-11-28_131310

用ArcEngine内置的Command控件来实现上图所示功能简直易如反掌,实例化对应的Command对象并显式的运行它,即可。比如中心放大和前一视图功能的实现代码如下:

          //中心放大
        ESRI.ArcGIS.SystemUI.ICommand pCmd = new ControlsMapZoomInFixedCommandClass();
           pCmd.OnCreate(pMapControl.Object);
           pCmd.OnClick();
 
            //前一视图
         ESRI.ArcGIS.SystemUI.ICommand pCmd = new ControlsMapZoomToLastExtentBackCommandClass();
            pCmd.OnCreate(pMapControl.Object);
            pCmd.OnClick();

其它几个浏览功能如中心缩小、拉框缩小、漫游、后一视图、全幅显示等都可以按同样的方式来实现,就不一一列举了。下面讲解一下实现地图浏览功能的其它方式。

中心放大功能。放大功能实际上是缩小了显式窗口中的显示范围。可利用IEnvelope接口的Expand方法,功能实现代码如下:

           //中心放大
         pIClone = (IClone)axMapControl1.Extent;
            pIEnvelope = (IEnvelope)pIClone.Clone();
            pIEnvelope.Expand(0.5, 0.5, true);
            axMapControl1.Extent = pIEnvelope;

除此之外,还可以利用IEnvelope接口的PutCoords方法,功能实现代码如下:

            dWidth = axMapControl1.Extent.Width;
            dHeight = axMapControl1.Extent.Height;
            pIEnvelope = new EnvelopeClass();
            pIEnvelope.PutCoords(axMapControl1.Extent.XMin + dWidth / 4, axMapControl1.Extent.YMin + dHeight / 4, axMapControl1.Extent.XMax - dWidth / 4, axMapControl1.Extent.YMax - dHeight / 4);
            axMapControl1.Extent = pIEnvelope;

拉框放大功能。该功能的实现很简单,单单这一句axMapControl1.Extent = axMapControl1.TrackRectangle()就可以了。

拉框缩小功能。该功能的实现稍微麻烦一些。也是利用IEnvelope接口的PutCoords方法,重新确定地图显示范围。代码如下:

            pRectangle = axMapControl1.TrackRectangle();
            dWidth=axMapControl1.Extent.Width*(axMapControl1.Extent.Width/pRectangle.Width);
            dHeight = axMapControl1.Extent.Height * (axMapControl1.Extent.Height / pRectangle.Height);
            pIEnvelope = new EnvelopeClass();
            @pIEnvelope.PutCoords(axMapControl1.Extent.XMin-(pRectangle.XMin - axMapControl1.Extent.XMin) * (axMapControl1.Extent.Width / pRectangle.Width),
            axMapControl1.Extent.YMin-(pRectangle.YMin - axMapControl1.Extent.YMin) * (axMapControl1.Extent.Height / pRectangle.Height),
            axMapControl1.Extent.XMin - (pRectangle.XMin - axMapControl1.Extent.XMin) * (axMapControl1.Extent.Width / pRectangle.Width) + dWidth,
            axMapControl1.Extent.YMin - (pRectangle.YMin - axMapControl1.Extent.YMin) * (axMapControl1.Extent.Height / pRectangle.Height) + dHeight);
            axMapControl1.Extent = pIEnvelope;

历史视图功能。可利用IExtentStack接口的Undo和Redo方法来实现。只需要在地图视图发生变化时,将视图范围存储于一个相应的堆栈里面,然后利用Undo和Redo方法切换到对应的历史视图。

在地图窗口的OnExtentUpdated事件里添加该代码:pExtentStack = axMapControl1.ActiveView.ExtentStack;前一视图的实现代码如下:

            if (pExtentStack.CanUndo())
            {
                pExtentStack.Undo();
                axMapControl1.ActiveView.Refresh();
            }

其它功能代码都是与上述代码类似。不再详细给出实现代码了。

窗体界面效果是借助了第三方组件DotNetBar,关于DotNetBar的入门级用法可参考http://www.cnblogs.com/hans_gis/archive/2010/07/13/1776817.htmlhttp://www.cnblogs.com/hans_gis/archive/2010/08/07/1794863.html

posted @ 2010-11-28 15:21  百折不回  阅读(3347)  评论(8编辑  收藏  举报