ArcEngine教程(三)——图层的基本操作
本篇主要介绍图层的基本操作,包括打开、删除。
首先说下图层,地理数据是以图层的形式加载到地图对象(Map)上的,图层是作为一个中介链接地图对象和数据,图层中不存储地理数据,只添加了地理数据的引用。地理数据始终保存在地理数据文件或GeoDatabase中。
一、打开图层
打开图层的思路:
- 打开地理数据文件
- 新建图层,将图层对应的地理数据指向第1步打开的地理数据文件
- 将第2部新建的图层添加到Map对象中,刷新MapControl控件,显示地理数据
先上代码:
/// <summary>
/// 点击 添加图层
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_addLayer_Click(object sender, EventArgs e)
{
//一、打开shape文件
OpenFileDialog ofd = new OpenFileDialog();
ofd.Title = "打开图层文件";
ofd.Filter = "map documents(*.shp)|*.shp";
if (DialogResult.OK != ofd.ShowDialog())
{
return;
}
FileInfo shpFile = new FileInfo(ofd.FileName);
//文件所在目录
string folder = shpFile.DirectoryName;
//文件的名称
string fileName = shpFile.Name;
//使用Feature工作空间对象,打开刚刚选择的shapefile文件
IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactory();
IFeatureWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(folder, 0) as IFeatureWorkspace;
IFeatureClass pFeatureClass = pWorkspace.OpenFeatureClass(fileName);
//二、新建图层对象,将图层对象内容设置为打开的文件
IFeatureLayer pLayer = new FeatureLayer();
//将上面一步打开的IFeatureClass,作为这个图层的内容
pLayer.FeatureClass = pFeatureClass;
pLayer.Name = pFeatureClass.AliasName;
//三、将图层添加到MapControl中,并刷新
axMapControl1.Map.AddLayer(pLayer);
axMapControl1.ActiveView.Refresh();
}
需要添加三个引用:
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.Geodatabase;
关于ArcEngine添加引用,详见:https://blog.csdn.net/qq_42956227/article/details/82592653
二、 删除图层
删除图层的逻辑:
- 获取选中的图层
- 删除这个图层
然后麻烦的地方就是获取选中的图层,由于TOCControl控件中是无法直接返回选中图层的索引的,所以调用HitTest方法获取图层。
先介绍下HitTest方法:
public void HitTest (
int X, int Y,
ref esriTOCControlItem ItemType,
ref IBasicMap BasicMap,
ref ILayer Layer,
ref object Unk,
ref object Data
);
参数的含义如下:
- X,Y :鼠标点击的坐标;
- ITemType: esriTOCControlItem枚举常量
- BasicMap:绑定MapControl的IBasicMap接口
- Layer:被点击的图层
- Unk:TOCControl的LegendGroup对象
- Data:LegendClass在LegendGroup中的Index
esriTOCControlItem枚举常量:
name | index | remarks |
---|---|---|
esriTOCControlItemNone | 0 | 没有对象 |
esriTOCControlItemMap | 1 | Map对象 |
esriTOCControlItemLayer | 2 | Layer对象 |
esriTOCControlItemHeading | 3 | 对象的标题 |
esriTOCControlItemLegendClass | 4 | LegendClass对象 |
附上所有代码:
/// <summary>
/// 删除当前选中图层
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_deleteLayer_Click(object sender, EventArgs e)
{
//一、判断选中的图层是否为空
if (m_layer == null)
{
MessageBox.Show("请选择图层");
return;
}
//二、删除图层
IMap pMap = axMapControl1.Map;
pMap.DeleteLayer(m_layer);
m_layer = null;
}
//被选中的图层
ILayer m_layer = null;
/// <summary>
/// 获取鼠标点击的图层。由于TOCControl控件中是无法直接返回选中图层的索引的,所以调用HitTest方法获取图层。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void axTOCControl1_OnMouseDown(object sender, ITOCControlEvents_OnMouseDownEvent e)
{
if (axMapControl1.LayerCount == 0)
{
return;
}
esriTOCControlItem item = esriTOCControlItem.esriTOCControlItemNone;
IBasicMap map = null;
object other = null;
object index = null;
//根据单击的x、y坐标返回相应的参数,包括选中图层、地图、索引等
axTOCControl1.HitTest(e.x, e.y, ref item, ref map, ref m_layer, ref other, ref index);
}
转载自:https://blog.csdn.net/qq_42956227/article/details/82592467