发布时间 : 星期五 文章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
List
List
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
private void btnGdbVector_Click(object sender, EventArgs e) {
//定义OpenFileDialog,获取路径
OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Title = \添加GDB矢量数据\; openFileDialog.Filter = \文件(*.mdb)|*.mdb\; //定义数据集的集合,用于存储mdb中的数据集 List
List
//获取数据集的集合
pFeatureClasses = this.OpenMdb(openFileDialog.FileName); //变量要素类集合的每个要素类
foreach (IFeatureClass pFeatureClass in pFeatureClasses)