鹰眼图,是GIS的一个基本功能,在鹰眼图上可以像从空中俯视一样查看地图框中所显示的地图在整个图中的位置,是对全局地图的一种概述表达,能够起到很好的空间提示和导航的作用。网上有很多Arcengine 二次开发的相关的鹰眼图的例子,思路差不多。 现在呢,具体介绍下基于我们PIE SDK是如何实现这基本工具鹰眼图功能的基本实现。

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

一、数据:为了更好的便于读者理解,鹰眼图的数据采用静止数据(非动态数据),即当地图初始化的时候鹰眼图就自动加载一个地图文档。

          /// <summary>
/// 鹰眼图初始化
/// </summary>
private void MapHawkEyeControlInitial()
{
//1、初始化鹰眼图框样式
m_DrawPolygonElement = new PolygonElement();
//创建一个线元素符号(用于轮廓线样式)
ILineSymbol lineSymbol=new SimpleLineSymbol();
lineSymbol.Color=Color.Red;
lineSymbol.Width = ;
//设置面的填充符号
IFillSymbol symbol = new SimpleFillSymbol();
symbol.OutlineSymbol = lineSymbol;//设置面的轮廓线颜色
symbol.Color = Color.FromArgb(, Color.Yellow);//设置面的填充色和透明色
m_DrawPolygonElement.Symbol = symbol; //2、加载pmd
LoadPmd();
} /// <summary>
/// 鹰眼图加载pmd
/// </summary>
private void LoadPmd()
{
//选择加载的地图文档
OpenFileDialog openDialog = new OpenFileDialog();
openDialog.Filter = "地图文档(*.pmd)|*.pmd";
openDialog.Multiselect = false;
if (openDialog.ShowDialog() != DialogResult.OK) return; string pmdFilePath = openDialog.FileName;
if (string.IsNullOrEmpty(pmdFilePath)) return;
mapHawkEyeControl.LoadPmdFile(pmdFilePath); //初始化鹰眼图中显示框
m_DrawPolygonElement.Geometry = mapHawkEyeControl.ActiveView.Extent as PIE.Geometry.IGeometry;
mapHawkEyeControl.ActiveView.GraphicsContainer.AddElement(m_DrawPolygonElement);
mapHawkEyeControl.ActiveView.PartialRefresh(PIE.Carto.ViewDrawPhaseType.ViewAll);
}

二、绘制鹰眼图的显示框

为了便于资源的管理,显示框采用的是面元素(IPolygonElement),m_DrawPolygonElement是一个全局变量,通过只在初始化LoadPmd()的时候添加一次面元素,在相关事件的操作中只改变显示框的位置和大小不改边显示的样式,这样可以使加载的速度更快而且减少内存资源的消耗。

鹰眼图的功能主要包括三种操作,第一:当主地图的范围发生变化的时候,鹰眼图中的范围显示框跟着变化;第二在鹰眼图中左键点击后,主地图以鹰眼图中点击点为中心显示;第三在鹰眼图中右键拉框后,主地图显示鹰眼图拉框绘制的范围;

而绘制显示框,主要发生在主视图和鹰眼图控件相应响应事件中,即mapControlMain的OnExtentUpdated事件和OnMapReplaced事件(暂不做介绍),mapHawkEyeControl控件的MouseDown事件。

1、当主地图mapControlMain范围发生变化时,会触发OnExtentUpdated事件,那么鹰眼图显示框的位置应该跟着发生变化。

         /// <summary>
/// 主地图范围发生变化时
/// </summary>
/// <param name="sender"></param>
/// <param name="sizeChanged"></param>
/// <param name="newEnvelope"></param>
private void mapControlMain_OnExtentUpdated(object sender, bool sizeChanged, PIE.Geometry.IEnvelope newEnvelope)
{
if (mapControlMain.ActiveView.FullExtent == null) return;
m_DrawPolygonElement.Geometry = newEnvelope as PIE.Geometry.IGeometry;
mapHawkEyeControl.ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll);
}
 

2、当鼠标在鹰眼图mapHawkEyeControl控件上左右键操作时,会触发MouseDown事件,然后主地图会发生相应的变化。

          /// <summary>
/// 鹰眼图点击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void mapHawkEyeControl_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button==MouseButtons.Left)
{
PIE.Geometry.IPoint point = new PIE.Geometry.Point();
point = mapHawkEyeControl.ToMapPoint(e.X, e.Y);
mapControlMain.ActiveView.PanTo(point);
}
else if(e.Button==MouseButtons.Right)
{
PIE.Geometry.IEnvelope envelop = mapHawkEyeControl.TrackRectangle();
mapControlMain.ActiveView.Extent = envelop;
}
mapControlMain.ActiveView.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. 功能简介 地图范围设置的监听就是通过IMapControlEvents接口对地图的视图范围更新或者地图的分辨率发生变化进行监听,然后做出相应的操作. 图层事件的监听就是通过IActiveView ...

  2. PIE SDK地图范围设置

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

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

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

  4. PIE SDK地图平移校正

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

  5. PIE SDK地图图层控制

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

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

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

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

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

  8. PIE SDK地图书签

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

  9. PIE SDK地图放大镜

    放大镜,在地图的浏览过程中在主地图和次地图中起到很好的辅助作用, 要实现放大镜功能主要就是通过两个mapControl控件,主地图控件是mapControlMain,放大镜控件是UserControl ...

随机推荐

  1. (回溯法)ip地址的合理性

    题目: 给定一个只包含数字的字符串,通过返回所有可能有效的IP地址组合来恢复它. 例如: 给定“”, return [“255.255.11.135”,“255.255.111.35”]. (顺序无所 ...

  2. (转)ASP.NET MVC4+EasyUI+EntityFrameWork权限管理系统——数据库的设计(一)

    原文地址:http://www.cnblogs.com/cmsdn/p/3371576.html 快一年没写博客了,这段时间感觉好迷茫,写点博客,记录一下自己的成长过程,希望对大家也有帮助 先上图 一 ...

  3. Alpha冲刺(二)

    Information: 队名:彳艮彳亍团队 组长博客:戳我进入 作业博客:班级博客本次作业的链接 Details: 组员1(组长)柯奇豪 过去两天完成了哪些任务 学习并配置了ssm框架(用于前后端交 ...

  4. 【转】Android系统概览

    这篇文章其实原文叫 <老罗的Android之旅>导读PPT 是罗升阳的博客,我觉得用“Android系统概览”作为标题更贴切些,对于在应用层已经开发了一段时间的人来说,读完之后会有很多体会 ...

  5. 2张图简单分析count(0)与count(*)

    以前一直以为count(0)查询效率比count(*)比较高,原因大概是这么认为count(0)只是第一列进行统计,而count(*)所有列放在一起统计(亲,不要误会,这里不是所有列累加哦) 结果真的 ...

  6. spring框架所有包说明

    spring依赖的jar包如下:下面是每个jar包的说明spring.jar 是包含有完整发布模块的单个jar 包.但是不包括mock.jar, aspects.jar, spring-portlet ...

  7. Axios 使用说明

    get请求: on_sum: function () { axios.get('http://127.0.0.1:8000/test/' ).then(response=>{ alert('ok ...

  8. node.js安装以及git 的使用说明

     第一步:安装node.js: Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境.   Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高 ...

  9. 洛谷P4494 [HAOI2018]反色游戏(tarjan)

    题面 传送门 题解 我们先来考虑一个联通块,这些关系显然可以写成一个异或方程组的形式,形如\(\oplus_{e\in edge_u}x_e=col_u\) 如果这个联通块的黑色点个数为奇数,那么显然 ...

  10. 用python实现按权重对N个数据进行选择

    需求:某公司有N个人,根据每个人的贡献不同,按贡献值给每个人赋予一个权重.设计一种算法实现公平的抽奖. 需求分析:按照权重对数据进行选择. 代码实现: 1 def fun(n,p): 2 " ...