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

要实现放大镜功能主要就是通过两个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. Java SimpleDateFormat工具类

    package AnimalDemo; import java.text.ParseException; import java.text.SimpleDateFormat; import java. ...

  2. (转)Asp.Net生命周期系列一

    原文地址:http://www.cnblogs.com/skm-blog/archive/2013/07/07/3176713.html Asp.Net生命周期对于初级甚至中级程序员来说,一直都是一个 ...

  3. indexOf(String.indexOf 方法)

    字符串的IndexOf()方法搜索在该字符串上是否出现了作为参数传递的字符串,如果找到字符串,则返回字符的起始位置 (0表示第一个字符,1表示第二个字符依此类推)如果说没有找到则返回 -1 返回 St ...

  4. python 读取mysql存储的文件路径下载文件,内容解析,上传七牛云,内容入es

    #!/usr/bin/env python # -*- coding: utf-8 -*- import ConfigParser import json import os import re fr ...

  5. Js 正则获取Html元素

    var html = $("#summaryTemplate").html(); var imageMath = /<img [^<,>]*(?=target-t ...

  6. C#@的用法

    string path = @"C:\Windows\"; // 如果不加 @,编译会提示无法识别的转义序列 // 如果不加 @,可以写成如下 string path2 = &qu ...

  7. Windows + python + pywinauto 搭建自动化测试环境

    最近公司在搞测试, 单纯的人工去测试需要花费太多的人力物力以及时间, 所以准备用Python做一套自动化测试来使用. 本文中使用的是Python3.6.8  和 pywin32-224.win-amd ...

  8. WinForm中ListView的使用

    每一行是一个ListViewItem对象,每一项是一个ListViewSubItem对象 样式 整行选择:this.lvDataSourceSearchHistory.FullRowSelect = ...

  9. WinForm中DataGridView的使用(六) - 特殊处理的小地方

    列标题不能居中的解决方法 一般列标题的居中我们都使用this.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignmen ...

  10. c++最短路经典问题

    一提起最短路,各位oier会想到什么呢? floyd,spfa,dij,或是bellman-ford? 其实,只要学会一种算法,大部分最短路问题就能很快解决了. 他就是堆优化的dijkstra. 首先 ...