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

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 )/,(pActiveView.Extent .YMax+pActiveView .Extent.YMin )/);
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 == )
{//表示鼠标的左键
IActiveView pActiveView = mainMapControl.ActiveView;
IEnvelope pEnvelop = new EnvelopeClass();
switch (pMouseOperate)
{
#region
//拉框放大
case "ZoomIn":
pEnvelop = mainMapControl.TrackRectangle();
//如果拉框的范围为空则返回
if (pEnvelop == null || pEnvelop.IsEmpty || pEnvelop.Height == || pEnvelop.Width == )
{
return;
}
//如果有拉框范围则放大到拉框范围
pActiveView.Extent = pEnvelop;
pActiveView.Refresh();
break;
#endregion
#region
///拉框缩小
case "ZoomOut":
pEnvelop = mainMapControl.TrackRectangle();
//如果拉框范围为空则退出
if (pEnvelop == null || pEnvelop.IsEmpty || pEnvelop.Height == || pEnvelop.Width == )
{
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
#region
case "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开发之地图基本操作(4)

    ArcGIS Engine开发中数据库的加载 1.加载个人地理数据库数据 个人地理数据库(Personal Geodatabase)使用Miscrosoft Access文件(*.mdb)进行空间数据 ...

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

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

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

    地图数据的加载 1.加载地图文档 ArcGIS Engine支持加载多种类型的数据,有矢量数据的Coverage.Shapefile.dwg/dxf文件,栅格数据的BMP.GRID.控件数据库等.很多 ...

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

    ArcGIS提供的各类数据形式以及相应接口 1. 空间数据 在GIS软件中,空间数据有多种不同的形式存在.按照不同的划分标准可以分为矢量数据和栅格数据.GIS格式数据和非GIS格式数据(CAD格式). ...

  5. ArcGIS Engine开发之地图导出

    关于地图导出的方法有很多,但是核心技术就那么一点.下面是从项目实战中总结的一部分地图导出的方法:(以全域导出和区域导出为例) 1.由于地图导出用到的函数和方法容易重复,增加了工作量故首先将其进行封装成 ...

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

    C#,ArcGIS Engine开发入门教程 转自:http://blog.csdn.net/yanleigis/article/details/2233674  目录(?)[+] 五实现 一 加载A ...

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

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

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

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

  9. ArcGIS Engine开发鹰眼图的功能(基础篇)

    鹰眼是用于调节全视域范围内主地图显示范围情况的副地图.它体现了地图整体与详细局部的关系. 用户可以通过鼠标单击或者画框等动作实现鹰眼与主地图的交互情况. 鹰眼功能的原理是通过主地图窗口的地图控件和鹰眼 ...

随机推荐

  1. 不要着急改代码,先想想--centos 6.8下编译安装tmux

    诸位读者新年好,2017开年第一篇博客,请允许我先问候一下看到这篇博客的诸位.写博客是我2017年定下的目标之一,希望我会坚持下去. 最近打算尝试一下tmux这个神器,于是有了这一篇关于思维方式的Bl ...

  2. 《MSSQL2008技术内幕:T-SQL语言基础》读书笔记(上)

    索引: 一.SQL Server的体系结构 二.查询 三.表表达式 四.集合运算 五.透视.逆透视及分组 六.数据修改 七.事务和并发 八.可编程对象 一.SQL Server体系结构 1.1 数据库 ...

  3. JS模块化开发:使用SeaJs高效构建页面

    一.扯淡部分 很久很久以前,也就是刚开始接触前端的那会儿,脑袋里压根没有什么架构.重构.性能这些概念,天真地以为前端===好看的页面,甚至把js都划分到除了用来写一些美美的特效别无它用的阴暗角落里,就 ...

  4. C#开源实现MJPEG流传输

    本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 许久以前写了篇文章<基于.NET打造IP智能网络视频监控系统>,记录和介绍了自己几年来积 ...

  5. ASP.NET MVC 视图(二)

    ASP.NET MVC 视图(二) 前言 上篇中对于视图引擎只是做了简单的演示,对于真正的理解视图引擎的工作过程可能还有点模糊,本篇将会对由MVC框架提供给我们的Razor视图引擎的整个执行过程做一个 ...

  6. Android开发学习之路-LeakCanary使用

    LeakCanary是一个内存泄漏检测库,它可以在我们的应用发生内存泄漏的时候发出提醒,提醒包括通知和Log.GitHub 这个库使用起来比较简单: ①添加依赖: dependencies { deb ...

  7. Asp.Net Mvc通用后台管理系统,bootstrap+easyui+权限管理+ORM

    产品清单: 1.整站源码,非编译版,方便进行业务的二次开发 2.通用模块与用户等基础数据的数据库脚本 3.bootstrap3.3.1 AceAdmin模板源码 4.easyui1.3.5源码 5.F ...

  8. Redis数据结构详解之Zset(五)

    序言 Zset跟Set之间可以有并集运算,因为他们存储的数据字符串集合,不能有一样的成员出现在一个zset中,但是为什么有了set还要有zset呢?zset叫做有序集合,而set是无序的,zset怎么 ...

  9. 聊聊excel生成图片的几种方式

    目录     I:需求.  II:实现思路.     III:实现方式.     IV:优缺点分析.     V:结论.     VI:wps安装与配置. 正文 1.需求:把excel生成等比的图片. ...

  10. 【Oracle 集群】Linux下Oracle RAC集群搭建之Oracle DataBase安装(八)

    Oracle 11G RAC数据库安装(八) 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇总 ...