ArcGIS中书签是保存特定视图范围的快捷方式。使用书签保存关注的视图范围,可在需要时快速定位、查看与浏览。书签功能主要用到IMapBookmarks、ISpatialBookmark和IAOIBookmark三个接口。

通过IMapBookmarks接口的Bookmarks属性可以得到地图文档中已经存在的所有书签对象,通过该接口的AddBookmark和RemoveBookmark方法可以对书签进行添加和删除。

ISpatialBookmark接口定义所有空间书签的共同功能,特别是书签的Name属性和ZoomTo方法。Name属性定义了书签的名字,通过ZoomTo方法可跳转到书签位置点。

IAOIBookmark接口继承自ISpatialBookmark接口,新增了Location属性,用于存储地图中感兴趣的范围。


1、添加书签

新建一个窗体用于设置书签名称,窗体界面如图:

实现:

public partial class FormBookMarks : DevExpress.XtraEditors.XtraForm
{
/// <summary>
/// 定义全局变量
/// </summary>
///
private string m_bookmark;//书签名
private int m_check;//是否创建书签
public FormBookMarks()
{
InitializeComponent();
} private void FormBookMarks_Load(object sender, EventArgs e)
{
//设置确定按钮一开始的不可用性
btnOk.Enabled = false;
}
/// <summary>
/// 确定按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnOk_Click(object sender, EventArgs e)
{
m_bookmark = txtBookMarks.Text;
txtBookMarks.Text = "";
m_check = ;
this.Close();
}
//取消按钮
private void btnCel_Click(object sender, EventArgs e)
{
txtBookMarks.Text = "";
m_check = ;
this.Close();
}
//设置书签为只读
public string Bookmark
{
get { return m_bookmark; }
}
//是否创建书签变量为只读
public int Check
{
get { return m_check; }
}
/// <summary>
/// 在TextBox中文本改变事件中设置按钮的可用性
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void txtBookMarks_TextChanged(object sender, EventArgs e)
{
if (txtBookMarks.Text == "")
{
btnOk.Enabled = false;
}
else
{
btnOk.Enabled = true;
}
}

mainForm中的代码

 /// <summary>
/// 添加书签的操作
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnOpenBookMark_ItemClick(object sender, ItemClickEventArgs e)
{
FormBookMarks frmBookMark = new FormBookMarks();
frmBookMark.ShowDialog();
string pName = string.Empty;
int check = frmBookMark.Check; if (check == )
{
pName = frmBookMark.Bookmark;
}
if (string.IsNullOrEmpty(pName)) return; //书签进行重名判断
IMapBookmarks mapBookmarks= mainMapControl.Map as IMapBookmarks;
IEnumSpatialBookmark enumSpatialBookmarks = mapBookmarks.Bookmarks;
enumSpatialBookmarks.Reset();
ISpatialBookmark pSpatialBookmark; while ((pSpatialBookmark = enumSpatialBookmarks.Next()) != null)
{
if (pName == pSpatialBookmark.Name)
{
DialogResult dr = MessageBox.Show("此书签名已存在!是否替换?", "提示", MessageBoxButtons.YesNoCancel);
if (dr == DialogResult.Yes)
{
mapBookmarks.RemoveBookmark(pSpatialBookmark);
}
else if (dr == DialogResult.No)
{
frmBookMark.ShowDialog();
}
else
{
return;
}
}
} //获取当前地图的对象
IActiveView pActiveView = mainMapControl.Map as IActiveView;
//创建一个新的书签并设置其位置范围为当前视图的范围
IAOIBookmark pBookmark = new AOIBookmarkClass();
pBookmark.Location = pActiveView.Extent;
//获得书签名
pBookmark.Name = pName;
//通过IMapBookmarks接口访问当前地图书签集,添加书签到地图的书签集中
IMapBookmarks pMapBookmarks = mainMapControl.Map as IMapBookmarks;
pMapBookmarks.AddBookmark(pBookmark);
}
/// <summary>
/// 书签管理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnOpenMangerBookMark_ItemClick(object sender, ItemClickEventArgs e)
{ try
{
FormMangerBookMark frmManageBookmark = new FormMangerBookMark(mainMapControl.Map);
frmManageBookmark.ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
} }

新建书签管理窗体,如图:

代码:

 public partial class FormMangerBookMark : DevExpress.XtraEditors.XtraForm
{
/// <summary>
/// 定义全局变量
/// </summary>
///
private IMap _currentMap = null;
Dictionary<string, ISpatialBookmark> pDictionary = new Dictionary<string, ISpatialBookmark>();
IMapBookmarks mapBookmarks = null; public FormMangerBookMark(IMap pMap)
{
InitializeComponent();
_currentMap = pMap;//获取当前地图
InitControl();
}
/// <summary>
/// 获取空间书签,对ListBookmark进行初始化
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
///
private void InitControl()
{
mapBookmarks = _currentMap as IMapBookmarks;
IEnumSpatialBookmark enumSpatialBookmarks = mapBookmarks.Bookmarks;
enumSpatialBookmarks.Reset();
ISpatialBookmark pSpatialBookmark = enumSpatialBookmarks.Next(); string sBookMarkName = string.Empty;
while (pSpatialBookmark != null)
{
sBookMarkName = pSpatialBookmark.Name;
//增加树节点
treeView1.Nodes.Add(sBookMarkName );
// advTree1 . Nodes.Add(sBookMarkName);
//添加到数据字典
pDictionary.Add(sBookMarkName, pSpatialBookmark);
pSpatialBookmark = enumSpatialBookmarks.Next();
}
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void FormMangerBookMark_Load(object sender, EventArgs e)
{ }
/// <summary>
/// 定位按钮的功能
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnPosition_Click(object sender, EventArgs e)
{ //DevComponents.AdvTree.Node pSelectedNode =advTree1.SelectedNode;
TreeNode pSelectedNode = treeView1.SelectedNode;
//获取书签中的书签范围
ISpatialBookmark pSpatialBM = pDictionary[pSelectedNode.Text];
//缩放到选中的范围
pSpatialBM.ZoomTo(_currentMap);
IActiveView pActiveView = _currentMap as IActiveView;
pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);
}
/// <summary>
/// 删除书签的操作
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnDeleterBookMark_Click(object sender, EventArgs e)
{
// DevComponents.AdvTree.Node pSelectedNode = advTree1.SelectedNode;
TreeNode pSelectedNode = treeView1.SelectedNode;
ISpatialBookmark pSpatialBM=pDictionary [pSelectedNode .Text ];
//删除选中的书签对象
mapBookmarks.RemoveBookmark(pSpatialBM);
//删除字典中数据
pDictionary.Remove(pSelectedNode.Text );
//删除树节点
treeView1.Nodes.Remove(pSelectedNode );
treeView1.Refresh();
}
/// <summary>
/// 取消按钮的设置
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnCloseBookMark_Click(object sender, EventArgs e)
{
Close();
}
/// <summary>
/// 鼠标双击定位设置
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param> private void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
{
btnPosition.PerformClick();
}

ArcGIS Engine开发之书签加载的更多相关文章

  1. ArcGIS Engine中数据的加载 (转)

    1.加载Shapefile数据 1 IWorkspaceFactory pWorkspaceFactory; 2 IFeatureWorkspace pFeatureWorkspace; 3 IFea ...

  2. ArcGIS Engine开发之地图基本操作(4)

    ArcGIS Engine开发中数据库的加载 1.加载个人地理数据库数据 个人地理数据库(Personal Geodatabase)使用Miscrosoft Access文件(*.mdb)进行空间数据 ...

  3. ArcGIS Engine开发前基础知识(2)

    ArcGIS基本控件简介 ArcGIS Engine控件是一组可视化的开发组件,每个ArcGIS Engine控件都是一个COM组件.这些组件包括MapControl,PageLayoutContro ...

  4. C#,ArcGIS Engine开发入门教程

    C#,ArcGIS Engine开发入门教程 转自:http://blog.csdn.net/yanleigis/article/details/2233674  目录(?)[+] 五实现 一 加载A ...

  5. ArcGIS Engine开发基础总结(一)

    标准Engine功能 地图浏览    地图制作 数据查询 数据分析 及 所有的开发控件 —MapControl, PageLayout, Toolbar, TOC, ArcReader 对所有矢量和栅 ...

  6. ArcGIS Engine开发鹰眼图的功能(基础篇)

    鹰眼是用于调节全视域范围内主地图显示范围情况的副地图.它体现了地图整体与详细局部的关系. 用户可以通过鼠标单击或者画框等动作实现鹰眼与主地图的交互情况. 鹰眼功能的原理是通过主地图窗口的地图控件和鹰眼 ...

  7. arcgis android 中shapefile的加载

    前言 本文为大家分享arcgis android 中shapefile的加载,默认你有java环境,懂一定的android基础知识,默认你已经安装android studio.如缺乏以上环境和知识,请 ...

  8. ArcGIS Engine开发前基础知识(3)

    对象模型图 一.对象模型图中的类与接口 ArcGIS Engine 提供大量的对象,这些对象之间存在各种各样的关系,如继承.组合.关联等.对象模型图(Object model diagram,ODM) ...

  9. ArcGIS Engine开发的ArcGIS 版本管理的功能

    原文:ArcGIS Engine开发的ArcGIS 版本管理的功能 转自:http://blog.csdn.net/linghe301/article/details/7965901 这是以前的Arc ...

随机推荐

  1. BRDF 光照模型

    http://blog.csdn.net/liu_lin_xm/article/details/4846144

  2. ola.hallengren的SQL Server维护脚本

    ola.hallengren的SQL Server维护脚本 下载地址 http://files.cnblogs.com/files/lyhabc/ola.hallengrenMaintenanceSo ...

  3. 探索 Linux 系统的启动过程

    引言 之所以想到写这些东西,那是因为我确实想让大家也和我一样,把 Linux 桌面系统打造成真真正正日常使用的工具,而不是安装之后试用几把再删掉.我是真的在日常生活和工作中都使用 Linux,比如在 ...

  4. 详解微信开发者文档——5 access_token管理

    写在前面的话:前几篇博客详细讲解了如何获取用户发送的消息并进行回复,这里的回复是一种被动的回复,而被动回复的方式便是通过echo返回信息给微信服务器的POST请求,因此,其实我们并没有算的上调用了微信 ...

  5. ABP(现代ASP.NET样板开发框架)系列之3、ABP分层架构

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之3.ABP分层架构 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...

  6. C++ std::deque

    std::deque template < class T, class Alloc = allocator > class deque; Double ended queue deque ...

  7. 每日设置Bing首页图片为壁纸

    闲来无事,手痒痒要做一个什么小工具. 于是乎便有了本文. 当有一个想法的时候,首先免不了网上搜索一番以便看一下有木有网友有过类似的想法. 很显然--有! 因此本文大代码是从几个地方搜索,然后组合的. ...

  8. epoll LT/ET 深度剖析

    EPOLL事件的两种模型: Level Triggered (LT) 水平触发 .socket接收缓冲区不为空 有数据可读 读事件一直触发 .socket发送缓冲区不满 可以继续写入数据 写事件一直触 ...

  9. 前端学HTTP之URL

    × 目录 [1]URI [2]URL语法 [3]字符[4]编码方法 前面的话 一般地,URL和URI比较难以区分.接下来,本文以区分URL和URI为引子,详细介绍URL的用法 URI与URL的区别 U ...

  10. angular2系列教程(五)Structural directives、再谈组件生命周期

    今天,我们要讲的是structural directives和组件生命周期这两个知识点.structural directives顾名思义就是改变dom结构的指令.著名的内建结构指令有 ngIf, n ...