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 = 1; this.Close(); } //取消按鈕 private void btnCel_Click(object sender, EventArgs e) { txtBookMarks.Text = ""; m_check = 0; 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 == 1) { 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(); }
