ArcGIS Engine二次开发 - 基础篇 联系客服

发布时间 : 星期五 文章ArcGIS Engine二次开发 - 基础篇更新完毕开始阅读c1826921192e45361066f5ac

ArcGIS Engine二次开发——基础篇

图 15添加数据界面效果

为了测试多个添加数据操作的方便,我们添加了一个清空图层的按钮,双击该按钮进入代码编辑界面,添加代码如下:

private void btnClear_Click(object sender, EventArgs e) {

//如果MapControl图层个数大于零就清空图层 if (this.axMapControl1.LayerCount > 0) this.axMapControl1.ClearLayers();

}

1.6.1 通过代码添加MXD文件

MXD文件是ArcMap产生的地图索引文件,需要注意的是MXD文件并不含有地图数据。打开MXD文件比较简单,使用OpenFileDialog来实现,核心代码如下。需要注意的是,应为MXD文件只是个索引文件。在测试这部分程序时,你需要用ArcMap生成一个新的MXD文件。双击“打开MXD”按钮,进入代码编辑界面,添加代码如下:

private void btnMxd_Click(object sender, EventArgs e) {

//文件路径名称,包含文件名称和路径名称 string strName=null;

//定义OpenFileDialog,获取并打开地图文档

OpenFileDialog openFileDialog=new OpenFileDialog(); openFileDialog.Title=\打开MXD\;

openFileDialog.Filter=\文件(*.mxd)|*.mxd\;

ArcGIS Engine二次开发——基础篇

if (openFileDialog.ShowDialog()==DialogResult.OK) {

strName=openFileDialog.FileName; if (strName!=\) {

this.axMapControl1.LoadMxFile(strName); } }

//地图文档全图显示

this.axMapControl1.Extent=this.axMapControl1.FullExtent;

}

1.6.2 通过代码添加shp图层

添加shp图层的方法与打开mxd的思路一致,代码如下:

private void btnShp_Click(object sender, EventArgs e) {

//文件路径名称,包含文件名称和路径名称 string strName = null; //文件路径

string strFilePath=null; //文件名称

string strFileName=null;

//定义OpenFileDialog,获取并打开地图文档

OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Title = \添加Shp\;

openFileDialog.Filter = \文件(*.shp)|*.shp\; if (openFileDialog.ShowDialog() == DialogResult.OK) {

strName = openFileDialog.FileName; if (strName != \) {

strFilePath=System.IO.Path.GetDirectoryName(strName);

strFileName=System.IO.Path.GetFileNameWithoutExtension(strName); this.axMapControl1.AddShapeFile(strFilePath, strFileName); } }

//地图文档全图显示

this.axMapControl1.Extent = this.axMapControl1.FullExtent; }

1.6.3 通过代码加载GeoDatabase中的数据

Geodatabase是ArcInfo8引入的一种全新的面向对象的空间数据模型,是建立在DBMS

ArcGIS Engine二次开发——基础篇

之上的统一的、智能的空间数据模型。Geodatabase以层次结构的数据对象来组织地理数据。这些数据对象存储在要素类(Feature Classes)、对象类(0bject classes)和数据集(Feature datasets)中。Object Class可以理解为是一个在Geodatabase中储存非空间数据的表。而Feature class是具有相同几何类型和属性结构的要素(Feature)的集合。Geodatabase提供了不同层次的空间数据存储方案,可以分成PersonalGeodatabase(个人空间数据库)、File Geodatabase(基于文件格式的数据库)和ArcSDE Geodatabase(企业级空间数据库)三种形式。本节以PersonalGeodatabase为例,实现PersonalGeodatabase的数据加载。Personal Geodatabase主要适用于在单用户下工作的C/S系统,适用于小型项目的地理信息系统。Personal Geodatabase实际上就是一个Microsoft Access数据库,最大数据容量为2G,并且仅支持windows平台。 在正式开始动手之前,我们先来简单分析一下Geodatabase模型中主要对象与物理存储之间的对应关系,在ArcCatalog中打开我们所使用的示例数据,展开目录,可以看到下图的关系,在物理级别上,mdb数据库对应于数据模型中的Workspace,数据库中包含一个或多个数据集(Dataset),数据集中包含一个或多个要素类(Featureclass),因此,我们在进行mdb中数据加载时,首先需要获取要素数据集,然后获取要素数据集中的要素类,才能添加到MapControl中进行显示。

图 16 Geodatabase中的对象层次关系

本例中我们需要添加“ESRI.ArcGIS.Geodatabase”、“ESRI.ArcGIS.DataSourcesGDB”和“ESRI.ArcGIS.Carto”三个命名空间。

我们需要编写一个独立的方法,该方法根据指定的路径名称读取mdb,并返回其中包含的要素类,代码如下:

private List OpenMdb(string mdbpath) {

List pDatasets = new List();

List pFeatureClasses = new List(); //定义空间工厂,打开mdb数据库

IWorkspaceFactory pAccessFactory = new AccessWorkspaceFactoryClass(); IWorkspace pWorkspace = pAccessFactory.OpenFromFile(mdbpath, 0); //获取数据集的集合

IEnumDataset pEnumDataset = pWorkspace.get_Datasets(esriDatasetType.esriDTAny); pEnumDataset.Reset();

IDataset pDataset = pEnumDataset.Next(); while (pDataset != null) {

//数据集为featuredataset if (pDataset is IFeatureDataset) {

ArcGIS Engine二次开发——基础篇

string strDatasetName = pDataset.Name; //定义要素工厂,获取要素类的集合

IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace; IFeatureDataset pFeatureDataset = pFeatureWorkspace.OpenFeatureDataset(strDatasetName);

IEnumDataset pEnumDataset2 = pFeatureDataset.Subsets; pEnumDataset.Reset();

IDataset pDataset2 = pEnumDataset.Next();

//遍历要素类的集合吗,并将要素类加入要素类集合pFeatureClasses while (pDataset2 != null) {

if (pDataset2 is IFeatureClass) {

pFeatureClasses.Add(pDataset2 as IFeatureClass); }

pDataset2 = pEnumDataset2.Next(); }

pDatasets.Add(pDataset); }

pDataset = pEnumDataset.Next(); }

return pFeatureClasses; }

注意:这段代码中数据集的集合和要素类的集合的获取都使用了C#中泛型集合的知识,如List pDatasets = new List(),这是C#语言的概念,用于管理一个指定类型的集合,如此处的IDataset。 下面双击“添加GDB数据”按钮,进入代码编辑界面,添加代码如下:

private void btnGdbVector_Click(object sender, EventArgs e) {

//定义OpenFileDialog,获取路径

OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Title = \添加GDB矢量数据\; openFileDialog.Filter = \文件(*.mdb)|*.mdb\; //定义数据集的集合,用于存储mdb中的数据集 List pDatasets=new List(); //定义要素类集合,用于获取数据集中的要素类

List pFeatureClasses = new List(); if (openFileDialog.ShowDialog() == DialogResult.OK) {

//获取数据集的集合

pFeatureClasses = this.OpenMdb(openFileDialog.FileName); //变量要素类集合的每个要素类

foreach (IFeatureClass pFeatureClass in pFeatureClasses)