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

地图刚加载的时候是一幅世界地图

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

创建后书签,在地图上随意拖动地图,并进行放大或缩小,然后点击“南美洲”书签,地图会定位到书签的南美洲视图范围。

下面来介绍下实现的主要代码:

要实现地图书签功能主要有两个步骤:

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地图书签的更多相关文章

  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地图放大镜

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

随机推荐

  1. oracle数据库列的操作

    本章和大家分享一下如何在数据库中进行列的一些相关操作. 1.增加列名 (我们先来看一个原始版本) 下面我们增加一个列名tel  记住,增加列时需要把列对应的数据类型要说明,不然会报错. alter t ...

  2. javascript总结8:JavaScript 类型转换

    1 JavaScript 数据类型转换 1.1 数字类型转字符串 n1 = 10;var n2 =String(n1); 或者 var n3 = n1.toString(n1); 1.2 字符串转数字 ...

  3. UIView 和 CALayer区别 为啥有UIView还要CALayer?

    今天,被坑了,面试的时候没回答出来,特此记录一下 一.继承结构 1: UIView的继承结构为: UIResponder : NSObject UIResponder是用来响应事件的,也就是UIVie ...

  4. html manifest 离线配置

    HTML5 引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在没有因特网连接时进行访问. 应用程序缓存为应用带来三个优势: 离线浏览 - 用户可在应用离线时使用它们 速度 - 已缓存资源加载 ...

  5. 《C#多线程编程实战》2.10 SpinWait

    emmm 这个SpinWait 中文是自旋等待的意思. 所谓自旋,就是自己追自己影子,周伯通的左右手互博,不好听就是放屁自己追着玩,小狗转圈咬自己的尾巴 SpinWait是一个结构体,并不是一个类. ...

  6. JavaScript中的原型模式

    我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法.使用原型对象的好处是可以让所有对象实例共享它 ...

  7. Python第二周总结

    之所以晚发10天是因为中途发生了很多事情,让我比较懵,甚至都想放弃学Python,但自己选择的路,在艰难也得走下去,加油!!! 补充上期str后缀小魔法: 字符串一旦创建不得修改,一旦修改或拼接,就会 ...

  8. 计算机基础知识和tcp详解

    计算机基础知识 作为应用软件开发程序员是写应用软件的,而应用软件必须应用在操作系统之上,调用操作系统接口,由操作系统控制硬件 比如客户端软件想要基于网络发送一条消息给服务端软件,流程是: 1.客户端软 ...

  9. Liunx常用的100条命令汇存

    1.关机 shutdown -h now 立刻关机 poweroff shutdown -r now 立刻重启 reboot logout 注销 2.进入图形界面 startx 3.vi编辑器 [vi ...

  10. 如何理解<base href="<%=basePath%>" ---转载

    原文链接http://316325524.blog.163.com/blog/static/6652052320111118111620897/ "base href " 今天在写 ...