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

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

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

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

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

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

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. php抓取网页中的内容

    以下就是几种常用的用php抓取网页中的内容的方法.1.file_get_contentsPHP代码代码如下:>>>>>>>>>>>&g ...

  2. Linux下的多线程下载工具mwget

    之前在做项目的时候,遇到一个难题,需要一个多线程下载器,于是阴差阳错的看到了这款工具--mwget,之所以是阴差阳错,是因为mwget的多线程下载功能,并不是我们想要的多线程. wget大家都知道吧, ...

  3. /dev/null 位桶

    把/dev/null看作"黑洞". 它非常等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到. 然而, /dev/null对命令行和脚本都非 ...

  4. C++ 虚基类 派生与继承

    在学习设计模式时我就有一个疑问,关联和继承除了用法上的区别,好像在内存上并没有什么区别,继承也是父类作为了子类的元素(内存上),关联也是这样.而且关联好像更占内存一些.这就是设计模式里问题了“依赖倒转 ...

  5. LeetCode(258.各位相加)的思路及解决过程

    问题如下: 给一个非负整数 num,反复添加所有的数字,直到结果只有一个数字. 例如: 设定 num = 38,过程就像: 3 + 8 = 11, 1 + 1 = 2. 由于 2 只有1个数字,所以返 ...

  6. HttpWebRequest post上传文件

    public static string HttpUploadFile(string url, string path) { // 设置参数 HttpWebRequest request = WebR ...

  7. IE11下使用fixed定位时鼠标滚动不平滑

    很久不用IE了,近期做兼容性测试发现一个fixed定位的问题,当元素使用fixed定位时,其应该不随页面滚动,在chrome/firefox/edge下都很完美,元素完全不动,但是使用IE11时,如果 ...

  8. windows环境下安装ZooKeeper

    $.说明 ZooKeeper: ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件. 它是一个为分布式 ...

  9. 解决eclipse Building workspace(Sleeping)闪烁

    出现这个是因为我,把两个有错的项目.从工程里面删除掉之后,再接着运行新的工程,但是Building workspace一直没有执行完毕,导致新的工程无法运行. 这个时候可以关闭自动编译,就可以运行新的 ...

  10. 【转】C#中的combobox里DropDownStyle

    源地址:https://blog.csdn.net/cf643487053/article/details/54016822 C#中的combobox控件里DropDownStyle有三种选项 Sim ...