using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.DataSourcesFile;
namespace yanShi
{
public partial class frmMain : Form
{
string flagOnMouseDown = null; //标记onMouseDown事件
string flagOnMouseMove = null; //标记OnMouseMove事件
IBasicMap basicMap = null;
ILayer layer = null;
System.Object other = null;
System.Object index = null;
esriTOCControlItem item = esriTOCControlItem.esriTOCControlItemNone;
public frmMain()
{
InitializeComponent();
}
#region 按钮-控件属性演示
private void btn2Arrow_Click(object sender, EventArgs e)
{
// 由axMapControl1控件的对象实现IMapControlDefault接口
IMapControlDefault pMapControlDefault = axMapControl1.Object as IMapControlDefault;
// 设置pMapControlDefault的鼠标指针样式为箭头样式
pMapControlDefault.MousePointer = esriControlsMousePointer.esriPointerArrow;
// 将整数1强制转换为esriControlsMousePointer枚举类型,并设置pMapControlDefault的鼠标指针样式为该枚举值对应的样式
//pMapControlDefault.MousePointer = (esriControlsMousePointer)1;
}
#endregion
#region 菜单-文件-加载地图文档
private void 加载地图文档ToolStripMenuItem_Click(object sender, EventArgs e)
{
// 由axMapControl1控件的对象实现IMapControlDefault接口
IMapControlDefault pMapControlDefault = axMapControl1.Object as IMapControlDefault;
// 初始化一个空字符串变量,用于存储文件路径
var filePath = string.Empty;
// 使用OpenFileDialog来打开文件选择对话框
using (OpenFileDialog openFileDialog = new OpenFileDialog())
{
// 设置对话框的初始目录为C盘根目录
//openFileDialog.InitialDirectory = "c:\\";
// 设置文件选择对话框的标题为“打开地图文档”
openFileDialog.Title = "打开地图文档";
// 设置文件选择对话框的过滤条件,支持多种地图文件格式
openFileDialog.Filter = "ArcMap文档(*.mxd)|*.mxd;|ArcMap模板(*.mxt)|*.mxt|发布地图文件(*.pmf)|*.pmf|所有地图格式(*.mxd;*.mxt;*.pmf)|*.mxd;*.mxt;*.pmf";
// 设置文件选择对话框为单文件选择模式,不允许用户一次选择多个文件
openFileDialog.Multiselect = false;
// 设置默认过滤索引为所有文件
openFileDialog.FilterIndex = 1;
// 如果用户改变了目录,则还原到初始目录
openFileDialog.RestoreDirectory = false;
// 显示文件选择对话框,并等待用户选择文件或取消操作
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
// 获取用户选择的文件路径
filePath = openFileDialog.FileName;
// 检查给定的文件路径是否是一个有效的地图文档
if (pMapControlDefault.CheckMxFile(filePath))
{
// 如果文件路径有效,则加载该地图文档
pMapControlDefault.LoadMxFile(filePath);
}
else
{
// 如果文件路径无效,则显示一个消息框提示用户该文件是无效的地图文档
MessageBox.Show(filePath + "是无效的地图文档!", "信息提示");
// 终止当前方法或函数的执行
return;
}
}
}
}
#endregion
#region 菜单-文件-添加数据-加载shapefile数据
private void 加载shapefile数据ToolStripMenuItem_Click(object sender, EventArgs e)
{
// 创建一个新的ShapefileWorkspaceFactoryClass实例,用于处理shapefile类型的工作空间
IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactoryClass();
// 声明一个IFeatureWorkspace类型的变量,用于表示特征工作空间
IFeatureWorkspace pFeatureWorkspace;
// 声明两个字符串变量,用于存储文件目录和文件名
string fileDirectory = "";
string fileName = "";
// 创建一个新的FeatureLayerClass实例,但此时它并没有与任何特征类关联
IFeatureLayer pFeatureLayer = new FeatureLayerClass();
// 声明一个IFeatureClass类型的变量,用于表示特征类
IFeatureClass pFeatureClass;
// 创建一个OpenFileDialog实例,用于打开文件对话框
OpenFileDialog ofd = new OpenFileDialog();
// 显示文件对话框,并检查用户是否点击了确定按钮
if (ofd.ShowDialog() == DialogResult.OK)
{
// 获取用户选择的文件的完整路径
string fullPath = ofd.FileName;
// 检查用户是否确实选择了一个文件(尽管在标准OpenFileDialog中这是不太可能的)
if (string.IsNullOrEmpty(fullPath))
{
// 如果文件路径为空,则显示一个消息框并退出函数
MessageBox.Show("文件选取出错!", "提示");
return;
}
// 查找文件路径中最后一个'\'的位置,用于分割目录和文件名
int sIndex = fullPath.LastIndexOf("\\");
// 提取文件所在的目录
fileDirectory = fullPath.Substring(0, sIndex);
// 提取文件名
fileName = fullPath.Substring(sIndex + 1);
}
else
{
// 如果用户没有点击确定按钮,则直接退出函数
return;
}
// 使用之前创建的pWorkspaceFactory打开指定的文件目录作为工作空间
pFeatureWorkspace = pWorkspaceFactory.OpenFromFile(fileDirectory, 0) as IFeatureWorkspace;
// 在工作空间中打开用户指定的特征类
pFeatureClass = pFeatureWorkspace.OpenFeatureClass(fileName);
// 将pFeatureLayer与打开的特征类关联
pFeatureLayer.FeatureClass = pFeatureClass;
// 设置pFeatureLayer的名字为特征类的别名
pFeatureLayer.Name = pFeatureClass.AliasName;
// 将pFeatureLayer添加到地图控件的焦点地图中
axMapControl1.ActiveView.FocusMap.AddLayer(pFeatureLayer);
// 设置地图控件的显示范围为用户加载的特征层的范围
axMapControl1.ActiveView.Extent = pFeatureLayer.AreaOfInterest;
// 刷新地图控件以显示新的图层和范围
axMapControl1.ActiveView.Refresh();
}
#endregion
#region 菜单-文件-访问图层数据
private void 访问图层数据ToolStripMenuItem_Click(object sender, EventArgs e)
{
// 获取当前ArcMap控件中处于活动视图且为焦点的地图对象
// axMapControl1 可能是ArcMap控件的实例
// ActiveView 获取当前活动的视图
IActiveView pActiveView = axMapControl1.ActiveView;
// 创建一个新的frmDataBoard窗体实例,并将当前活动的视图pActiveView作为参数传入
// frmDataBoard 可能是自定义的窗体,用于展示或操作地图图层数据
frmDataBoard dataBoard = new frmDataBoard(pActiveView);
// 显示frmDataBoard窗体
// Show 方法将窗体显示出来
dataBoard.Show();
}
#endregion
#region 菜单-地图浏览-全图显示
private void 全图显示ToolStripMenuItem_Click(object sender, EventArgs e)
{
// 声明一个ESRI.ArcGIS.Geometry.IEnvelope类型的变量pEnvelope,用于存储绘制的矩形范围
ESRI.ArcGIS.Geometry.IEnvelope pEnvelope;
// 将axMapControl1的FullExtent属性赋值给pEnvelope变量
// FullExtent属性表示地图控件axMapControl1中所有图层范围的并集,即地图控件的完整范围
pEnvelope = axMapControl1.FullExtent;
// 将axMapControl1的Extent属性设置为pEnvelope,即设置地图的当前显示范围为地图控件的完整范围
// Extent属性通常用来表示地图控件当前显示的范围
axMapControl1.Extent = pEnvelope;
}
#endregion
#region 菜单-地图浏览-拉框放大
private void 拉框放大ToolStripMenuItem_Click(object sender, EventArgs e)
{
flagOnMouseDown = "LaKuangFangDa"; //flagOnMouseDown值为1时进行“拉框放大”操作
}
#endregion
#region 菜单-地图浏览-逐级放大
private void 逐级放大ToolStripMenuItem_Click(object sender, EventArgs e)
{
// 声明一个IEnvelope类型的变量pEnvelope,用于存储地图控件axMapControl1的当前显示范围
IEnvelope pEnvelope;
// 将axMapControl1的当前显示范围赋值给pEnvelope变量
pEnvelope = axMapControl1.Extent;
// 调用pEnvelope的Expand方法,以0.5为比例因子在X和Y方向上扩展Envelope的大小
// 第三个参数true表示扩展是乘性的,即按照比例来扩展
pEnvelope.Expand(0.5, 0.5, true);
// 将扩展后的Envelope范围设置为axMapControl1的当前显示范围
axMapControl1.Extent = pEnvelope;
// 刷新axMapControl1的ActiveView,以显示更新后的地图范围
axMapControl1.ActiveView.Refresh();
}
#endregion
#region 菜单-地图浏览-漫游
private void 漫游ToolStripMenuItem_Click(object sender, EventArgs e)
{
// 将全局变量flagOnMouseDown的值设置为"ManYou"
// 这是一个标志,用于后续的代码判断应该执行哪种鼠标操作处理逻辑
flagOnMouseDown = "ManYou";
// 将axMapControl1的鼠标指针样式设置为平移模式
// esriControlsMousePointer.esriPointerPan是ESRI ArcGIS库中的鼠标指针样式枚举值,代表平移模式
axMapControl1.MousePointer = esriControlsMousePointer.esriPointerPan;
}
#endregion
#region 菜单-地图浏览-拉框缩小
private void 拉框缩小ToolStripMenuItem_Click(object sender, EventArgs e)
{
flagOnMouseDown = "LaKuangSuoXiao";
}
#endregion
#region 菜单-书签管理-查看书签列表
private void toolStripCBXbookmarks_DropDown(object sender, EventArgs e)
{
// 清除toolStripCBXbookmarks控件中的所有项
toolStripCBXbookmarks.Items.Clear();
// 用axMapControl1的Map对象实现IMapBookmarks接口,并将结果存储在pBookmarks变量中
IMapBookmarks pBookmarks = axMapControl1.Map as IMapBookmarks;
// 从pBookmarks中获取书签的枚举器,并存储在pEnumSpatialBookmark变量中
IEnumSpatialBookmark pEnumSpatialBookmark = pBookmarks.Bookmarks;
// 重置书签枚举器,使其从第一个书签开始
pEnumSpatialBookmark.Reset();
// 获取第一个书签,并存储在pSpatialBookmark变量中
ISpatialBookmark pSpatialBookmark = pEnumSpatialBookmark.Next();
// 当pSpatialBookmark不为null时,即还有书签未处理时,执行循环
while (pSpatialBookmark != null)
{
// 将当前书签的名称添加到toolStripCBXbookmarks控件的下拉列表中
toolStripCBXbookmarks.Items.Add(pSpatialBookmark.Name);
// 获取下一个书签,并更新pSpatialBookmark变量
pSpatialBookmark = pEnumSpatialBookmark.Next();
}
}
#endregion
#region 菜单-书签管理-书签列表-缩放至书签范围
private void toolStripCBXbookmarks_SelectedIndexChanged(object sender, EventArgs e)
{
// 用axMapControl1的Map对象实现IMapBookmarks接口,并将结果存储在pBookmarks变量中
IMapBookmarks pBookmarks = axMapControl1.Map as IMapBookmarks;
// 从pBookmarks中获取书签的枚举器,并存储在pEnumSpatialBookmark变量中
IEnumSpatialBookmark pEnumSpatialBookmark = pBookmarks.Bookmarks;
// 获取axMapControl1控件的Map对象,并将其引用赋值给pMap变量
IMap pMap = axMapControl1.Map;
// 重置书签枚举器,使其从第一个书签开始
pEnumSpatialBookmark.Reset();
// 获取第一个书签,并存储在pSpatialBookmark变量中
ISpatialBookmark pSpatialBookmark = pEnumSpatialBookmark.Next();
// 当pSpatialBookmark不为null时,即还有书签未处理时,执行循环
while (pSpatialBookmark != null)
{
// 判断当前选中的书签名称是否与当前遍历到的书签名称相同
if (toolStripCBXbookmarks.SelectedItem.ToString() == pSpatialBookmark.Name)
{
// 如果相同,则调用书签的ZoomTo方法,将地图视图定位到该书签所在的位置
pSpatialBookmark.ZoomTo(pMap);
// 刷新地图控件的当前视图,以确保更改生效
axMapControl1.ActiveView.Refresh();
// 跳出循环,因为已经找到了对应的书签并进行了定位
break;
}
// 如果当前书签不是选中的书签,则获取下一个书签,并更新pSpatialBookmark变量
pSpatialBookmark = pEnumSpatialBookmark.Next();
}
}
#endregion
#region 菜单-书签管理-添加书签
private void 添加书签ToolStripMenuItem_Click(object sender, EventArgs e)
{
// 创建一个frmWenBenShuRu类型的新实例,并将其赋值给frmName变量
frmWenBenShuRu frmName = new frmWenBenShuRu();
// 显示frmName窗体,并等待用户关闭它(这是一个模态对话框)
frmName.ShowDialog();
// 检查frmName窗体的Create属性是否为1(表示用户成功创建了书签信息)
if (frmName.Create == 1)
{
// 创建一个AOIBookmark对象实例,用于存储书签信息
AOIBookmark pAOIBookmark = new AOIBookmark();
// 定义一个ISpatialBookmark类型的变量,用于在循环中遍历书签
ISpatialBookmark pSpatialBookmark;
// 将axMapControl1.Map作为实现IMapBookmarks接口的对象,并赋值给pMapBookmarks变量
IMapBookmarks pMapBookmarks = axMapControl1.Map as IMapBookmarks;
// 获取pMapBookmarks中所有的书签,并赋值给pEnumSpatialBookmark
IEnumSpatialBookmark pEnumSpatialBookmark = pMapBookmarks.Bookmarks;
// 重置pEnumSpatialBookmark枚举器的位置,以便从头开始遍历
pEnumSpatialBookmark.Reset();
// 遍历所有的书签
for (pSpatialBookmark = pEnumSpatialBookmark.Next(); pSpatialBookmark != null; pSpatialBookmark = pEnumSpatialBookmark.Next())
{
// 如果当前书签的名称与frmName中指定的书签名称相同
if (pSpatialBookmark.Name == frmName.BookmarkName)
{
// 显示一个错误消息框,告诉用户已有同名书签
MessageBox.Show("已有同名书签!", "错误");
// 退出当前方法
return;
}
}
// 设置pAOIBookmark的书签名称为用户在frmName窗体中输入的书签名称
pAOIBookmark.Name = frmName.BookmarkName;
// 设置pAOIBookmark的书签位置为当前axMapControl1的ActiveView的Extent(即地图的当前显示范围)
pAOIBookmark.Location = axMapControl1.ActiveView.Extent;
// 将pAOIBookmark添加到pMapBookmarks的书签集合中
pMapBookmarks.AddBookmark(pAOIBookmark);
}
}
#endregion
#region 菜单-地图浏览-缩放至当前图层
private void toolStripComboBoxTuCeng_DropDown(object sender, EventArgs e)
{
// 清空toolStripComboBoxTuCeng控件的所有项
toolStripComboBoxTuCeng.Items.Clear();
// 获取axMapControl1控件中的地图对象
IMap pMap = axMapControl1.Map;
// 遍历地图中的图层
for (int i = 0; i < pMap.LayerCount; i++)
{
// 将当前图层的名称添加到toolStripComboBoxTuCeng控件的项集合中
toolStripComboBoxTuCeng.Items.Add(pMap.get_Layer(i).Name);
}
}
private void toolStripComboBoxTuCeng_SelectedIndexChanged(object sender, EventArgs e)
{
// 获取toolStripComboBoxTuCeng控件中当前选中项的文本,并转换为字符串类型,赋值给layerName变量
string layerName = toolStripComboBoxTuCeng.SelectedItem.ToString();
// 声明一个ILayer类型的变量pLayer,并初始化为null
ILayer pLayer = null;
// 获取axMapControl1控件中的地图对象,赋值给pMap变量
IMap pMap = axMapControl1.Map;
// 使用for循环遍历地图中的所有图层
for (int i = 0; i < pMap.LayerCount; i++)
{
// 如果当前图层的名称与layerName相等
if (layerName == pMap.get_Layer(i).Name)
{
// 将当前图层赋值给pLayer变量
pLayer = pMap.get_Layer(i);
// 找到匹配的图层后跳出循环
break;
}
}
// 判断pLayer是否不为null,即是否找到了对应的图层
if (pLayer != null)
{
// 获取axMapControl1控件的当前活动视图,赋值给pActiveView变量
IActiveView pActiveView = axMapControl1.ActiveView;
// 将地图的视图范围设置为找到的图层的感兴趣区域(AreaOfInterest)
pActiveView.Extent = pLayer.AreaOfInterest;
// 刷新地图视图,以显示新的视图范围
pActiveView.Refresh();
}
}
#endregion
#region 菜单-GIS分析-识别地理要素
private void 识别地理要素ToolStripMenuItem_Click(object sender, EventArgs e)
{
flagOnMouseMove = "ShiBie";
flagOnMouseDown = "ShiBie";
}
#endregion
#region 菜单-GIS分析-统计数据
private void 统计数据ToolStripMenuItem_Click(object sender, EventArgs e)
{
frmStatistics pStatistics = new frmStatistics(axMapControl1.ActiveView);
pStatistics.Show();
}
#endregion
#region 地图控件-OnMouseDown事件
private void axMapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
{
// 根据flagOnMouseDown的值进行不同的操作
// 在C#中,switch表达式(从C# 7.0开始)支持字符串类型。
switch (flagOnMouseDown)
{
#region OnMouseDown-拉框放大
case "LaKuangFangDa": // 如果flagOnMouseDown的值为"LaKuangFangDa"
{
// 声明一个ESRI.ArcGIS.Geometry.IEnvelope类型的变量pEnvelope,用于存储绘制的矩形范围
ESRI.ArcGIS.Geometry.IEnvelope pEnvelope;
// 调用axMapControl1的TrackRectangle方法,让用户通过鼠标绘制一个矩形,并将结果赋值给pEnvelope
pEnvelope = axMapControl1.TrackRectangle();
// 判断绘制的矩形范围是否为空。如果为空,则显示一个消息框,提示用户“所选为空”
if (pEnvelope.IsEmpty)
{
MessageBox.Show("所选为空", "提示信息");
}
else
{
// 如果矩形范围不为空,则将axMapControl1的Extent属性设置为pEnvelope,即设置地图的当前显示范围为绘制的矩形范围
axMapControl1.Extent = pEnvelope;
// 刷新axMapControl1的ActiveView,使地图的显示更新为新的范围
axMapControl1.ActiveView.Refresh();
}
}
break; // 跳出switch语句
#endregion
#region OnMouseDown-拉框缩小
case "LaKuangSuoXiao":
{
// 将axMapControl1的Object属性转换为IMapControlDefault接口类型的实例,并赋值给pMapControl变量
IMapControlDefault pMapControl = axMapControl1.Object as IMapControlDefault;
// 调用IEnvelope的TrackRectangle方法,该方法会等待用户通过鼠标在地图上绘制一个矩形,然后返回这个矩形的范围(Envelope)
IEnvelope pEnvelope = axMapControl1.TrackRectangle();
// 检查返回的Envelope是否为空,或者其宽度和高度是否为0,如果是,则直接退出方法
if (pEnvelope == null || pEnvelope.IsEmpty || pEnvelope.Height == 0 || pEnvelope.Width == 0)
{
return;
}
// 如果有有效的拉框范围,则执行以下操作
else
{
// 将当前视图范围宽或高基于比例平方的缩放算法进行缩放
double dWidth = pMapControl.Extent.Width * pMapControl.Extent.Width / pEnvelope.Width;
double dHeight = pMapControl.Extent.Height * pMapControl.Extent.Height / pEnvelope.Height;
// 根据拉框的位置和当前视图范围计算新的最小X和Y坐标
double dXmin = pMapControl.Extent.XMin -
((pEnvelope.XMin - pMapControl.Extent.XMin) * pMapControl.Extent.Width /
pEnvelope.Width);
double dYmin = pMapControl.Extent.YMin -
((pEnvelope.YMin - pMapControl.Extent.YMin) * pMapControl.Extent.Height /
pEnvelope.Height);
// 根据新的最小坐标和计算出的宽度和高度,计算新的最大X和Y坐标
double dXmax = dXmin + dWidth;
double dYmax = dYmin + dHeight;
// 使用新的坐标设置Envelope的范围
pEnvelope.PutCoords(dXmin, dYmin, dXmax, dYmax);
}
// 将更新后的Envelope范围设置为地图控件的当前显示范围
pMapControl.Extent = pEnvelope;
// 刷新地图控件的视图,以显示更新后的范围
pMapControl.Refresh();
}
break;
#endregion
#region OnMouseDown-漫游
case "ManYou": // 当flagOnMouseDown的值为"ManYou"时
{
// 调用axMapControl1的Pan方法,开始平移操作
// Pan方法通常用于让用户通过拖动鼠标来平移地图视图
axMapControl1.Pan();
}
break; // 跳出switch语句
#endregion
#region OnMouseDown-识别
case "ShiBie":
{
IPoint pPoint = axMapControl1.ToMapPoint(e.x, e.y);
IActiveView pActiveView = axMapControl1.ActiveView;
frmIdentify pIdentify = new frmIdentify(pActiveView, pPoint);
pIdentify.Show();
}
break;
#endregion
}
}
#endregion
#region 地图控件-OnMouseMove事件
private void axMapControl1_OnMouseMove(object sender, IMapControlEvents2_OnMouseMoveEvent e)
{
switch (flagOnMouseMove)
{
#region OnMouseMove-识别地理要素
case "ShiBie":
{
// 由axMapControl1控件的对象实现IMapControlDefault接口
IMapControlDefault pMapControlDefault = axMapControl1.Object as IMapControlDefault;
// 设置pMapControlDefault的鼠标指针样式为识别贯标样式
pMapControlDefault.MousePointer = esriControlsMousePointer.esriPointerIdentify;
}
break;
#endregion
}
}
#endregion
#region 目录树控件-上下文菜单条-查看属性表
private void 查看属性表ToolStripMenuItem_Click(object sender, EventArgs e)
{
// 获取当前ArcMap控件中处于活动视图且为焦点的地图对象
// axMapControl1 可能是ArcMap控件的实例
// ActiveView 获取当前活动的视图
IActiveView pActiveView = axMapControl1.ActiveView;
// 创建一个新的frmDataBoard窗体实例,并将当前活动的视图pActiveView作为参数传入
// frmDataBoard 可能是自定义的窗体,用于展示或操作地图图层数据
frmDataBoard dataBoard = new frmDataBoard(pActiveView);
// 显示frmDataBoard窗体
// Show 方法将窗体显示出来
dataBoard.Show();
}
#endregion
#region 目录树控件-OnMouseDown事件
private void axTOCControl1_OnMouseDown(object sender, ITOCControlEvents_OnMouseDownEvent e)
{
if (e.button == 2)
{
axTOCControl1.HitTest(e.x, e.y, ref item, ref basicMap, ref layer, ref other, ref index);
if (layer != null)
{
cmsTOCYouJian.Show(axTOCControl1, new System.Drawing.Point(e.x, e.y));
}
}
}
private void miSuoFangZhiTuCeng_Click(object sender, EventArgs e)
{
IActiveView pActiveView = axMapControl1.ActiveView;
pActiveView.Extent = layer.AreaOfInterest;
pActiveView.Refresh();
}
#endregion
}
}