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 ...
随机推荐
- UIView 和 CALayer区别 为啥有UIView还要CALayer?
今天,被坑了,面试的时候没回答出来,特此记录一下 一.继承结构 1: UIView的继承结构为: UIResponder : NSObject UIResponder是用来响应事件的,也就是UIVie ...
- java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V
异常完整信息 严重: Servlet.service() for servlet RegServlet threw exception java.lang.NoSuchMethodError: org ...
- 深入理解python中可迭代对象,迭代器,生成器
英文原文出处:Iterables vs. Iterators vs. Generators 在python学习中,通常会陷入对以下几个相关概念之间的确切差异的困惑中: a container(容器) ...
- lda:变分的推导
lda,latent diriclet allocation,是一个最基本的bayesian模型.本文要研究lda基于变分的推导方法.意义是重大的. 一.符号的定义 : the number of t ...
- C# / .Net Core 访问MongoDb库
话不多说直接上代码 连接字符串: { "AppSettings": { "mongodb": "mongodb://用户名:密码@IP地址:端口号&q ...
- "ServiceStack.Redis.RedisNativeClient”的方法“get_Db”没有实现。
解决办法: 1.首先通过nuget程序包管理器将相关依赖项卸载干净 2.检查各项目模块中的package.config里还有没有redis的节点,如果已经存在就删除掉 3.去别的正常的项目中看一下re ...
- php 递归求得目录大小
/* * 递归求得目录大小 * @param $dir 目录 */ function dirsize($dir){ $allsize = 0; $handle = opendir($dir); whi ...
- [Swift实际操作]九、完整实例-(4)在项目中使用CocoaPod管理类库和插件
本文将为你演示,如何使用CocoaPod第三方类库管理工具,在项目中安装未来需要使用的类库.首先创建一份文本文件.可以使用一个脚本创建文件,你可以采用自己的方式是创建一份文本文件,接着在文件名称上点击 ...
- java学习笔记之对象序列化
1.简述 java对象序列化就是将对象编程二进制数据流的一种方法,从而实现对对象的传输和存储 2.作用 java是门面向对象编程语言,即一切皆对象,但是java对象只能存在于jvm中,一旦jvm停掉那 ...
- express + vue 项目搭建
最近建了一个node服务端加vue前端的项目 安装node :npm install node 安装express :npm install express -g (-g全局安装) 构建express ...