地图的浏览功能包括缩放、移动、量测旋转等。

1、放大与缩小

无论是放大还是缩小,都是通过改变MapControl中当前视图的范围Extent属性来实现的,主要用到包络线(Envelope)类。

包络线是一个矩形区域,它是一个几何形体的最小包络边框,每一个Geometry对象都拥有一个包络线对象。包络线通过它的最大与最小X,Y坐标来定义一个矩形形状,因此包络线对象相对于它的空间参考而言总是直角。IEnvelop接口是Expand方法的用于缩放包络线的范围,进而产生一个新的包络线对象,从而实现放大和缩放。

实现的思路:

1)固定比例尺放大是以当前视图的中心点为缩放中心对地图进行放大。在放大的操作中记下MapControl当前的Extent。

2)把该范围缩小

3)设置MapControl的extent 属性为缩小后的范围,由于MapControl本身的尺寸没有变化,这样就实现了放大的效果。

Expend函数的参数说明

参数 描述
dx,dy 必须,分别表示x,y轴方向上的增量
asRatio 表示是否按比例进行改变,当为false时,扩张以加法走形式进行,Xmin=Xmin-dx,Ymin=Ymin-dy,Xmax=Xmax+dx,Ymax=Ymax+dy,当为true时,扩张以乘法形式进行。无论如何中心位置不会改变

放大代码:

IEnvelope pEnvelop = mainMapControl.Extent;pEnvelop.Expand(0.5,0.5,true );//设置放大的倍数mainMapControl.Extent = pEnvelop;mainMapControl.ActiveView.Refresh();

缩小代码:

IActiveView pActiveView = mainMapControl.ActiveView;IPoint centPoint = new PointClass();centPoint.PutCoords((pActiveView .Extent.XMin+pActiveView .Extent .XMax )/2,(pActiveView.Extent .YMax+pActiveView .Extent.YMin )/2);IEnvelope pEnvelop=pActiveView .Extent ;pEnvelop .Expand (1.5,1.5,true);//与放大的区别在于expand的参数不同
            pActiveView .Extent .CenterAt (centPoint );pActiveView .Extent=pEnvelop ;pActiveView .Refresh ();

2、拉框放大与缩小、漫游与全图

拉框放大及时用鼠标拖出来的矩形放大到数据视图额整个范围。

拉框放大缩小用到的TrackRectangle方法。该方法在MapControl的OnMouseDown事件中触发,会在MapControl上生成一个由用户鼠标轨迹定义的矩形橡皮筋。该方法返回一个IPolygon接口的几何对象。在方法的执行过程中,MapControl的OnMouseDown事件被触发,这时还没有发生MapControl的onMouseUp事件,所以追踪时按下ESC键可以取消TrackRectangle的操作。

1)拉框放大的思路

使用Envelope获取鼠标拖出的矩形橡皮筋范围值赋给当前的视图,若矩形的范围为空则返回。

 mainMapControl.CurrentTool = null;pMouseOperate = "ZoomIn";mainMapControl.MousePointer = esriControlsMousePointer.esriPointerZoomIn;

2)拉框缩小

 mainMapControl.CurrentTool = null;pMouseOperate = "ZoomOut";mainMapControl.MousePointer = esriControlsMousePointer.esriPointerZoomOut;

3)漫游

 mainMapControl.CurrentTool = null;pMouseOperate = "Pan";mainMapControl.MousePointer = esriControlsMousePointer.esriPointerPan;


4)调用MapControl MouseDown事件

 private void mainMapControl_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e){//将屏幕的坐标转换为地图的坐标点
IPoint pPoint = (mainMapControl.Map as IActiveView).ScreenDisplay.DisplayTransformation.ToMapPoint(e.x, e.y);if (e.button == 1){//表示鼠标的左键IActiveView pActiveView = mainMapControl.ActiveView;IEnvelope pEnvelop = new EnvelopeClass();switch (pMouseOperate){#region//拉框放大case "ZoomIn":pEnvelop = mainMapControl.TrackRectangle();//如果拉框的范围为空则返回if (pEnvelop == null || pEnvelop.IsEmpty || pEnvelop.Height == 0 || pEnvelop.Width == 0){return;}//如果有拉框范围则放大到拉框范围pActiveView.Extent = pEnvelop;pActiveView.Refresh();break;#endregion#region///拉框缩小case "ZoomOut":pEnvelop = mainMapControl.TrackRectangle();//如果拉框范围为空则退出if (pEnvelop == null || pEnvelop.IsEmpty || pEnvelop.Height == 0 || pEnvelop.Width == 0){return;}else  //如果有拉框范围、则以拉框范围为中心,缩小倍数为当前视图范围/拉框范围
                        {double dWidth = pActiveView.Extent.Width * pActiveView.Extent.Width / pEnvelop.Width;double dHeight = pActiveView.Extent.Height * pActiveView.Extent.Height / pEnvelop.Height;double dXmin = pActiveView.Extent.MMin - ((pEnvelop.MMin - pActiveView.Extent.MMin) * pActiveView.Extent.Width / pEnvelop.Width);double dYmin = pActiveView.Extent.YMin - ((pEnvelop.YMin - pActiveView.Extent.YMin) * pActiveView.Extent.Height / pEnvelop.Height);double dXmax = dXmin + dWidth;double dYmax = dYmin + dHeight;pEnvelop.PutCoords(dXmin, dYmin, dXmax, dYmax);}pActiveView.Extent = pEnvelop;pActiveView.Refresh();break;#endregion#region      ///漫游case "Pan":mainMapControl.Pan();break;#endregion#regioncase "Null":mainMapControl.CurrentTool = null;break;#endregion}}


3、历史视图的切换

历史视图切换就是快速地在前视图和后视图之间快速的切换,上一视图命令可以快速地回退到最后一次地图操作以前的地图范围,下一视图命令和上一视图恰好相反。实现该功能需要用到IExtentStack接口,即堆扩展接口。该接口提供了访问控制范围内堆栈员的方法。主要的接口方法如下:

方法 描述
Canredo 是否存在一个能够重做的视图
CanUndo 是否存在一个能够撤销的视图
Redo 重做到下一视图范围
Undo 撤销到上一视图

实现思路:

1)新建一个ExtentStack对象来存储历史视图,并赋予视图窗口中的视图堆。

2)判断是否能回到前一视图或后一视图,如果能,则视图窗口中视图中视图返回到上一视图和下一视图。

3)返回前一视图命令的实现。

 /// <summary>/// 返回前一视图操作/// </summary>/// <param name="sender"></param>/// <param name="e"></param>/// 定义全局变量
        IExtentStack pExtentStack;private void btnUndo_ItemClick(object sender, ItemClickEventArgs e){pExtentStack = mainMapControl.ActiveView.ExtentStack;//判断是否可以回到前一视图,第一个视图没有前视图if (pExtentStack.CanRedo()){pExtentStack.Undo();btnBackView.Enabled = true;//后一视图的按钮可以使用if (!pExtentStack.CanRedo()){btnForWardView.Enabled = false;//前一视图的按钮不可以使用
                }}mainMapControl.ActiveView.Refresh();}/// <summary>/// 返回到前一视图的操作/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnRedo_ItemClick(object sender, ItemClickEventArgs e){pExtentStack = mainMapControl.ActiveView.ExtentStack;//判断是否可以回到后一视图,最后一个视图没有后一视图if (pExtentStack.CanRedo()){pExtentStack.Redo();btnForWardView.Enabled = true;//前一视图按钮可以使用if (!pExtentStack.CanRedo()){btnBackView.Enabled = false;}}mainMapControl.ActiveView.Refresh();}

ArcGIS Engine开发之地图浏览相关推荐

  1. ArcGIS Engine开发之地图基本操作(3)

    地图数据的加载 一.加载Shapefile数据 Shapefile文件是目前主流的一种空间数据的文件存储方式,也是不同GIS软件进行数据格式转换常用的中间格式.加载Shapefile数据的方式有两种: ...

  2. 【转】使用ArcGIS Engine开发ArcGIS Server的胖客户端浏览程序

    摘要:在ArcGIS 9的家族中,增加了两个新产品:ArcGIS Engine和ArcGIS Server.由于它们各自分别在C/S领域和B/S领域的强大开发能力,一经推出就备受瞩目.其中ArcGIS ...

  3. ArcGIS Engine开发基础总结(一)

    标准Engine功能 地图浏览    地图制作 数据查询 数据分析 及 所有的开发控件 -MapControl, PageLayout, Toolbar, TOC, ArcReader 对所有矢量和栅 ...

  4. C#,ArcGIS Engine开发入门教程

    利用ArcGIS Engine.VS .NET和Windows控件开发GIS应用 Dixon整理 此过程说明适合那些使用.NET建立和部署应用的开发者,它描述了使用ArcGIS控件建立和部署应用的方法 ...

  5. GIS二次开发:实验一 ArcGIS Engine 开发初步

    实验一 ArcGIS Engine 开发初步 一.实验目的 掌握ArcGIS Engine的安装: 熟悉ArcGIS Engine中几个常用的控件: 搭建第一个简单的ArcGIS Engine 程序: ...

  6. ArcGIS Engine开发前基础知识(2)

    ArcGIS基本控件简介 ArcGIS Engine控件是一组可视化的开发组件,每个ArcGIS Engine控件都是一个COM组件.这些组件包括MapControl,PageLayoutContro ...

  7. ArcGIS Engine开发:框架/结构+对象库

    ArcGIS Engine开发:框架/结构+对象库 框架/结构: ArcGIS Engine 开发人员有权使用一系列的控制器,这些控制器 准许很多属性.事件和方法的使用.尽管一个简单的应用软件 仅仅通 ...

  8. 使用ArcGIS Engine来实现地图的点击查询并闪烁

    使用ArcGIS Engine来实现地图的点击查询并闪烁 ArcGIS Engine没有提供在MapControl中点击查询的命令,只是提供了ReaderControl中的使用的点击查询的命令,下面的 ...

  9. ArcGIS Engine开发---图层符号化

    使用ServerStyle 如果熟悉ArcGIS Desktop的使用,就会对Style符号库文件有所了解,相对应的在ArcGIS Engine开发中对应的是ServerStyle符号库,它的结构体系 ...

最新文章

  1. 十步,教你把Python运行速度提升 30%
  2. 串联矩阵matlab代码,Matlab串联矩阵函数【horzcat】详细解析
  3. OpenGL Primitive Restart原始重启的实例
  4. 计算机会计的专业知识竞赛,会计知识大赛主持词范文
  5. 使用MATLAB GUI创建图形用户界面GUI
  6. php自动验证,ThinkPHP 自动验证及验证规则详解
  7. IBM x3650 光盘安装linux,IBM X3650 M3服务器安装SUSE LINUX 10实战
  8. 图解 CSS (2): border - 边框
  9. python中seek(10、1)_Python中index()和seek()的用法(详解)
  10. winform定义数据源名称_C#中数据源绑定DataSource以及相关控件(DataGridView)的使用总结...
  11. Word:转换PDF
  12. 网站seo优化一定要注意这几件事
  13. ct扫描方式有哪些_日联科技x-ray:工业CT是怎么进行X射线的断层扫描的
  14. kettle和spoon ETL数据同步工具
  15. linux终端下打开pdf文件,如何从终端打开PDF文件?
  16. 工程师,请把你的英语磨锐
  17. 通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(五)
  18. php关注账号,一键关注微信公众平台账号
  19. 磁盘分区MBR与GPT详解
  20. 使用Windows批处理+ImageMagick 实现批量处理图片

热门文章

  1. ArcGIS和COORD软件进行坐标七参数转换的方法
  2. 更改谷歌浏览器默认安装位置(实用!)
  3. orcal入门,这一章足够
  4. 解决server pool中没有servers的问题
  5. 5年海外工作经验,硕士归国没有适合我的位置???
  6. Browserify使用指南(转)
  7. log in stackflow
  8. card allocation
  9. git导出修改新增文件指定分支、月份、用户作者
  10. 折腾一天安装Centos7,以及后面恢复Win7引导的曲折历程