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编程类似客户端和服 ...
随机推荐
- 第08组 Alpha冲刺(2/6)
队名:955 组长博客: 作业博客:https://edu.cnblogs.com/campus/fzu/SE_FZU_1917_K/homework/9939 组员情况 组员1(组长):庄锡荣 过去 ...
- python gaussian,gaussian2
import numpy as np import matplotlib.pyplot as plt import mpl_toolkits.axisartist as axisartist from ...
- mysql 排序长度限制之max_length_for_sort_data以及mysql两种排序算法
SET max_length_for_sort_data = 1024 SHOW VARIABLES LIKE '%max_length_for_sort_data%'; 查询:SELECT * FR ...
- 【C++】C++中的动态内存解析
目录结构: contents structure [-] 动态内存和智能指针 使用shared_ptr管理内存 使用new直接管理内存 shared_ptr和new结合使用 unique_ptr we ...
- hive分区与实际分区文件不匹配导致spark读文件出错的问题解决
先解释下,由于历史原因导致hive中的看到分区比hdfs中的文件夹不匹配,存在hive中分区数有,实际hdfs中无此文件夹. spark中通过sparkSQL读取hive中的该表时,将会出现异常. 解 ...
- apache httpd 从2.2升级到2.4的过程及中间遇到的坑
背景描述: 最近集团在做安全扫描,扫出了http的漏洞,一看是监控nagios涉及到的httpd,于是就考虑将httpd升级到最新的版本,在升级的过程中,真是遇到了很多的坑,弄了2天终于搞定了,现在梳 ...
- RedHat 7关闭防火墙方法
1.在之前的版本中关闭防火墙等服务的命令是 service iptables stop /etc/init.d/iptables stop 2.RHEL7开始,使用systemctl工具来管理服务程序 ...
- MySQL慢查询参数
开启mysql慢查询日志 修改/etc/mysql/my.cnf配置文件,添加: [mysqld]slow_query_log = onslow_query_log_file = /var/lib/m ...
- VC++6.0 打印调试信息
1.在MFC中加入TRACE语句 2.在TOOLS->MFC TRACER中选择 “ENABLE TRACING”点击OK 3.进行调试运行,GO(F5)(特别注意:不是执行‘!’以前之所以不能 ...
- git clone 某个链接时候报错Initialized empty Git repository in 不能克隆
查看下是不是git是不是1.7.1版本. git --version 使用 yum -y update 更新一下. 再使用git clone 虽然还是会提示这个报错,但是可以克隆了.亲测有效. git ...