ArcGIS Engine開發之書簽加載


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;
            }
        }
View Code

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);
            }
                
        }
View Code

新建書簽管理窗體,如圖:

 

代碼:

 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();
        }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM