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

我们将地图的中心拖到南美洲,将地图放大到一定比例,创建以“南美洲”为名称的书签,如下图所示:

创建后书签,在地图上随意拖动地图,并进行放大或缩小,然后点击“南美洲”书签,地图会定位到书签的南美洲视图范围。
下面来介绍下实现的主要代码:
要实现地图书签功能主要有两个步骤:
1、如何创建书签;
2、点击书签地图如何定位到书签的范围
一、创建书签
显示书签的列表用的是Devexpress插件中的 LayoutControl控件,
将要保存书签的视图范围输出为图片.png格式,然后用文件流将图片转换成Image,显示在书签列表中。示例中创建的书签信息数据存储在字典表IDictionary<string,object> m_DicBookMarkInfo中,其中值存储形式格式定义的是结构体BookMarkInfo,书签信息数据可以根据数据库的不同进行存储;
/// <summary>
/// 存储书签信息结构体
/// </summary>
public struct BookMarkInfo
{
public string key;//书签名称
public LayoutControlItem layoutControlItem;//书签子控件
public PIE.Geometry.IEnvelope envelope;//书签范围
public PictureBox image;//书签范围图片
public PIE.Geometry.ISpatialReference spatialReference;//空间参考
}
/// <summary>
/// 添加地图书签
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tbn_AddBookMark_Click(object sender, EventArgs e)
{
//1、获取书签的名称
FrmAddBookMark bookMark = new FrmAddBookMark(m_DicBookMarkInfo);
if (bookMark.ShowDialog() != DialogResult.OK) return;
m_BookMarkName = bookMark.GetBookMarkName();
if (string.IsNullOrEmpty(m_BookMarkName)) return; //2、输出图片
IDisplayTransformation displayTransformation = mapControlMain.ActiveView.DisplayTransformation;
PIE.Carto.ExportPNG export = new ExportPNG();
export.Width = (int)displayTransformation.DeviceFrame.Width;
export.Height = (int)displayTransformation.DeviceFrame.Height;
export.ExportFileName = @"..\Data\Bookmark\pic\" + m_BookMarkName + ".png"; string filePath = Path.GetDirectoryName(export.ExportFileName);
if (!Directory.Exists(filePath))
{
Directory.CreateDirectory(filePath);
}
export.StartExporting();
mapControlMain.ActiveView.Output(export as IExport, , displayTransformation.DeviceFrame, mapControlMain.ActiveView.Extent, null);
export.FinishExporting(); //3、界面设计(将图片展示在书签列表)
Design(export.ExportFileName);
}
/// <summary>
/// 书签界面设计
/// </summary>
/// <param name="filePath">输出图片路径</param>
private void Design(string filePath)
{
PictureBox pictureBox1 = new PictureBox();
//将保存的图片展示在书签列表
using (FileStream image = new FileStream(filePath, FileMode.Open))
{
pictureBox1.Image = Image.FromStream(image);
}
LayoutControlItem item = layoutControlGroup1.AddItem(m_BookMarkName, pictureBox1) as LayoutControlItem;
item.Name = m_BookMarkName; pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
IEnvelope envelope = m_ActiveView.Extent;
pictureBox1.Name = m_BookMarkName;
pictureBox1.Size = new Size(, );
pictureBox1.Enabled = false; //事件
item.Click += ItemPictureBox_Click;
item.DoubleClick += ItemPictureBox_DoubleClick; item.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
item.MaxSize = new Size(, );
item.MinSize = new Size(, );
item.TextLocation = DevExpress.Utils.Locations.Bottom; item.AppearanceItemCaption.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
item.Spacing = new DevExpress.XtraLayout.Utils.Padding();
item.AppearanceItemCaption.Font = new System.Drawing.Font("宋体", 13F, FontStyle.Bold); //存储标签信息
BookMarkInfo bookMarkInfo = new BookMarkInfo();
bookMarkInfo.key = m_BookMarkName;
bookMarkInfo.layoutControlItem = item;
bookMarkInfo.envelope = envelope;
bookMarkInfo.image = pictureBox1;
bookMarkInfo.spatialReference = mapControlMain.FocusMap.SpatialReference; m_DicBookMarkInfo.Add(m_BookMarkName, bookMarkInfo);//将信息存进字典表中
}
二、点击书签地图定位书签的范围
点击书签分为单击和双击,单击时选中书签,双击时,地图范围更新变化,单击时:选中书签,其他选中的书签设置为不选中
/// <summary>
/// 单击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void ItemPictureBox_Click(object sender, EventArgs e)
{
LayoutControlItem item = (LayoutControlItem)sender;
m_SelectedBookMarkName = item.Name; item.Selected = true;
foreach (String key in m_DicBookMarkInfo.Keys)
{
if (key != item.Name)
{
BookMarkInfo structBookMark = new BookMarkInfo();
structBookMark = (BookMarkInfo)m_DicBookMarkInfo[key]; LayoutControlItem otherItem = structBookMark.layoutControlItem;
otherItem.Selected = false;
}
}
}
双击时:获取存储的选中对应书签的范围,并根据地图坐标系的不同进行转换,然后将地图的视图更新为选中书签的范围
/// <summary>
/// 双击标签图片
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void ItemPictureBox_DoubleClick(object sender, EventArgs e)
{
LayoutControlItem pb = (LayoutControlItem)sender;
pan(pb);
}
/// <summary>
/// 定位函数
/// </summary>
/// <param name="pb">书签控件</param>
private void pan(LayoutControlItem pb)
{
BookMarkInfo structBookMarkInfo = new BookMarkInfo();
structBookMarkInfo = (BookMarkInfo)m_DicBookMarkInfo[pb.Name];
IEnvelope envelope = structBookMarkInfo.envelope;
IPointCollection polygon = new Polygon();
String name = pb.Name;
polygon.AddPoint(transform(envelope.XMax, envelope.YMax, name, ), transform(envelope.XMax, envelope.YMax, name, ));
polygon.AddPoint(transform(envelope.XMin, envelope.YMax, name, ), transform(envelope.XMin, envelope.YMax, name, ));
polygon.AddPoint(transform(envelope.XMax, envelope.YMin, name, ), transform(envelope.XMax, envelope.YMin, name, ));
polygon.AddPoint(transform(envelope.XMin, envelope.YMin, name, ), transform(envelope.XMin, envelope.YMin, name, ));
IGeometry geometry = polygon as IGeometry; m_ActiveView.ZoomTo(geometry);
m_ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll); LayoutControlItem item = structBookMarkInfo.layoutControlItem;
item.Selected = true; foreach (String key in m_DicBookMarkInfo.Keys)
{
if (key != item.Name)
{
BookMarkInfo structBookMark = new BookMarkInfo();
structBookMark = (BookMarkInfo)m_DicBookMarkInfo[key]; LayoutControlItem otherItem = structBookMark.layoutControlItem;
otherItem.Selected = false;
}
}
} /// <summary>
/// 不同坐标系间坐标转换函数
/// </summary>
/// <param name="x">原坐标系x坐标</param>
/// <param name="y">原坐标系x坐标</param>
/// <param name="name">书签名称</param>
/// <param name="flag">判断返回x或y的对象</param>
/// <returns>转换后xy坐标</returns>
private double transform(double x, double y, String name, int flag)
{
BookMarkInfo structBookMarkInfo = new BookMarkInfo();
structBookMarkInfo = (BookMarkInfo)m_DicBookMarkInfo[name];
// 定义点
IPoint point = new PIE.Geometry.Point();
point.PutCoords(x, y);
// 设置空间参考
IGeometry geo = point as IGeometry;
geo.SpatialReference = structBookMarkInfo.spatialReference;
// 空间参考变换
geo.Transform(m_ActiveView.FocusMap.SpatialReference);
// 获取坐标值
double x1, y1;
x1 = y1 = ;
point.QueryCoords(ref x1, ref y1);
if (flag == ) return x1;
else return y1;
}
代码路径:
|
项目名称 |
百度云盘地址下/PIE示例程序/13.小工具集锦/地图书签/ BookMarkDemo |
|
数据路径 |
百度云盘地址下/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地图放大镜
放大镜,在地图的浏览过程中在主地图和次地图中起到很好的辅助作用, 要实现放大镜功能主要就是通过两个mapControl控件,主地图控件是mapControlMain,放大镜控件是UserControl ...
随机推荐
- 8.python 系统批量运维管理器之pexpect模块
小插曲 前几节讲了paramiko模块,但是pexpect模块的功能几乎跟paramiko一样,先来分析一下: 1.各自介绍 pexpect是一个通过启动子程序,使用正则表达式对程序输出做出特定响应, ...
- qt-vs-addin:Qt4和Qt5之VS插件如何共存与使用(转)
原则上,两者是不可以同时存在的,但是如果都安装了,该如何分别使用他们呢? Qt4 Visual Studio Add-in:官网可以下载安装程序,qt-vs-addin-1.1.11-opensour ...
- C#获取文件的Content-Type(MIME Type)的方法
使用静态类MimeMapping(需要.NET Framework 4.5及以后的支持) string fileName = "D:\myfile.txt"; var conten ...
- 关于 Azure 安全性的 10 点提示
讨论云服务时,安全性是一个关键领域.实际上,Windows Azure 基础结构实施大量的技术和流程来保护环境.此页介绍 Microsoft 的全球基础服务如何运行基础结构以及它们实施的安全措施. 从 ...
- C# JSON使用的常用技巧(二)
JSON在php里一句json_encode就可以得到 在C#里我们同样也很容易的可以得到 用到的类库:Newtonsoft.Json.dll 实体类: class Cat { public stri ...
- 编写高质量代码改善C#程序的157个建议——建议7: 将0值作为枚举的默认值
建议7: 将0值作为枚举的默认值 允许使用的枚举类型有byte.sbyte.short.ushort.int.uint.long和ulong.应该始终将0值作为枚举类型的默认值.不过,这样做不是因为允 ...
- 【leetcode】Move Zeroes
Move Zeroes 题目: Given an array nums, write a function to move all 0‘s to the end of it while maintai ...
- android MVP模式简单介绍
原文 http://zhengxiaopeng.com/2015/02/06/Android%E4%B8%AD%E7%9A%84MVP/ 前言 MVP作为一种MVC的演化版本在Android开发中受到 ...
- C#中的枚举使用
基本用法 默认从0开始分配各个枚举值对应的数字值 public enum VariableType { Type1, Type2 } 指定各个枚举值对应的数字值 public enum Variabl ...
- 20165219 2017-2018-2 《Java程序设计》第9周学习总结
20165219 2017-2018-2 <Java程序设计>第9周学习总结 课本知识总结 URL类 URL类是java.net包中的一个重要的类,使用URL创建对象的应用程序称为客户端程 ...