ArcEngine中书签定位功能的实现

1、前言

本文介绍ArcEngine中书签定位功能的实现。

2、创建工程

创建一个WinForm工程,新建三个窗体:frmMainfrmAddfrmManage,然后新建一个类Utility.cs,如下图所示:

在这里插入图片描述
frmMain界面如下图所示:

在这里插入图片描述

frmAdd界面如下图所示:

在这里插入图片描述

frmManage界面如下图所示:

在这里插入图片描述

3、实现代码

frmMain代码如下:

using System;
using System.Windows.Forms;
using ESRI.ArcGIS.Controls;

namespace App
{
    public partial class frmMain : Form
    {
        private frmManage manage; 

        /// <summary>
        /// 构造函数
        /// </summary>
        public frmMain()
        {
            InitializeComponent();
            axMapControl1.LoadMxFile(@"C:\Users\DSF\Desktop\data\无标题.mxd");
            axMapControl1.ActiveView.Extent = axMapControl1.ActiveView.FullExtent;
        }

        /// <summary>
        /// 创建书签
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnCreate_Click(object sender, EventArgs e)
        {
            frmAdd frm = new frmAdd(axMapControl1.Object as IMapControlDefault);
            frm.CreateBookmarkEventHandler += new Action<IMapControlDefault, string>(Utility.CreateBookmark);
            frm.ShowDialog();
        }

        /// <summary>
        /// 管理书签
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnManage_Click(object sender, EventArgs e)
        {
            if (manage == null || manage.IsDisposed)
            {
                manage = new frmManage(axMapControl1.Object as IMapControlDefault);
                manage.TopMost = true;
                manage.Show();
            }
        }
    }
}

frmAdd代码如下:

using System;
using System.Windows.Forms;
using ESRI.ArcGIS.Controls;

namespace App
{
    public partial class frmAdd : Form
    {
        public event Action<IMapControlDefault, string> CreateBookmarkEventHandler;
        private IMapControlDefault mapControl;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="mapControl">地图对象</param>
        public frmAdd(IMapControlDefault mapControl)
        {
            this.mapControl = mapControl;
            InitializeComponent();
        }

        /// <summary>
        /// 确定
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnOk_Click(object sender, EventArgs e)
        {
            // 判断书签名称是否为空
            if (string.IsNullOrEmpty(txtName.Text) || string.IsNullOrWhiteSpace(txtName.Text))
            {
                MessageBox.Show("请输入书签名称", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            // 判断书签名称是否已经存在
            if (Utility.IsExists(mapControl, txtName.Text))
            {
                MessageBox.Show("该书签名称已存在", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            // 将书签名称传递给主窗体
            if (CreateBookmarkEventHandler != null)
            {
                CreateBookmarkEventHandler(mapControl, txtName.Text);
            }

            // 关闭窗体
            this.Close();
        }

        /// <summary>
        /// 取消
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}

frmManage代码如下:

using System;
using System.Windows.Forms;
using ESRI.ArcGIS.Controls;

namespace App
{
    public partial class frmManage : Form
    {
        private IMapControlDefault mapControl;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="mapControl">地图对象</param>
        public frmManage(IMapControlDefault mapControl)
        {
            this.mapControl = mapControl;
            InitializeComponent();
            InitializeBookmarks();
        }

        /// <summary>
        /// 定位
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnLocate_Click(object sender, EventArgs e)
        {
            if (lstNames.Items.Count == 0)
            {
                MessageBox.Show("当前书签数量为0,请先创建书签", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            Utility.LocateByName(mapControl, lstNames.SelectedItem.ToString());
        }

        /// <summary>
        /// 移除
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnRemove_Click(object sender, EventArgs e)
        {
            if (lstNames.Items.Count == 0)
            {
                MessageBox.Show("当前书签数量为0,无法移除书签", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            Utility.RemoveBookmark(mapControl, lstNames.SelectedItem.ToString());
            lstNames.Items.RemoveAt(lstNames.SelectedIndex);
        }

        /// <summary>
        /// 全部移除
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnRemoveAll_Click(object sender, EventArgs e)
        {
            if (lstNames.Items.Count == 0)
            {
                MessageBox.Show("当前书签数量为0,无法移除书签", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            Utility.RemoveAllBookmarks(mapControl);
            lstNames.Items.Clear();
        }

        /// <summary>
        /// 初始化书签列表
        /// </summary>
        private void InitializeBookmarks()
        {
            var keys = Utility.GetBookmarks(mapControl).Keys;
            if (keys.Count > 0)
            {
                foreach (var item in keys)
                {
                    lstNames.Items.Add(item);
                }
                lstNames.SelectedIndex = 0;
            }
        }
    }
}

Utility.cs代码如下:

using System.Collections.Generic;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;

namespace App
{
    public class Utility
    {
        /// <summary>
        /// 创建书签
        /// </summary>
        /// <param name="mapControl">地图对象</param>
        /// <param name="name">书签名称</param>
        public static void CreateBookmark(IMapControlDefault mapControl, string name)
        {
            IAOIBookmark pAOIBookmark = new AOIBookmark();
            pAOIBookmark.Location = mapControl.ActiveView.Extent;
            pAOIBookmark.Name = name;
            IMapBookmarks pMapBookmarks = mapControl.Map as IMapBookmarks;
            pMapBookmarks.AddBookmark(pAOIBookmark);
        }

        /// <summary>
        /// 获取书签集合
        /// </summary>
        /// <param name="mapControl">地图对象</param>
        /// <returns>书签集合</returns>
        public static Dictionary<string, ISpatialBookmark> GetBookmarks(IMapControlDefault mapControl)
        {
            Dictionary<string, ISpatialBookmark> bookmarks = new Dictionary<string, ISpatialBookmark>();
            IMapBookmarks pMapBookmarks = mapControl.Map as IMapBookmarks;
            IEnumSpatialBookmark pEnumSpatialBookmark = pMapBookmarks.Bookmarks;
            pEnumSpatialBookmark.Reset();
            ISpatialBookmark pSpatialBookmark = pEnumSpatialBookmark.Next();
            while (pSpatialBookmark != null)
            {
                if (!bookmarks.ContainsKey(pSpatialBookmark.Name))
                {
                    bookmarks.Add(pSpatialBookmark.Name, pSpatialBookmark);
                }
                pSpatialBookmark = pEnumSpatialBookmark.Next();
            }
            return bookmarks;
        }

        /// <summary>
        /// 判断书签名称是否存在
        /// </summary>
        /// <param name="mapControl">地图对象</param>
        /// <param name="name">书签名称</param>
        /// <returns>是否存在</returns>
        public static bool IsExists(IMapControlDefault mapControl, string name)
        {
            HashSet<string> names = new HashSet<string>(GetBookmarks(mapControl).Keys);
            return names.Contains(name);
        }

        /// <summary>
        /// 根据书签名称定位
        /// </summary>
        /// <param name="mapControl">地图对象</param>
        /// <param name="name">书签名称</param>
        public static void LocateByName(IMapControlDefault mapControl, string name)
        {
            ISpatialBookmark pSpatialBookmark = GetBookmarks(mapControl)[name];
            pSpatialBookmark.ZoomTo(mapControl.Map);
            mapControl.ActiveView.Refresh();
        }

        /// <summary>
        /// 移除书签
        /// </summary>
        /// <param name="mapControl">地图对象</param>
        /// <param name="name">书签名称</param>
        public static void RemoveBookmark(IMapControlDefault mapControl, string name)
        {
            IMapBookmarks pMapBookmarks = mapControl.Map as IMapBookmarks;
            IEnumSpatialBookmark pEnumSpatialBookmark = pMapBookmarks.Bookmarks;
            pEnumSpatialBookmark.Reset();
            ISpatialBookmark pSpatialBookmark = pEnumSpatialBookmark.Next();
            while (pSpatialBookmark != null)
            {
                if (pSpatialBookmark.Name == name)
                {
                    pMapBookmarks.RemoveBookmark(pSpatialBookmark);
                    break;
                }
                pSpatialBookmark = pEnumSpatialBookmark.Next();
            }
        }

        /// <summary>
        /// 移除全部书签
        /// </summary>
        /// <param name="mapControl">地图对象</param>
        public static void RemoveAllBookmarks(IMapControlDefault mapControl)
        {
            IMapBookmarks pMapBookmarks = mapControl.Map as IMapBookmarks;
            pMapBookmarks.RemoveAllBookmarks();
        }
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值