鹰眼是用于调节全视域范围内主地图显示范围情况的副地图。它体现了地图整体与详细局部的关系。

用户可以通过鼠标单击或者画框等动作实现鹰眼与主地图的交互情况

鹰眼功能的原理是通过主地图窗口的地图控件和鹰眼地图窗口的地图控件的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开发鹰眼图的功能(基础篇)的更多相关文章

  1. ArcGIS Engine开发鹰眼图的功能(代码优化篇)

    在上一篇,ArcGIS Engine开发鹰眼图的功能(基础篇) 上一篇的实现效果图如下, 如果仔细观察,会发现一个问题,即在“鹰眼”的区域,只要在红色线框内的注记会被覆盖. 如果红色框包括整张图的话, ...

  2. ArcGIS Engine开发之量测功能

    1.距离测量 距离测量时,片段长度通过两点之间距离计算得到,全部长度通过片段长度的和计算得到.主要用到INewLineFeedback和IScreenDisplay两个接口. 1)INewLineFe ...

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

    对象模型图 一.对象模型图中的类与接口 ArcGIS Engine 提供大量的对象,这些对象之间存在各种各样的关系,如继承.组合.关联等.对象模型图(Object model diagram,ODM) ...

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

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

  5. ArcGIS Engine开发的ArcGIS 版本管理的功能

    原文:ArcGIS Engine开发的ArcGIS 版本管理的功能 转自:http://blog.csdn.net/linghe301/article/details/7965901 这是以前的Arc ...

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

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

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

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

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

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

  9. 过实现鹰眼图这个功能来进一步学习MapControl控件

    我们通过实现鹰眼图这个功能来进一步学习MapControl控件.在实现鹰眼图之前,我们需 要接口有更深入的了解. 变主动为被动-出接口(OutBound interface) COM编程类似客户端和服 ...

随机推荐

  1. 年轻人的第一个自定义 Spring Boot Starter!

    陆陆续续,零零散散,栈长已经写了几十篇 Spring Boot 系列文章了,其中有介绍到 Spring Boot Starters 启动器,使用的.介绍的都是第三方的 Starters ,那如何开发一 ...

  2. Leetcode: 43. 接雨水

    题目描述: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情 ...

  3. FNV哈希算法(转)

    由来:FNV哈希算法全名为Fowler-Noll-Vo算法,是以三位发明人Glenn Fowler,Landon Curt Noll,Phong Vo的名字来命名的,最早在1991年提出. 特点和用途 ...

  4. Metasploit使用内网跳板, 扫描局域网主机

    最近,拿到一台内网机器, 苦于无法使用nmap扫描改主机的内网, 所以才有此文 在跳板机子获取一定权限后,需要积极的向内网主机权限发展,获取指定的目标信息,探查系统漏洞,借助msf已经得到的meter ...

  5. 分布式快照算法: Chandy-Lamport 算法

    转载https://zhuanlan.zhihu.com/p/53482103 这哥们写的好,顺便转过来吧,当做学习用. 分布式快照算法: Chandy-Lamport 算法 0. 引言 Spark ...

  6. Myeclipse安装Maven插件

    Myeclipse安装Maven插件 一.下载Maven 官网下载maven插件  http://maven.apache.org/download.cgi 下载apache-maven-3.6.3- ...

  7. 在easyui-tabs中的href或 content的多种条件下的不同页面内容和页面地址的赋值?

    $('#tt').tabs('add', {.....});中 的 加载内容, 可以用content, 或用 href都是可以的. 虽然它们加载 的方式不一样, 但是 只要是加载进去后, 加载成功后, ...

  8. 嵌入式开发之内核内存异常排查---关闭oom killer

    通过执行以下命令,可以在1分钟内对系统资源使用情况有个大致的了解.uptimedmesg | tailvmstat 1mpstat -P ALL 1pidstat 1iostat -xz 1free ...

  9. C++ Map运用实例

    C++ Map运用实例 #include <map> #include <string> #include <iostream> #include <ioma ...

  10. 解决StrToDateTime()不是有效日期类型的问题

    方法一: function GetDateFormat():string; var SysFrset: TFormatSettings; begin Result:=''; GetLocaleForm ...