//组合框的“选择索引更改”事件响应函数,用于在改变组合框所选项时地图范围变为其对应书签所保存的范围
private void cbBookmarkList_SelectedInexChanged(object sender, EventArgs e) {
//访问地图所包含的书签,并获取书签序列
IMapBookmarks bookmarks = axMapControl1.Map as IMapBookmarks; IEnumSpatialBookmark enumSpatialBookmark = bookmarks.Bookmarks;
//对地图所包含的书签进行遍历,获取与组合框所选项名称相符的书签 enumSpatialBookmark.Reset();
ISpatialBookmark spatialBookmark = enumSpatialBookmark.Next(); while (spatialBookmark != null) {
if (cbBookmarkList.SelectedItem.ToString() == spatialBookmark.Name) {
spatialBookmark.ZoomTo((IMap)axMapControl1.ActiveView); axMapControl1.ActiveView.Refresh(); break; }
spatialBookmark = enumSpatialBookmark.Next(); } 6.实验结果如下
4
2 实验二:地图数据组织与访问
2.1 实验目的
? 了解ArcGIS Engine中地图数据的组织结构 ? 掌握ArcGIS Engine地图数据访问方法
2.2 实验内容
? 编写“数据操作”类
? 利用DataGridView控件展示Continents图层的序号和名称字段
2.3 实验步骤与结果
1.添加“空间数据”菜单项,在下拉菜单中添加一个菜单项文本为“访问图层数据”名称为“miAccessData”,用于稍后调用“数据展示台”窗体。
2.新建窗体类,窗体文件命名为“DataBoard.cs”文本属性为“数据展示台”。添加一个文本框,控件名为“tbDataName”,一个数据网格视图,控件名为“dataGridView1”,ReadOnly=true。 如图所示
3.在当前窗体代码中加入以下代码
public DataBoard(String sDataName, DataTable dataTable) {
//初始化窗体及控件
5
InitializeComponent();
//设置文本框中的文本和数据网格视图的数据源 tbDataName.Text = sDataName;
dataGridView1.DataSource = dataTable; }
4.添加类,命名为“DataOPerator.cs”并导入类库引用 using System.Data;
using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.DataSourcesFile; 5.添加以下代码
//保存当前地图对象
public IMap m_map;
//用于传入当前地图对象
public DataOperator(IMap map) {
m_map = map; }
6.添加“获取地图图层”功能函数。代码如下 public ILayer GetLayerByName(String sLayerName) {
//判断图层名或地图对象是否为空。若为空,函数返回空。 if (sLayerName == \ {
return null; }
//对地图对象中的所有图层进行遍历。若某一图层的名称与指定图层名相同,则返回该图层、
for (int i = 0; i < m_map.LayerCount; i++) {
if (m_map.get_Layer(i).Name == sLayerName) {
return m_map.get_Layer(i); } }
return null; }
7.添加成员函数GetContinentsNames代码如下 public DataTable GetContinentsName() {
//获取“Continents”图层,利用IFeatureLayer接口访问,并判断是否成功。若失败,函数返回空
ILayer layer = GetLayerByName(\
6
IFeatureLayer featureLayer = layer as IFeatureLayer; if (featureLayer == null) {
return null; }
//调用IFeatureLayer接口的Seach方法,获取要素指针
(IFeatureCursor)接口对象,用于在之后遍历图层中的全部要素,并判断是否成功获取第一个要素,若失败,函数返回空 IFeature feature;
IFeatureCursor featureCursor = featureLayer.Search(null, false);
feature=featureCursor.NextFeature(); if (feature==null ) {
return null ; }
//新建DataTable类型对象,用于函数返回 DataTable dataTable = new DataTable();
//新建DataColumn类型对象,分别保存各个州的序号和名称。设置完毕后,加入DataTable的列集合(Columns)中。
DataColumn dataColumn = new DataColumn(); dataColumn.ColumnName =\序号\
dataColumn.DataType = System.Type.GetType(\ dataTable.Columns.Add (dataColumn ); dataColumn =new DataColumn (); dataColumn.ColumnName =\名称\ dataColumn.DataType =
System.Type.GetType(\
dataTable.Columns.Add(dataColumn );
//对图层中的要素进行遍历。每获取一个要素,就关联DataTable的下一个DataRow,将要素在序号和名称字段上的值赋给DataRow的对应列中。在\图层属性表中,序号信息在第0个字段中,名称信息在第2个字段中。相关内容可以通过ArcMap对地图文档进行查看。 DataRow dataRow;
while (feature != null) {
dataRow = dataTable.NewRow();
dataRow[0] = feature.get_Value(0); dataRow[1] = feature.get_Value(2); dataTable.Rows.Add(dataRow);
feature = featureCursor.NextFeature(); }
//返回设置好的数据表。
7