PIE SDK地图放大镜
放大镜,在地图的浏览过程中在主地图和次地图中起到很好的辅助作用,
要实现放大镜功能主要就是通过两个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地图放大镜的更多相关文章
- PIE SDK地图范围设置
1.功能简介 地图范围设置主要就是对图层的地图浏览控制,例如地图的放大.缩小.漫游.全图显示.1:1视图.比例尺等功能,能更好的与地图有一个互动的地图浏览体验.PIE SDK对地图范围设置主要利用IC ...
- PIE SDK地图图层渲染方案管理
1. 功能简介 在数据种类较多.渲染规则复杂的情况下,逐个设置其渲染方式是一件繁琐的工作.PIE SDK提供了一种省力省心的办法, PIE SDK提供栅格和矢量数据渲染方案的打开与保存.能够将配色方案 ...
- PIE SDK地图鹰眼图
鹰眼图,是GIS的一个基本功能,在鹰眼图上可以像从空中俯视一样查看地图框中所显示的地图在整个图中的位置,是对全局地图的一种概述表达,能够起到很好的空间提示和导航的作用.网上有很多Arcengine 二 ...
- PIE SDK地图平移校正
地图平移校正,当加载两幅空间参考一样的影像,其中一幅影像有点偏移,这时就以另一幅影像为基准将其进行平移校正,然后保存,再次加载就不会出现偏移了. 下面来介绍下实现的主要代码: 首先通过选中目录树中的要 ...
- PIE SDK地图图层控制
1. 功能简介 地图图层控制就是图层的相关操作,如地图图层数据的添加.删除.移动和拖拽等功能. 2. 功能实现说明 2.1. 实现思路及原理说明 第一步 图层添加是调用AddLayer方法将图层添加到 ...
- PIE SDK地图范围设置和图层事件监听
1. 功能简介 地图范围设置的监听就是通过IMapControlEvents接口对地图的视图范围更新或者地图的分辨率发生变化进行监听,然后做出相应的操作. 图层事件的监听就是通过IActiveView ...
- PIE SDK地图显示范围截图
1.1. 功能简介 地图显示范围截图是将当前地图显示的范围进行输出.输出的 格式是png.bmp,主要思路就是通过IActiveView接口下的Output()方法进行输出 1.2. 功能实现说明 2 ...
- PIE SDK地图鼠标事件监听
1.功能简介 地图鼠标事件包含鼠标的按下MouseDown(),弹起MouseUp(),移动MouseMove()等事件,通过这些事件可以对地图进行动态的操作,接下来以地图状态栏的信息为例具体介绍如何 ...
- PIE SDK地图书签
地图书签,可以理解为暂时记录当前地图的范围和放大级别,在后续的操作中如果想回到地图之前的状态,就可以点击保存的书签就可以回到此状态,如图所示: 地图刚加载的时候是一幅世界地图 我们将地图的中心拖到南美 ...
随机推荐
- 数据库索引与b+树
数据库索引详解 索引 当我们在设计数据库的时候,对表的一些属性有时会加上索引,但索引为什么能提高检索速率呢?是不是用了索引就一定可以提高效率呢?不同索引之间有什么区别呢?搞懂这些问题是灵活运用索引的必 ...
- 基于任务的异步编程模式(TAP)的错误处理
在前面讲到了<基于任务的异步编程模式(TAP)>,但是如果调用异步方法,没有等待,那么调用异步方法的线程中使用传统的try/catch块是不能捕获到异步方法中的异常.因为在异步方法执行出现 ...
- Linux中,关闭selinux
首先我们可以用命令来查看selinux的状态getenforce 这个命令可以查看到selinux的状态,当前可以看到是关闭状态的. 还有一个命令也可以查看出selinux的状态.sestatus - ...
- 【转】plsql 永久注册码适用个版本
源地址:https://blog.csdn.net/sinat_33142609/article/details/72540025 注册码:Product Code:4t46t6vydkvsxekkv ...
- 关于pip无法安装scrapy的问题
安装scrapy时如果出现下列问题: building ' twisted. test. raiser' extension error: Microsoft Visual C++ 14.0 is r ...
- 编写可维护的Javascript纪要
第一部分: 编程风格 在大型项目开发中,因为项目可读性规范性的需要(就像<编写可维护性的Javascript>一书作者Nicholas Zakas大神所说,他们团队所有成员写出的代码就像是 ...
- app.use和app.get的区别及解析
转载至:http://blog.csdn.net/wthfeng/article/details/53366169 写在前面:最近研究nodejs及其web框架express,对app.use和app ...
- VS2010 由于缺少调试目标"xx.exe"
有两种可能会造成这种现像.A.配制属性出了问题. 一种方法:右击“解决方案”->“属性”,在弹出的“属性页”框中,选择左边的“配置属性”,在右边,将应用程序的生成那个框框勾上,二可能是这里的属性 ...
- easyui datagrid可编辑表格使用经验分享
文章目录 1相关接口方法 2列属性formatter 3编辑器类型 3.1基于my97的编辑器 3.2简单的密码编辑器 3.3动态增加/删除编辑器 4字段的级联操作 4.1combobox的级联操作 ...
- TX1 文字界面启动与root用户自动登录设置
设置默认文字启动界面 更改/boot/extlinux/extlinux.conf文件,在最后一行的末尾添加 text. 设置自动登录 在/etc/init/tty1.conf文件末尾添加: exec ...