ArcGIS Engine开发鹰眼图的功能(基础篇)
鹰眼是用于调节全视域范围内主地图显示范围情况的副地图。它体现了地图整体与详细局部的关系。
用户可以通过鼠标单击或者画框等动作实现鹰眼与主地图的交互情况。

鹰眼功能的原理是通过主地图窗口的地图控件和鹰眼地图窗口的地图控件的4个事件即可完成整个实现流程,但这4个事件之间存在一定的逻辑关系。首先我们了解一下这4个事件的触发条件以及实现的功能。
(1)主地图窗口地图控件
OnMapReplace_Event事件是在主地图控件加载地图文档或者图层时触发,它主要用来完成主地图与鹰眼地图的地图同步工作。
OnExtentUpdated_Event事件是主地图的Extent(显示范围)属性值发生变化时触发,主要的功能是在鹰眼地图窗口上绘制一个线框用来表示主地图窗口的显示范围。
(2)鹰眼地图窗口地图控件
主要用来捕捉鼠标在鹰眼地图上的动作,并调用相应的处理方法,根据用户的动作改变主地图的Extent属性。
OnMouseDown_Event事件在鼠标单击(左键移动,右键选取视域范围)触发
OnMouseMove_Event事件在鼠标移动时触发。

(1)主地图窗口地图控件
OnMapReplace_Event事件是在主地图控件加载地图文档或者图层时触发,它主要用来完成主地图与鹰眼地图的地图同步工作。
/// <summary>
/// 主地图OnMapReplaced事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void axMapControl1_OnMapReplaced(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMapReplacedEvent e)
{
//主地图有地图或图层的时候鹰眼加载图层
if (axMapControl1.LayerCount > )
{
axMapControl2.ClearLayers(); //先清除鹰眼的地图
//图层自下而上加载,防止要素间互相压盖
for (int i = axMapControl1.Map.LayerCount - ; i >= ; i--)
{
axMapControl2.AddLayer(axMapControl1.get_Layer(i));
}
//设置鹰眼地图鱼主地图相同空间参考系
//必要:防止由于图层放置顺序改变而改变了鹰眼的空间参考系
axMapControl2.SpatialReference = axMapControl1.SpatialReference;
//设置鹰眼的显示范围=完整显示(FullExtent)
axMapControl2.Extent = axMapControl2.FullExtent;
//每次加载或者删除图层之后都要刷新一次MapControl
axMapControl2.Refresh();
}
}
OnExtentUpdated_Event事件是主地图的Extent(显示范围)属性值发生变化时触发,主要的功能是在鹰眼地图窗口上绘制一个线框用来表示主地图窗口的显示范围。
/// <summary>
/// 主地图OnExtentUpdated事件(使用面要素刷新)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void axMapControl1_OnExtentUpdated(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnExtentUpdatedEvent e)
{
//刷新axMapControl2
axMapControl2.Refresh();
//以主地图的Extent作为鹰眼红线框的大小范围
IEnvelope pEnvelope = axMapControl1.Extent;
//鹰眼强制转换为IGraphicsContainer
//IGraphicsContainer是绘图容器接口, 主要功能是在MapControl控件类上添加绘图要素。
IGraphicsContainer pGraphicsContainer = axMapControl2.Map as IGraphicsContainer;
//鹰眼强制转换为pActiveView
IActiveView pActiveView = pGraphicsContainer as IActiveView;
//删除鹰眼原有要素
pGraphicsContainer.DeleteAllElements();
//实例化矩形框要素
IRectangleElement pRectangleElement = new RectangleElementClass();
//强转矩形要素框为要素
IElement pElement = pRectangleElement as IElement;
//赋值几何实体的最小外接矩形, 即包络线
pElement.Geometry = pEnvelope; //使用面要素刷新(存在覆盖注释问题)
DrawPolyline2(pGraphicsContainer, pActiveView, pElement);
}
/// <summary>
/// 使用面要素刷新(存在覆盖注释问题)
/// </summary>
/// <param name="pGraphicsContainer"></param>
/// <param name="pActiveView"></param>
/// <param name="pElement"></param>
private static void DrawPolyline2(IGraphicsContainer pGraphicsContainer, IActiveView pActiveView, IElement pElement)
{
//以下代码设置要素外框边线的颜色、透明度属性
IRgbColor pColor = new RgbColorClass();
pColor.Red = ;
pColor.Green = ;
pColor.Blue = ;
pColor.Transparency = ; //以下代码设置要素外框边线的颜色、宽度属性
ILineSymbol pOutline = new SimpleLineSymbolClass();
pOutline.Width = ;
pOutline.Color = pColor;
pColor = new RgbColorClass();
pColor.NullColor = true; //以下代码设置要素内部的填充颜色、边线符号属性
IFillSymbol pFillSymbol = new SimpleFillSymbolClass();
pFillSymbol.Color = pColor;
pFillSymbol.Outline = pOutline; //实现线框的生成
IFillShapeElement pFillShapeElement = pElement as IFillShapeElement;
pFillShapeElement.Symbol = pFillSymbol;
pGraphicsContainer.AddElement((IElement)pFillShapeElement, ); //刷新鹰眼视图的填充要素(绘图框)
pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, pFillShapeElement, null);
}
(2)鹰眼地图窗口地图控件
主要用来捕捉鼠标在鹰眼地图上的动作,并调用相应的处理方法,根据用户的动作改变主地图的Extent属性。
OnMouseDown_Event事件在鼠标单击(左键移动,右键选取视域范围)触发
/// <summary>
/// 鹰眼地图的OnMouseDown事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void axMapControl2_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e)
{
if (axMapControl2.LayerCount > )
{
//如果e.button==1, 则表示按下的是鼠标左键
if (e.button == )
{
axMapControl2.Refresh();
//捕捉鼠标单击时的地图坐标
IPoint pPoint = new PointClass();
pPoint.PutCoords(e.mapX, e.mapY);
//将地图的中心点移动到鼠标点击的点pPoint
axMapControl1.CenterAt(pPoint);
axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);
}
else if (e.button == )
{//如果e.button==2, 则表示按下的是鼠标右键
//鹰眼地图的TrackRectangle()方法, 随着鼠标拖动得到一个矩形框
IEnvelope pEnvelope = axMapControl2.TrackRectangle();
axMapControl1.Extent = pEnvelope;//鼠标拖动生成的矩形框范围
axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);
}
}
}
OnMouseMove_Event事件在鼠标移动时触发。
/// <summary>
/// 鹰眼地图的OnMouseMove事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void axMapControl2_OnMouseMove(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseMoveEvent e)
{
//如果e.button==1, 则表示按下的是鼠标左键
if (e.button == )
{
axMapControl2.Refresh();
//捕捉鼠标单击时的地图坐标
IPoint pPoint = new PointClass();
pPoint.PutCoords(e.mapX, e.mapY);
//将地图的中心点移动到鼠标点击的点pPoint
axMapControl1.CenterAt(pPoint);
axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);
}
}
下一篇:ArcGIS Engine开发鹰眼图的功能(代码优化篇)
谢谢大家观看!
ArcGIS Engine开发鹰眼图的功能(基础篇)的更多相关文章
- ArcGIS Engine开发鹰眼图的功能(代码优化篇)
在上一篇,ArcGIS Engine开发鹰眼图的功能(基础篇) 上一篇的实现效果图如下, 如果仔细观察,会发现一个问题,即在“鹰眼”的区域,只要在红色线框内的注记会被覆盖. 如果红色框包括整张图的话, ...
- ArcGIS Engine开发之量测功能
1.距离测量 距离测量时,片段长度通过两点之间距离计算得到,全部长度通过片段长度的和计算得到.主要用到INewLineFeedback和IScreenDisplay两个接口. 1)INewLineFe ...
- ArcGIS Engine开发前基础知识(3)
对象模型图 一.对象模型图中的类与接口 ArcGIS Engine 提供大量的对象,这些对象之间存在各种各样的关系,如继承.组合.关联等.对象模型图(Object model diagram,ODM) ...
- ArcGIS Engine开发前基础知识(2)
ArcGIS基本控件简介 ArcGIS Engine控件是一组可视化的开发组件,每个ArcGIS Engine控件都是一个COM组件.这些组件包括MapControl,PageLayoutContro ...
- ArcGIS Engine开发的ArcGIS 版本管理的功能
原文:ArcGIS Engine开发的ArcGIS 版本管理的功能 转自:http://blog.csdn.net/linghe301/article/details/7965901 这是以前的Arc ...
- ArcGIS Engine开发基础总结(一)
标准Engine功能 地图浏览 地图制作 数据查询 数据分析 及 所有的开发控件 —MapControl, PageLayout, Toolbar, TOC, ArcReader 对所有矢量和栅 ...
- ArcGIS Engine开发之地图基本操作(4)
ArcGIS Engine开发中数据库的加载 1.加载个人地理数据库数据 个人地理数据库(Personal Geodatabase)使用Miscrosoft Access文件(*.mdb)进行空间数据 ...
- C#,ArcGIS Engine开发入门教程
C#,ArcGIS Engine开发入门教程 转自:http://blog.csdn.net/yanleigis/article/details/2233674 目录(?)[+] 五实现 一 加载A ...
- 过实现鹰眼图这个功能来进一步学习MapControl控件
我们通过实现鹰眼图这个功能来进一步学习MapControl控件.在实现鹰眼图之前,我们需 要接口有更深入的了解. 变主动为被动-出接口(OutBound interface) COM编程类似客户端和服 ...
随机推荐
- Python开发:OpenCV版本差异所引发的cv2.findContours()函数传参问题
一.问题如下: cv2.findContours()这个方法是用来找出轮廓值的: # cv2.findContours找出轮廓值,cv2.RETR_EXTERNAL表示图像的外轮廓 binary, c ...
- 在error日志打印异常
在日志中打印异常,经常会看到以下的写法: logger.error(e.getMessage()); 或者是: e.printStackTrace(); 这两种其实都不太好. e.getMessage ...
- RFC-6455 The WebSocket Protocol 浅读
什么是WebSokcet? WebSocket是一种协议,并且是各大主流浏览器作为客户端支持的协议.它的目标就是用来替代基于 XMLHTTPRequest和长轮询的解决方案.应用在时时弹幕,消息推送, ...
- 使用ssh-keygen生成私钥和公钥
1.使用ssh-keygen生成私钥和公钥 命令如下: ssh-keygen -t rsassh-keygen -t rsa -C "用户名自取"可以是邮箱 例子: fdipzon ...
- SoapUI: 设置case的属性变量
琐碎的东西也想一点一滴的记下来
- springMVC 数据模型相关注解 可注释类型 ModelAttribute SessionAttributes InitBinder
ModelAttribute 参数/方法SessionAttributes 类InitBinder 方法
- scrapy入门案例
一. 新建项目(scrapy startproject) 在开始爬取之前,必须创建一个新的Scrapy项目.进入自定义的项目目录中,运行下列命令: scrapy startproject scrapy ...
- phpmyadmin上在某数据库里创建函数
改那个PHP项目加了个功能,本地MYSQL里添加了一个函数了,现在要转到服务器上,然后服务器上的MYSQL只能通过PHPMYADMIN网页操作的,在网页上SQL里输入创建函数的语句, 结果报错了:th ...
- Python模块学习filecmp文件比较
Python模块学习filecmp文件比较 filecmp模块用于比较文件及文件夹的内容,它是一个轻量级的工具,使用非常简单.python标准库还提供了difflib模块用于比较文件的内容.关于dif ...
- react一些问题
一.死循环 1.问题描述 function handleClick() { this.setState({count: ++this.state.count}); console.log(" ...