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

时间:2022-12-10 07:46:49

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

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

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

鹰眼功能的原理是通过主地图窗口的地图控件和鹰眼地图窗口的地图控件的4个事件即可完成整个实现流程,但这4个事件之间存在一定的逻辑关系。首先我们了解一下这4个事件的触发条件以及实现的功能。

(1)主地图窗口地图控件
OnMapReplace_Event事件是在主地图控件加载地图文档或者图层时触发,它主要用来完成主地图与鹰眼地图的地图同步工作
OnExtentUpdated_Event事件是主地图的Extent(显示范围)属性值发生变化时触发,主要的功能是在鹰眼地图窗口上绘制一个线框用来表示主地图窗口的显示范围。

(2)鹰眼地图窗口地图控件

主要用来捕捉鼠标在鹰眼地图上的动作,并调用相应的处理方法,根据用户的动作改变主地图的Extent属性。

OnMouseDown_Event事件在鼠标单击(左键移动,右键选取视域范围)触发

OnMouseMove_Event事件在鼠标移动时触发。

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

(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&num;&comma;ArcGIS Engine开发入门教程

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

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

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

随机推荐

  1. iOS--二维码

    现在很多APP都涉及了二维码扫码功能,这个功能简单实用,很多情况下用户乐于使用,现在本文带来iOS7自带二维码扫码的教程,也包括扫条形码,足以满足简单的扫码要求,而且避免使用第三方的繁琐. 后期项目中 ...

  2. ocp 1Z0-051 106-140题解析

    106. Examine the data inthe LIST_PRICE and MIN_PRICE columns of the PRODUCTS table: LIST_PRICE MIN_P ...

  3. Android开源项目发现--- 工具类文件处理篇(持续更新)

    1.ZIP java压缩和解压库 项目地址:https://github.com/zeroturnaround/zt-zip 文档介绍:https://github.com/zeroturnaroun ...

  4. SQL server 用命令行更改数据库

    (计应154兰家才) CREATE  DATABASE  数据库名 ON [PRIMARY] ( <数据文件参数> [,…n]  [<文件组参数>] ) [LOG ON] ( ...

  5. Bean property属性说明

                                  来自为知笔记(Wiz)

  6. javascript权威指南pdf

    链接:https://pan.baidu.com/s/1c19qfSk 密码:j4f3

  7. Optimizing Java笔记&colon;高级垃圾回收

    原书地址:https://www.safaribooksonline.com/library/view/optimizing-java/9781492039259/ 感觉挺不错的一本书,断断续续在读. ...

  8. Java 8 Stream API说明

    Java 8增加了很多强大的功能,流(stream)就是其中之一.现在对api的使用做个说明: map 对流中的元素做转换,目前jdk提供了mapToInt,mapToLong,mapToDouble ...

  9. iOS 抓包

    通过tcpdump对iOS进行流量分析(无需越狱 iOS Packet Tracing 将 iOS 设备通过 USB 连接到 Mac 打开 terminal rvictl -s $UDID 运行 tc ...

  10. 修改VS2017模板文件,添加文件头部自定义注释

    找到Class.cs文件 找到VS2017安装目录下面的Class.cs文件,一般在C盘或者D盘 模块文件位置: 接口模版:C:\Program Files (x86)\Microsoft Visua ...