放大镜,在地图的浏览过程中在主地图和次地图中起到很好的辅助作用,

要实现放大镜功能主要就是通过两个mapControl控件,主地图控件是mapControlMain,放大镜控件是UserControl_Magnifier,实现关键点有两点:1、如何使两个控件使用的数据保持一致;2、如何绘制放大镜中的元素框。

一、数据一致

当主地图添加地图图层数据就会触发接口IActiveViewEvents接口中的地图添加事件OnLayerAdded,或者图层的删除等操作,放大镜的控件就会将图层数据添加到放大镜视图中。 mapControl1代表的是放大镜中的地图控件

  /// <summary>
/// 加载事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void UserControl_MagnifyingGlass_Load(object sender, EventArgs e)
{
if (!m_BInitialized) return;
load();
addElement();
IActiveViewEvents activeViewEvents = (IActiveViewEvents)m_ActiveView;
activeViewEvents.OnLayerAdded += activeViewEvents_OnLayerAdded;
activeViewEvents.OnLayerDeleted += activeViewEvents_OnLayerDeleted;
} /// <summary>
/// OnLayerAdded事件
/// </summary>
/// <param name="layer"></param>
void activeViewEvents_OnLayerAdded(ILayer layer)
{
load();
addElement();
}
/// <summary>
/// 加载函数
/// </summary>
private void load() {
if (!m_BInitialized) return;
mapControl1.FocusMap = m_ActiveView.FocusMap.Clone();
mapControl1.Extent = m_ActiveView.Extent;
mapControl1.ActiveView.DisplayTransformation.MapScale =; mapControl1.PartialRefresh(ViewDrawPhaseType.ViewAll);
}

二、绘制放大镜的显示框

显示框采用的是曲线元素和线元素(ILineElemnet和ICurveElement)。

放大镜的功能主要包括两种操作,第一:当鼠标在主地图上移动的时候,放大镜的范围以鼠标移动的地方为中心按照一定的比例进行显示,圆和十字元素的中心就是放大镜地图的中心,本示例中比例固定设置为3,放大镜地图中的范围显示框跟着变化;第二,主地图的视图范围发生变化时,放大镜地图的显示范围和显示框也会跟着变化。

1、当鼠标在主地图上移动的时候,会触发MouseMove事件,那么放大镜的地图范围就会以鼠标所移动的坐标为中心进行范围显示。

 /// <summary>
/// MouseMove事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void mapControl_MouseMove(object sender, MouseEventArgs e)
{
IMapControl mapControl = m_Application.MapControl;
IMapControl mapControl1 = m_Magnifier.GetMapControl();
PIE.Geometry.IPoint point = mapControl.ToMapPoint(e.X, e.Y);
m_Point = point;
mapControl1.CenterAt(point);
m_Magnifier.addElement();
} /// <summary>
/// 添加准星函数(绘制放大镜地图中的显示框一个圆和一个十字形)
/// </summary>
public void addElement() {
IEnvelope extent = mapControl1.Extent;
IGraphicsContainer graphicsContainer = mapControl1.ActiveView.GraphicsContainer;
graphicsContainer.DeleteAllElements(); IPointCollection line1 = new Polyline();
line1.AddPoint((extent.XMin + extent.XMax) / , extent.YMin);
line1.AddPoint((extent.XMin + extent.XMax) / , extent.YMax); ILineSymbol symbol = new SimpleLineSymbol();
symbol.Color = Color.Red; ILineElement lineElement1 = new LineElement();
lineElement1.Geometry = line1 as IGeometry;
lineElement1.Symbol = symbol; IPointCollection line2 = new Polyline();
line2.AddPoint(extent.XMin, (extent.YMin + extent.YMax) / );
line2.AddPoint(extent.XMax, (extent.YMin + extent.YMax) / );
ILineElement lineElement2 = new LineElement();
lineElement2.Geometry = line2 as IGeometry;
lineElement2.Symbol = symbol; IArc arc = new Arc();
arc.PutCoords((extent.XMin + extent.XMax) / , (extent.YMin + extent.YMax) / );
arc.StartAngle = ;
arc.EndAngle = ;
arc.SemiMajor = (extent.XMax - extent.XMin) / ;
arc.SemiMinor = (extent.XMax - extent.XMin) / ; ICurveElement curveElement = new CurveElement();
curveElement.Geometry = arc as IGeometry;
curveElement.Symbol = symbol; graphicsContainer.AddElement(lineElement1);
graphicsContainer.AddElement(lineElement2);
graphicsContainer.AddElement(curveElement); mapControl1.PartialRefresh(ViewDrawPhaseType.ViewAll);
}
/// <summary>
/// OnVisibleBoundsUpdated事件
/// </summary>
/// <param name="displayTransformation"></param>
/// <param name="bVisibleBoundChanged"></param>
private void TransformEvent_OnVisibleBoundsUpdated(IDisplayTransformation displayTransformation, bool bVisibleBoundChanged)
{
IMapControl mapControl1 = m_Magnifier.GetMapControl(); PIE.Carto.IActiveView activeView = m_HookHelper.ActiveView;
PIE.Geometry.IPoint point = (activeView.Extent as PIE.Geometry.IGeometry).Centroid();
mapControl1.ActiveView.PanTo(point);
mapControl1.ActiveView.DisplayTransformation.MapScale = ; mapControl1.CenterAt(m_Point);
m_Magnifier.addElement();
mapControl1.PartialRefresh(ViewDrawPhaseType.ViewAll);
}

2、当主地图mapControlMain范围发生变化时,会触发OnVisibleBoundsUpdated事件,那么放大镜的显示框的位置和范围应跟着发生变化。

 ITransformEvents transformEvent = (ITransformEvents)activeView.DisplayTransformation; transformEvent.OnVisibleBoundsUpdated += TransformEvent_OnVisibleBoundsUpdated;
/// <summary>
/// OnVisibleBoundsUpdated事件
/// </summary>
/// <param name="displayTransformation"></param>
/// <param name="bVisibleBoundChanged"></param>
private void TransformEvent_OnVisibleBoundsUpdated(IDisplayTransformation displayTransformation, bool bVisibleBoundChanged)
{
IMapControl mapControl1 = m_Magnifier.GetMapControl(); PIE.Carto.IActiveView activeView = m_HookHelper.ActiveView;
PIE.Geometry.IPoint point = (activeView.Extent as PIE.Geometry.IGeometry).Centroid();
mapControl1.ActiveView.PanTo(point);
mapControl1.ActiveView.DisplayTransformation.MapScale = ; mapControl1.CenterAt(m_Point);
m_Magnifier.addElement();
mapControl1.PartialRefresh(ViewDrawPhaseType.ViewAll);
}

  代码路径:

项目名称

百度云盘地址下/PIE示例程序/13.小工具集锦/地图平移校正/ PIEMapApplication1

数据路径

百度云盘地址下/PIE示例数据/栅格数据/04.World/World.tif

视频路径

百度云盘地址下/PIE视频教程/13.小工具集锦/地图放大镜.avi

注意:

在地图初始化的时候,图层树控件需要手动绑定地图控件:

tocControlMain.SetBuddyControl(mapControlMain as PIE.Carto.IPmdContents);

PIE SDK地图放大镜的更多相关文章

  1. PIE SDK地图范围设置

    1.功能简介 地图范围设置主要就是对图层的地图浏览控制,例如地图的放大.缩小.漫游.全图显示.1:1视图.比例尺等功能,能更好的与地图有一个互动的地图浏览体验.PIE SDK对地图范围设置主要利用IC ...

  2. PIE SDK地图图层渲染方案管理

    1. 功能简介 在数据种类较多.渲染规则复杂的情况下,逐个设置其渲染方式是一件繁琐的工作.PIE SDK提供了一种省力省心的办法, PIE SDK提供栅格和矢量数据渲染方案的打开与保存.能够将配色方案 ...

  3. PIE SDK地图鹰眼图

    鹰眼图,是GIS的一个基本功能,在鹰眼图上可以像从空中俯视一样查看地图框中所显示的地图在整个图中的位置,是对全局地图的一种概述表达,能够起到很好的空间提示和导航的作用.网上有很多Arcengine 二 ...

  4. PIE SDK地图平移校正

    地图平移校正,当加载两幅空间参考一样的影像,其中一幅影像有点偏移,这时就以另一幅影像为基准将其进行平移校正,然后保存,再次加载就不会出现偏移了. 下面来介绍下实现的主要代码: 首先通过选中目录树中的要 ...

  5. PIE SDK地图图层控制

    1. 功能简介 地图图层控制就是图层的相关操作,如地图图层数据的添加.删除.移动和拖拽等功能. 2. 功能实现说明 2.1. 实现思路及原理说明 第一步 图层添加是调用AddLayer方法将图层添加到 ...

  6. PIE SDK地图范围设置和图层事件监听

    1. 功能简介 地图范围设置的监听就是通过IMapControlEvents接口对地图的视图范围更新或者地图的分辨率发生变化进行监听,然后做出相应的操作. 图层事件的监听就是通过IActiveView ...

  7. PIE SDK地图显示范围截图

    1.1. 功能简介 地图显示范围截图是将当前地图显示的范围进行输出.输出的 格式是png.bmp,主要思路就是通过IActiveView接口下的Output()方法进行输出 1.2. 功能实现说明 2 ...

  8. PIE SDK地图鼠标事件监听

    1.功能简介 地图鼠标事件包含鼠标的按下MouseDown(),弹起MouseUp(),移动MouseMove()等事件,通过这些事件可以对地图进行动态的操作,接下来以地图状态栏的信息为例具体介绍如何 ...

  9. PIE SDK地图书签

    地图书签,可以理解为暂时记录当前地图的范围和放大级别,在后续的操作中如果想回到地图之前的状态,就可以点击保存的书签就可以回到此状态,如图所示: 地图刚加载的时候是一幅世界地图 我们将地图的中心拖到南美 ...

随机推荐

  1. Mr_matcher的细节3

    主要是订阅了playbag发布的scan话题和odom话题 其类型分别为 //cache the static tf from base to laser getBaseToLaserTf(scan_ ...

  2. javascript总结1:js常见页面消息输出方式 alert confirm console prompt document

    .1 js常见的输出方法: 1-1 alert 警告框 alert("js语法总结"); 1-2 confirm 确认方法 confirm("js语法总结"); ...

  3. Java变量的修饰符

    1.public public的类.类属变量及方法,包内及包外的任何类均可以访问: 2.protect protected的类.类属变量及方法,包内的任何类,及包外的那些继承了此类的子类才能访问: 3 ...

  4. U盘安装Ubuntu 12.04成功后系统无法启动的原因及解决办法

    想搭建一个Linux开发环境,选择了ubuntu12.04长期支持版,采用u盘安装(Universal-USB-Installer做的启动),发现安装完成之后,拔掉u盘无法启动,插上u盘之后,可以重启 ...

  5. XML在C#与Unity3D中的实战运用

    一.xml文件是什么? XML是指可扩展标记语言,英文:Extensible Markup Language的缩写. 二.xml文件有什么用? 用来传输和存储数据,比如网络通信,本地配置文件等. 三. ...

  6. Unity本地持久化类Playerprefs使用详解

    一.PlayerPrefs是什么? PlayerPrefs是Unity3d提供了一个用于数据本地持久化保存与读取的类.工作原理十分简单,就是以key-value的形式将数据保存在本地,然后在代码中可以 ...

  7. Response Assertion(响应断言)

    响应断言可以让你添加匹配字符串来匹配请求和响应的各个字符串. 匹配字符串可以是1.Contains和Matches正则表达式:2.Equals和SubString文本类型,大小写敏感. Apply t ...

  8. python爬取淘宝排名

    import timeimport jsonimport requestsimport xlrdimport randomimport os from xlutils.copy import copy ...

  9. 【bzoj4806~bzoj4809】 象棋四连发 DP-高精度-匈牙利算法-dfs

    都是经典题了吧..我好无聊.. 4806 4806-1801是双倍经验..DP方程看代码吧.. /* http://www.cnblogs.com/karl07/ */ #include <cs ...

  10. JVM之类加载机制

    JVM之类加载机制 JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这五个过程. 类加载五部分 加载 加载是类加载过程中的一个阶段,这个阶段会在内存中生成一个代表这 ...