C#针对ArcSDE的操作(要素数据集、栅格数据集的创建)
1.地理数据库中的数据集
ArcGIS是围绕着Geodatabase数据库构建的,它使用对象关系型数据库来存储空间数据。Geodatabase是一个存储数据集的容器,同时将空间数据和属性绑定起来。
数据集是地理数据库的一个重要概念。它是在 ArcGIS 中组织和使用地理信息的主要途径。地理数据库包含三种主要数据集类型:
1.要素类
2.栅格数据集
3.表
地理数据库存储既包括各个地理数据集的方案和规则库,也包括空间和属性数据的简单表格存储。地理数据库中的三种主要数据集(要素类、属性表和栅格数据集)以及其他地理数据库元素都是使用表来存储的。地理数据集中的空间制图表达以矢量要素或栅格的形式存储。
2.要素类与栅格的基础知识
要素类是具有相同空间制图表达(如点、线或面)和一组通用属性列的常用要素的同类集合,例如,表示道路中心线的线要素类。最常用的四个要素类分别是点、线、面和注记(地图文本的地理数据库名称)。
矢量要素(带有矢量几何的地理对象)是一种常用的地理数据类型,其用途广泛,非常适合表示带有离散边界的要素(例如街道、州和宗地)。要素是一个对象,可将其地理制图表达(通常为点、线或面)存储为行中的一个属性(或字段)。在 ArcGIS 中,要素类是数据库表中存储有公共空间制图表达和属性集的要素的同类集合,例如,面要素用于表示陆地,点要素用于表示城市:。
图1.点要素与面要素
栅格数据集常用于表示和管理影像、数字高程模型及许多其他现象。通常,栅格是用于表示点、线和多边形要素的一种方法。在下面的示例中,可以看到如何将一系列多边形表示为栅格数据集。
图2.栅格数据集的表示
栅格是以行列排列的一组像元,是 GIS 中经常使用的数据集。用户通常使用多个栅格文件,然而随着其他地理信息的增加,许多用户已看到不断增长的在 DBMS 中管理栅格数据的需求。文件和 ArcSDE 地理数据库均提供了非常有效的栅格数据管理方式。
图3.栅格数据
3.利用C#创建要素数据集与栅格数据集
在使用AE打开或者加载数据的第一步就是 通过工作空间工厂(IWorkspaceFactory)获取工作空间(IWorkspace),然后从工作空间中获取数据集(DataSet)、要素类(FeatureClass)等数据。
这种模式就是面向对象设计模式中的工厂模式,当我们想要扩展新的数据类型时,只需要创建对应的工作空间类,这个类继承自IWorkspaceFactory,然后创建相应的工作空间类,这个类继承自IWorkspace接口。
因此我们要在窗体内定义几个成员变量`
//属性空间
IPropertySet propertySet;
//工作空间
IWorkspace workspace;
IWorkspaceFactory workspaceFactory = new SdeWorkspaceFactory();
//打开sde工作空间(propertySet自己设置)
workspace = workspaceFactory.Open(propertySet, 0);
//矢量数据工作空间
IFeatureWorkspace featureWorkspace;
//栅格数据工作空间
IRasterWorkspaceEx rasterWorkspace;
//矢量数据集
IFeatureDataset featureDataset;
//栅格数据集
IRasterDataset rasterDataset;`
对于不同类型的空间数据库,对应着不同的工作空间类,这些类都继承了接口IWorkspaceFactory,然后通过IWorkspaceFactory接口的不同的方法如Create、Open、OpenFromFile产生不用类型的工作空间(IWorkspace)。具体实现过程如下
图4.数据集创建界面
<3.1>创建要素数据集
if(((DataRowView)comboBoxEx1.SelectedItem).Row["DatasetID"].ToString()== "要素数据集")
if (textBoxX1.Text != "")
{
featureWorkspace = workspace as IFeatureWorkspace;
//定义空间参考
ISpatialReferenceFactory spatialReferenceFactory = new SpatialReferenceEnvironmentClass();
ISpatialReference spatialReference = spatialReferenceFactory.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984);
spatialReference.SetDomain(-1000, -1000, 1000, 1000);
//提供对通过数据集名称枚举的成员的访问
IEnumDatasetName enumDatasetName;
//提供访问提供数据集名称信息的成员。
IDatasetName datasetName;
enumDatasetName = workspace.get_DatasetNames(esriDatasetType.esriDTFeatureDataset);
datasetName = enumDatasetName.Next();
//以下参数用于判断数据集是否存在
bool isExist = false;
string dsName;
//创建矢量数据集
dsName = "sde.SDE." + textBoxX1.Text;
while (datasetName != null)
{
if (datasetName.Name == dsName)
{
isExist = true;
MessageBox.Show("要素数据集已存在", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
break;
//textBoxX1.Focus();
}
datasetName = enumDatasetName.Next();
}
if (isExist == false)
{
featureDataset = featureWorkspace.CreateFeatureDataset(textBoxX1.Text,spatialReference);
sql();
MessageBox.Show("要素数据集创建成功", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
else MessageBox.Show("请输入要素数据集名称", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
<3.2>创建栅格数据集
else if (((DataRowView)comboBoxEx1.SelectedItem).Row["DatasetID"].ToString() == "栅格数据集")
{
if (textBoxX1.Text != "")
{
//提供对通过数据集名称枚举的成员的访问
IEnumDatasetName enumDatasetName;
//提供访问提供数据集名称信息的成员。
IDatasetName datasetName;
rasterWorkspace = workspace as IRasterWorkspaceEx;
enumDatasetName = workspace.get_DatasetNames(esriDatasetType.esriDTRasterDataset);
datasetName = enumDatasetName.Next();
//以下参数用于判断数据集是否存在
bool isExist = false;
string dsName;
dsName = "SDE." + textBoxX1.Text;
while (datasetName != null)
{
if (datasetName.Name == dsName)
{
MessageBox.Show("栅格数据集已存在", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
isExist = true;
break;
}
datasetName = enumDatasetName.Next();
}
if (isExist == false)
{
//提供对控制栅格存储属性的成员的访问
IRasterStorageDef rasterStorageDef = new RasterStorageDefClass();
rasterStorageDef.CompressionType = esriRasterCompressionType.esriRasterCompressionUncompressed;
rasterStorageDef.PyramidLevel = 1;
rasterStorageDef.PyramidResampleType = rstResamplingTypes.RSP_BilinearInterpolation;
rasterStorageDef.TileHeight = 128;
rasterStorageDef.TileWidth = 128;
//提供对控制栅格列定义的成员的访问
IRasterDef rasterDef = new RasterDefClass();
//提供对控制空间参考的成员的访问
ISpatialReference rasterDSpatialReference = new UnknownCoordinateSystemClass();
rasterDef.SpatialReference = rasterDSpatialReference;
//提供对返回有关几何定义信息的成员的访问
IGeometryDef geometryDef = new GeometryDefClass();
//提供对修改几何定义的成员的访问
IGeometryDefEdit geometryDefEdit = (IGeometryDefEdit)geometryDef;
geometryDefEdit.AvgNumPoints_2 = 5;
geometryDefEdit.GridCount_2 = 1;
geometryDefEdit.set_GridSize(0, 1000);
geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolygon;
ISpatialReference spatialReference2 = new UnknownCoordinateSystemClass();
geometryDefEdit.SpatialReference_2 = spatialReference2;
try
{
rasterDataset = rasterWorkspace.CreateRasterDataset(this.textBoxX1.Text, 1, rstPixelType.PT_LONG, rasterStorageDef, "DEFAULTS", rasterDef, geometryDef);
sql();
MessageBox.Show("栅格数据集创建成功", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch
{
MessageBox.Show("栅格数据集名称不合法", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
}
else MessageBox.Show("请输入栅格数据集名称", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
数据集创建成功后,可以在ArcCatelog中查看:`
图5.要素数据集创建成功
图6.在地理数据库中查看我们创建成功的要素数据集