GIS二次开发实验报告

//组合框的“选择索引更改”事件响应函数,用于在改变组合框所选项时地图范围变为其对应书签所保存的范围

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

联系客服:779662525#qq.com(#替换为@)