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

要实现放大镜功能主要就是通过两个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. 20169219 Nmap扫描实验

    提交用 namp 对Windows 靶机,SEED靶机,Linux靶机的扫描的命令和结果进行截图 一.首先分析Linux靶机Metasploitable 扫描Metasploitableb靶机 扫描M ...

  2. android canvas中rotate()和translate()两个方法详解

    rotate()和translate() 1.看到这个题目的时候,有人会觉得这不就是一个对画布的旋转和平移的嘛,但是其中的细节的地方还是需要深究一下的. 例如:有个需求将TextView的文字竖直显示 ...

  3. Django-项目上线后,静态文件配置失效以及404、500页面的全局配置

    https://blog.csdn.net/Jamin2018/article/details/79060509 https://www.cnblogs.com/lfoder/p/6013142.ht ...

  4. 基于CentOS6定制自己的ISO安装光盘

    警告:转载请注明出处 https://www.cnblogs.com/BoyTNT/p/9322927.html  1.目标 >> 基于CentOS-6.10-x86_64-minimal ...

  5. Flask写web时cookie的处理

    本文来自网易云社区 作者:孙圣翔 flask是一个微型web开发框架,别看他微型,在github上排名还是挺高的. A microframework based on Werkzeug, Jinja2 ...

  6. web.xml报错:cvc-complex-type.2.4.a: Invalid content was found starting with element 'async-supported'. One of '{"http://java.sun.com/xml/ns/javaee":init-param}' is expected.

    在写xml的时候又一次总是报cvc-complex-type.2.4.a: Invalid content was found starting with element 错误,还出现小红叉,在网上找 ...

  7. 【转】c# delegate

    源地址:https://www.cnblogs.com/lcawen/p/6645358.html

  8. centos 在vm下网络不通

    VMware是一款虚拟机,支持各种热门系统,我们可以在VMware虚拟机中安装其他系统以满足个人需求,但在为VMware安装CentOS6.5后,无法连接网络,这是什么原因导致的呢?下面就给大家介绍下 ...

  9. VS2010 由于缺少调试目标"xx.exe"

    有两种可能会造成这种现像.A.配制属性出了问题. 一种方法:右击“解决方案”->“属性”,在弹出的“属性页”框中,选择左边的“配置属性”,在右边,将应用程序的生成那个框框勾上,二可能是这里的属性 ...

  10. poll?transport=longpoll&connection...烦人的请求

    2016-06-19 11:50 76人阅读 评论(0) 收藏 举报  分类: C#那点事 版权声明:本文为博主原创文章,未经博主允许不得转载. 1.问题描述: 最近使用miniui做了一个后台管理系 ...