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

要实现放大镜功能主要就是通过两个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. Detailed ASP.NET MVC Pipeline

    Posted By : Shailendra Chauhan, 27 Jan 2014 P.NET MVC is an open source framework built on the top o ...

  2. layer弹出框插件参数及方法介绍

    layerui下载:http://www.layui.com 更多参数请阅读开发文档:http://www.layui.com/doc/modules/layer.html Layui 是一款采用自身 ...

  3. Gabor filter与Gabor transform

    https://en.wikipedia.org/wiki/G%C3%A1bor Gabor filter:a linear filter used in image processing一种线性滤波 ...

  4. POJ - 1328 Radar Installation(贪心区间选点+小学平面几何)

    Input The input consists of several test cases. The first line of each case contains two integers n ...

  5. 平方十位数——第八届蓝桥杯JavaB组(国赛)第一题

    原创 标题:平方十位数 由0~9这10个数字不重复.不遗漏,可以组成很多10位数字.这其中也有很多恰好是平方数(是某个数的平方). 比如:1026753849,就是其中最小的一个平方数. 请你找出其中 ...

  6. maven的pom文件解析及配置

    1.IDEA中的Maven的pom.xml文件,其实比较通俗点介绍功能主要项目引入的jar包,管理配置项目以及一些插件的配置等项目 2.对于pom配置详细介绍,整理如下2篇文档介绍的比较系统全面: h ...

  7. Go语言最佳实践——异常和错误

    Go语言将错误和异常两者区分对待. 1.Go语言中处理错误的惯用法是将错误以函数或者方法最后一个返回值的形式将其返回,并总是在调用它的地方检查返回的错误值. 2.对于“不可能发生的事情”称为异常,可使 ...

  8. Live 直播过程

    采集.处理.编码.封包.推流.传输.转码.分发.拉流.解码.播放,从推流到播放

  9. tcp连接过程中的三次握手和四次挥手

    在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手握手建立连接 @第一次握手: 建立连接是,客户端A发送SYN包到服务器B,并进入SYN_SEND状态,等待B确认. @第二次握手: 服务 ...

  10. c++多线程基础1(thread)

    std::thread 在 <thread> 头文件中声明,因此使用 std::thread 时需要包含 <thread> 头文件. thread 构造函数: default ...