1、前言
本文介绍ArcEngine
中书签定位功能的实现。
2、创建工程
创建一个WinForm
工程,新建三个窗体:frmMain
、frmAdd
、frmManage
,然后新建一个类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();
}
}
}