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

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

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

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

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

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

1、如何创建书签;

2、点击书签地图如何定位到书签的范围

一、创建书签

显示书签的列表用的是Devexpress插件中的  LayoutControl控件,

将要保存书签的视图范围输出为图片.png格式,然后用文件流将图片转换成Image,显示在书签列表中。示例中创建的书签信息数据存储在字典表IDictionary<string,object>  m_DicBookMarkInfo中,其中值存储形式格式定义的是结构体BookMarkInfo,书签信息数据可以根据数据库的不同进行存储;

 1 /// <summary>
 2 /// 存储书签信息结构体
 3 /// </summary>
 4 public struct BookMarkInfo
 5 {
 6     public string key;//书签名称
 7     public LayoutControlItem layoutControlItem;//书签子控件
 8     public PIE.Geometry.IEnvelope envelope;//书签范围
 9     public PictureBox image;//书签范围图片
10     public PIE.Geometry.ISpatialReference spatialReference;//空间参考
11 }

 1 /// <summary>
 2 /// 添加地图书签
 3 /// </summary>
 4 /// <param name="sender"></param>
 5 /// <param name="e"></param>
 6 private void tbn_AddBookMark_Click(object sender, EventArgs e)
 7 {
 8     //1、获取书签的名称
 9     FrmAddBookMark bookMark = new FrmAddBookMark(m_DicBookMarkInfo);
10     if (bookMark.ShowDialog() != DialogResult.OK) return;
11     m_BookMarkName = bookMark.GetBookMarkName();
12     if (string.IsNullOrEmpty(m_BookMarkName)) return;
13
14     //2、输出图片
15     IDisplayTransformation displayTransformation = mapControlMain.ActiveView.DisplayTransformation;
16     PIE.Carto.ExportPNG export = new ExportPNG();
17     export.Width = (int)displayTransformation.DeviceFrame.Width;
18     export.Height = (int)displayTransformation.DeviceFrame.Height;
19     export.ExportFileName = @"..\Data\Bookmark\pic\" + m_BookMarkName + ".png";
20
21     string filePath = Path.GetDirectoryName(export.ExportFileName);
22     if (!Directory.Exists(filePath))
23     {
24         Directory.CreateDirectory(filePath);
25     }
26     export.StartExporting();
27     mapControlMain.ActiveView.Output(export as IExport, 96, displayTransformation.DeviceFrame, mapControlMain.ActiveView.Extent, null);
28     export.FinishExporting();
29
30     //3、界面设计(将图片展示在书签列表)
31     Design(export.ExportFileName);
32 }
33 /// <summary>
34 /// 书签界面设计
35 /// </summary>
36 /// <param name="filePath">输出图片路径</param>
37 private void Design(string filePath)
38 {
39     PictureBox pictureBox1 = new PictureBox();
40     //将保存的图片展示在书签列表
41     using (FileStream image = new FileStream(filePath, FileMode.Open))
42     {
43         pictureBox1.Image = Image.FromStream(image);
44     }
45     LayoutControlItem item = layoutControlGroup1.AddItem(m_BookMarkName, pictureBox1) as LayoutControlItem;
46     item.Name = m_BookMarkName;
47
48     pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
49     IEnvelope envelope = m_ActiveView.Extent;
50     pictureBox1.Name = m_BookMarkName;
51     pictureBox1.Size = new Size(300, 100);
52     pictureBox1.Enabled = false;
53
54     //事件
55     item.Click += ItemPictureBox_Click;
56     item.DoubleClick += ItemPictureBox_DoubleClick;
57
58     item.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
59     item.MaxSize = new Size(250, 150);
60     item.MinSize = new Size(250, 150);
61     item.TextLocation = DevExpress.Utils.Locations.Bottom;
62
63     item.AppearanceItemCaption.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
64     item.Spacing = new DevExpress.XtraLayout.Utils.Padding(10);
65     item.AppearanceItemCaption.Font = new System.Drawing.Font("宋体", 13F, FontStyle.Bold);
66
67     //存储标签信息
68     BookMarkInfo bookMarkInfo = new BookMarkInfo();
69     bookMarkInfo.key = m_BookMarkName;
70     bookMarkInfo.layoutControlItem = item;
71     bookMarkInfo.envelope = envelope;
72     bookMarkInfo.image = pictureBox1;
73     bookMarkInfo.spatialReference = mapControlMain.FocusMap.SpatialReference;
74
75     m_DicBookMarkInfo.Add(m_BookMarkName, bookMarkInfo);//将信息存进字典表中
76 }

二、点击书签地图定位书签的范围

点击书签分为单击和双击,单击时选中书签,双击时,地图范围更新变化,单击时:选中书签,其他选中的书签设置为不选中

 1 /// <summary>
 2 /// 单击事件
 3 /// </summary>
 4 /// <param name="sender"></param>
 5 /// <param name="e"></param>
 6 void ItemPictureBox_Click(object sender, EventArgs e)
 7 {
 8     LayoutControlItem item = (LayoutControlItem)sender;
 9     m_SelectedBookMarkName = item.Name;
10
11     item.Selected = true;
12     foreach (String key in m_DicBookMarkInfo.Keys)
13     {
14         if (key != item.Name)
15         {
16             BookMarkInfo structBookMark = new BookMarkInfo();
17             structBookMark = (BookMarkInfo)m_DicBookMarkInfo[key];
18
19            LayoutControlItem otherItem = structBookMark.layoutControlItem;
20             otherItem.Selected = false;
21         }
22     }
23 }

双击时:获取存储的选中对应书签的范围,并根据地图坐标系的不同进行转换,然后将地图的视图更新为选中书签的范围

 1 /// <summary>
 2 /// 双击标签图片
 3 /// </summary>
 4 /// <param name="sender"></param>
 5 /// <param name="e"></param>
 6 void ItemPictureBox_DoubleClick(object sender, EventArgs e)
 7 {
 8     LayoutControlItem pb = (LayoutControlItem)sender;
 9     pan(pb);
10 }
11     /// <summary>
12     /// 定位函数
13     /// </summary>
14     /// <param name="pb">书签控件</param>
15     private void pan(LayoutControlItem pb)
16     {
17     BookMarkInfo structBookMarkInfo = new BookMarkInfo();
18     structBookMarkInfo = (BookMarkInfo)m_DicBookMarkInfo[pb.Name];
19     IEnvelope envelope = structBookMarkInfo.envelope;
20     IPointCollection polygon = new Polygon();
21     String name = pb.Name;
22     polygon.AddPoint(transform(envelope.XMax, envelope.YMax, name, 1), transform(envelope.XMax, envelope.YMax, name, 2));
23     polygon.AddPoint(transform(envelope.XMin, envelope.YMax, name, 1), transform(envelope.XMin, envelope.YMax, name, 2));
24     polygon.AddPoint(transform(envelope.XMax, envelope.YMin, name, 1), transform(envelope.XMax, envelope.YMin, name, 2));
25     polygon.AddPoint(transform(envelope.XMin, envelope.YMin, name, 1), transform(envelope.XMin, envelope.YMin, name, 2));
26     IGeometry geometry = polygon as IGeometry;
27
28     m_ActiveView.ZoomTo(geometry);
29     m_ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll);
30
31     LayoutControlItem item = structBookMarkInfo.layoutControlItem;
32     item.Selected = true;
33
34     foreach (String key in m_DicBookMarkInfo.Keys)
35     {
36         if (key != item.Name)
37         {
38             BookMarkInfo structBookMark = new BookMarkInfo();
39             structBookMark = (BookMarkInfo)m_DicBookMarkInfo[key];
40
41             LayoutControlItem otherItem = structBookMark.layoutControlItem;
42             otherItem.Selected = false;
43         }
44     }
45     }
46
47     /// <summary>
48     /// 不同坐标系间坐标转换函数
49     /// </summary>
50     /// <param name="x">原坐标系x坐标</param>
51     /// <param name="y">原坐标系x坐标</param>
52     /// <param name="name">书签名称</param>
53     /// <param name="flag">判断返回x或y的对象</param>
54     /// <returns>转换后xy坐标</returns>
55     private double transform(double x, double y, String name, int flag)
56     {
57     BookMarkInfo structBookMarkInfo = new BookMarkInfo();
58     structBookMarkInfo = (BookMarkInfo)m_DicBookMarkInfo[name];
59     // 定义点
60     IPoint point = new PIE.Geometry.Point();
61     point.PutCoords(x, y);
62     // 设置空间参考
63     IGeometry geo = point as IGeometry;
64     geo.SpatialReference = structBookMarkInfo.spatialReference;
65     // 空间参考变换
66     geo.Transform(m_ActiveView.FocusMap.SpatialReference);
67     // 获取坐标值
68     double x1, y1;
69     x1 = y1 = 0;
70     point.QueryCoords(ref x1, ref y1);
71     if (flag == 1) return x1;
72     else return y1;
73     }

代码路径:

项目名称

百度云盘地址下/PIE示例程序/13.小工具集锦/地图书签/ BookMarkDemo

数据路径

百度云盘地址下/PIE示例数据/栅格数据/04.World/World.tif

视频路径

百度云盘地址下/PIE视频教程/13.小工具集锦/地图书签.avi

注意:

在地图初始化的时候,图层树控件需要手动绑定地图控件:

tocControlMain.SetBuddyControl(mapControlMain as PIE.Carto.IPmdContents);

效果图:

转载于:https://www.cnblogs.com/PIESat/p/10307336.html

PIE SDK地图书签相关推荐

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

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

  2. PIE SDK CommandTool工具命令一览表

    PIE SDK Command&&Tool工具命令一览表 编号 模板 名称(中文) Command&Tool 程序集 备注 1 数据管理 加载栅格数据 PIE.Controls ...

  3. PIE SDK与OpenCV结合说明文档

    1.功能简介 OpenCV是基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效--由一系列 C 函数和少量 ...

  4. PIE SDK点元素的绘制

    1. 功能简介 在数据的处理中会用到点元素的绘制,目前PIE SDK支持IMarkerSymbol的点元素的绘制,MarkerSymbol对象是用于修饰点状对象的符号,它包括ArrowMarkerSy ...

  5. PIE SDK影像坏线修复

    1.算法功能简介 坏条带的由来:2003年5月31日,Landsat-7ETM+机载扫描行校正器(SLC) 故障,导致此后获取的影像出现了数据条带丢失,严重影响了Landsat ETM遥感影像的使用. ...

  6. PIE SDK矢量数据的读取

    1.功能简介 GIS将地理空间数据表示为矢量数据和栅格数据.矢量数据模型使用点.线和多边形来表示具有清晰空间位置和边界的空间要素,如控制点.河流和宗地等,每个要素被赋予一个ID,以便与其属性相关联.栅 ...

  7. Android接入高德地图SDK,Android高德SDK 地图篇一:集成高德SDK

    Android高德SDK 地图篇一:集成高德SDK 大家好,这是系列博文的第一篇: 系列博文会完成以下功能 一. 地图篇:利用高德SDK实现滴滴出行的效 二. 导航篇:利用高德SDK实现滴滴司机端的效 ...

  8. PIE SDK傅里叶变换

    1.算法功能简介 傅里叶变换能把遥感图像从空域变换到只包含不同频域信息的频域中.原图像上的灰度突变部位(如物体边缘).图像结构复杂的区域.图像细节及干扰噪声等,经傅里叶变换后,其信息大多集中在高频区: ...

  9. PIE SDK与IDL算法结合说明文档

    1.功能简介 IDL是一门简单易用的科学计算和可视化语言,包含大量的图形图像处理函数,尤其是同ENVI结合集成了该软件的大量功能,因此被广泛用于遥感.地信领域. 本示例程序实现了IDL算法与PIESD ...

最新文章

  1. Linux echo 显示内容颜色
  2. mysql 使用不同引擎_mysql 不同引擎的比较
  3. 集合元素处理(传统方式)
  4. 前端学习(2672):ts初步概念和功能实现
  5. Jmeter BeanShell采样器提取接口响应并传递(三)
  6. Opencv--cvGEMM、cvMatMul和cvMatMulAdd的定义
  7. edge如何导入html文件收藏夹,win10浏览器 edge浏览器收藏夹怎么导入?
  8. 张艾迪(创始人): 我的梦想与成长之路
  9. C++调用 Json解析与处理库
  10. net core 模型绑定与之前版本的不同-FromBody 必须对应Json格式
  11. Linux系统下载Unity-Tweek-Tool
  12. adb的环境搭建,下载和卸载app
  13. seo人员必须知道的基础知识
  14. SFDC 日常经验积累
  15. 基于奇异值分解的图像压缩和信息隐藏
  16. 逆向学习实战之--替换哈罗单车图片
  17. 「媒体邀约」如何选择适合的媒体公关,媒体服务供应商
  18. 《士兵突击》之伍六一:最钢铁的男儿最柔软的内心
  19. 计算机丢失quartz.dll什么意思,教你win10系统quartz.dll丢失找不到指定模块的解决教程...
  20. 完整elasticsearch安装及其插件安装

热门文章

  1. Silverlight在IE中无法显示但在Firefox中正常的原因和解决办法
  2. Android卡片设置透明度失效问题
  3. 将勾选数据从dataset中筛选出来
  4. 显式Intent 和隐式 Intent 的区别
  5. 【java集合框架源码剖析系列】java源码剖析之ArrayList
  6. Oracle客户端tnsnames.ora连接配置
  7. 全屏幕文本编辑器___Q10的设置:
  8. Unable to load print control in ReportingService
  9. mysql 分段执行_19个MySQL优化技巧,索引优化这样做最有效!
  10. python如何爬取网站所有目录_用python爬虫爬取网站的章节目录及其网址