AE加载不同数据的方法

先看一下GeoDatabase核心结构模型图:

1 工作空间工厂WorkspaceFactory对象

WorkspaceFactory是GeoDatabase的入口,是一个抽象类,拥有很多子类,例如SdeWorkspaceFactory, AccessWorkspaceFactory, ShapfileWorkspaceFactory CadWorkspaceFactory等

IWorkspaceFactory接口定义了所有工作空间对象的一般属性和方法

public IWorkspaceName Create (string parentDirectory,string Name,IPropertySet ConnectionProperties,int hWnd);用于产生一个新的工作空间名称对象,前两个参数是数据库的路径和名称,第三个参数是一个属性集(properset)对象。 public IWorkspace Open ( IPropertySet ConnectionProperties,int hWnd);打开一个已经存在的工作空间像SDE数据库等;

public IWorkspace OpenFromFile (string fileName,int hWnd);打开一个文件类型的数据

2 工作空间WorkSpace对象

Workspace在逻辑上是一个包含空间数据集和非空间数据集的数据容器,数据包括要素类、栅格数据集、表等对象

Workspace对象主要的一些接口:

1 IWorkspace接口:定义了一个工作空间最普通的属性和方法。

2 IFeatureWorkspace接口

这个接口主要用于管理要素的数据集,如表(Table)、对象类(ObjectClass)、要素类(FeatureClass)、要素数据集(FeatureDataset)和关系类(RelationshipClass)等。

主要的成员:

public IFeatureClass OpenFeatureClass ( string Name) 打开一个已经存在的要素类,无论这个要素类是在工作空间还是在一个要素数据集中 public IFeatureDataset OpenFeatureDataset (string Name);打开一个已经存在的要素数据集 public ITable OpenTable (string Name);打开一个已经存在的表;

3 RasterWorkspace对象

主要实现了IRasterWorkspace接口

public IRasterDataset OpenRasterDataset ( string Name);

4 属性集Propertyset对象

Propertyset对象是一个专门用于设置属性的对象,它是一种name-value对应的集合,类似于Hash表。属性名必须是字符串,属性值可以是字符串、数值或日期也可以是一个对象

public void SetProperty (string Name, object Value);

5 DataSet数据集对象

Dataset对象可分为两大类:Table和GeoDataset,GeoDataset是一个抽象类,代表了拥有空间属性的数据集,包括FeatureDataset、要素类FeatureClass、TIN和栅格数据集RasterDataset。

6 FeatureDataset对象

实现的主要接口:

1 IFeatureDataset接口

public IEnumDataset Subsets {get;}:Datasets contained within this dataset.

2 IFeatureClassContainer接口

用于管理要素数据集里面的要素类,该接口的ClassByName和Class(index)等属性可以用来获取数据集中的特定的要素类(这里很奇怪在帮助文档中只有属性没有方法但点进去却是一个方法Ok你大概不理解我说的)

public IFeatureClass get_Class (int ClassIndex);

public IFeatureClass get_ClassByID (int ID);

public IFeatureClass get_ClassByName (string Name);

接下来举几个加载各种数据的例子

1 加载Shapefiles文件

OpenFileDialog dlg=new OpenFileDialog();
dlg.Title="打开shapefile文件";
dlg.Filter="(*.shp)|*.shp";
dlg.ShowDialog();
string filename=dlg.FileName;
int index=filename.LastIndexOf(@"\");
string path=filename.Substring(0,index);
string name=filename.Substring(index+1);

IWorkspaceFactory pWsFactory = new ShapefileWorkspaceFactoryClass();
IFeatureWorkspace pWorkSpace = pWsFactory.OpenFromFile(path, 0) as IFeatureWorkspace;
IFeatureClass pFeatureClass = pWorkSpace.OpenFeatureClass(name);
IFeatureLayer pFeatureLayer = new FeatureLayerClass();
pFeatureLayer.Name = pFeatureClass.AliasName;
pFeatureLayer.FeatureClass = pFeatureClass;

axMapControl1.Map.AddLayer(pFeatureLayer);
axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);

2.加载栅格数据

OpenFileDialog dlg = new OpenFileDialog();
dlg.Title = "打开Raster文件";
dlg.Filter = " Layer File(*.lyr)|*.jpg;*.bmp;*.tiff ";
dlg.ShowDialog();
string filename = dlg.FileName;
int index = filename.LastIndexOf(@"\");
string path = filename.Substring(0, index);
string name = filename.Substring(index + 1);

IWorkspaceFactory pWsFactory =new RasterWorkspaceFactoryClass();
IRasterWorkspace pRasterWorkspace = pWsFactory.OpenFromFile(path, 0) as IRasterWorkspace;
IRasterDataset pRasterDataset = pRasterWorkspace.OpenRasterDataset(name);
IRasterLayer pRasterLayer = new RasterLayerClass();
pRasterLayer.CreateFromDataset(pRasterDataset);
axMapControl1.Map.AddLayer(pRasterLayer);
axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);

3 加载CAD数据

OpenFileDialog dlg = new OpenFileDialog();
dlg.Title = "打开CAD文件";
dlg.Filter = " CAD(*.dwg)|*.dwg|All Files(*.*)|*.* ";
dlg.ShowDialog();
string filename = dlg.FileName;
int index = filename.LastIndexOf(@"\");
string path = filename.Substring(0, index);
string name = filename.Substring(index + 1);

IWorkspaceFactory pWsFactory = new CadWorkspaceFactoryClass();
IFeatureWorkspace pFeatureWorkspace = pWsFactory.OpenFromFile(path, 0) as IFeatureWorkspace;
IFeatureDataset pFeatureDataset = pFeatureWorkspace.OpenFeatureDataset(name);
IFeatureClassContainer pFCContainer = pFeatureDataset as IFeatureClassContainer;
for (int i = 0; i < pFCContainer.ClassCount; i++)
{
IFeatureClass pFeatureClass = pFCContainer.get_Class(i);
if (pFeatureClass.FeatureType == esriFeatureType.esriFTCoverageAnnotation)
{
IFeatureLayer pFeatureLayer = new CadAnnotationLayerClass();

}
else
{
IFeatureLayer pFeatureLayer = new FeatureLayerClass();
pFeatureLayer.FeatureClass = pFeatureClass;
pFeatureLayer.Name = pFeatureClass.AliasName;
axMapControl1.Map.AddLayer(pFeatureLayer);

}
axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);

4 加载PersonGeodatabase数据

OpenFileDialog dlg = new OpenFileDialog();
dlg.Title = "打开Geodatabase文件";
dlg.Filter = " Personal Geodatabase(*.mdb)|*.mdb|All Files(*.*)|*.* ";
dlg.ShowDialog();
string path = dlg.FileName;

IWorkspaceFactory pAccessWorkspaceFactory;
IFeatureWorkspace pFeatureWorkspace;
IFeatureLayer pFeatureLayer;
IFeatureDataset pFeatureDataset;
pAccessWorkspaceFactory = new AccessWorkspaceFactoryClass();

IWorkspace pWorkspace = pAccessWorkspaceFactory.OpenFromFile(path, 0);
IEnumDataset pEnumDataset = pWorkspace.get_Datasets(ESRI.ArcGIS.Geodatabase.esriDatasetType.esriDTAny);
pEnumDataset.Reset();
IDataset pDataset = pEnumDataset.Next();

if (pDataset is IFeatureDataset)
{
pFeatureWorkspace = (IFeatureWorkspace)pAccessWorkspaceFactory.OpenFromFile(path, 0);
pFeatureDataset = pFeatureWorkspace.OpenFeatureDataset(pDataset.Name);
IEnumDataset pEnumDataset1 = pFeatureDataset.Subsets;
pEnumDataset1.Reset();
IDataset pDataset1 = pEnumDataset1.Next();

if (pDataset1 is IFeatureClass)
{
pFeatureLayer = new FeatureLayerClass();
pFeatureLayer.FeatureClass = pFeatureWorkspace.OpenFeatureClass(pDataset1.Name);
pFeatureLayer.Name = pFeatureLayer.FeatureClass.AliasName;
axMapControl1.Map.AddLayer(pFeatureLayer);
axMapControl1.ActiveView.Refresh();
}


}
else
{
pFeatureWorkspace = (IFeatureWorkspace)pWorkspace;
pFeatureLayer = new FeatureLayerClass();
pFeatureLayer.FeatureClass = pFeatureWorkspace.OpenFeatureClass(pDataset.Name);
pFeatureLayer.Name = pFeatureLayer.FeatureClass.AliasName;
axMapControl1.Map.AddLayer(pFeatureLayer);
axMapControl1.ActiveView.Refresh();
}

 

 

数据是GIS的血液, 访问数据也是进行任何复杂的空间分析及空间可视化表达的前提。ArcGIS支持的数据格式比较丰富,对不同的数据格式支持的程度也有很大差异。本文主要以C#作为示例代码介绍工作中常用的八种数据格式(Shapefile,Coverage,Personal Geodatabase,Enterprise Geodatabase,Tin,Raster,CAD,RDBMS)在ArcGIS Engine中的访问方法。

在通过ArcGIS访问数据之前,需要首先明确一下什么是"工作空间"。在ArcGIS中工作空间指存放数据的位置,ArcGIS访问数据的机制是先打开数据对应的工作空间,然后用工作空间访问数据。对于不同的数据格式,工作空间的具体情况也是不一样的,下面分别进行阐述。

Shapefile

Shapefile是文件型的空间数据格式,以文件的形式在磁盘上进行存储空间数据和属性数据。下面的示例代码是打开位于D:/Data文件夹下的文件名 为Cities的Shapefile要素类。对于Shapefile来说工作空间就是它所在的文件夹,打开工作空间需要使用对应的工作空间工厂,即 ShapefileWorkspaceFactoryClass,然后再调用IWorkspaceFactory的OpenFromFile方 法就可以得到一个工作空间了,这也是设计模式中工厂方法的体现。工作空间工厂的打开方法返回的是一般意义的工作空间,根据具体数据还需要进行接口转换,因 为Shapefile是矢量数据,所以把工作空间接口跳转到IFeatureWorkspace,从而读取其中的要素类,这一点对于接下来的几个数据格式 也是同样的打开方式。

IWorkspaceFactory pWorkspaceFactory;

pWorkspaceFactory = new ShapefileWorkspaceFactoryClass();

IFeatureWorkspace pFeatWS;

pFeatWS = pWorkspaceFactory.OpenFromFile(@"D:/Data/", 0) as IFeatureWorkspace;

//打开一个要素类

IFeatureClass pFeatureClass = pFeatWS.OpenFeatureClass("Cities");

Coverage

Coverage是ArcInfo workstation的原生数据格式。该格式是基于文件夹存储的,是因为在windows资源管理器下,它的空间信息和属性信息是分别存放在两个文件夹 里。coverage是一个非常成功的早期地理数据模型,二十多年来深受用户欢迎,很多早期的数据都是coverage格式的。ESRI不公开 coverage的数据格式,但是提供了coverage格式转换的一个交换文件(interchange file,即E00),并公开数据格式。但是ESRI为推广其第三代数据模型geodatabase,从ArcGIS 8.3版本开始,屏蔽了对coverage的编辑功能。如果需要使用coverage格式的数据,可以安装ArcInfo workstation,或者将coverage数据转换为其他可编辑的数据格式。Coverage是一个集合,它可以包含一个或多个要素类。 Coverage数据的工作空间也是它所在的文件夹;由于Coverage可以包含多个要素类,得到工作空间后在打开具体的要素类时可以 用"Coverage名称:要素类名称",例如下面代码中的"basin:polygon"。

IWorkspaceFactory pFactory = new ArcInfoWorkspaceFactoryClass();

IWorkspace pWorkspace = pFactory.OpenFromFile(@"D:/ArcTutor/TopologyData", 0);

IFeatureWorkspace pFeatWorkspace = pWorkspace as IFeatureWorkspace;

IFeatureClass pFeatureClass = pFeatWorkspace.OpenFeatureClass("basin:polygon");

Personal Geodatabase

Geodatabase作为ArcGIS的原生数据格式,体现了很多第三代地理数据模型的优势。Personal Geodatabase基于Microsoft Access一体化存储空间数据和属性数据。Enterprise Geodatabase通过大型关系数据库+ArcSDE实现,ArcSDE作为中间件把关系数据库中的普通表转化为空间对象。Personal Geodatabase数据的工作空间指的是扩展名为mdb的文件。以下是打开位于Monto.mdb中的Water要素类的代码。

IWorkspaceFactory pFactory = new AccessWorkspaceFactoryClass();

IWorkspace pWorkspace = pFactory.OpenFromFile(@"D:/ArcTutor/Monto.mdb", 0);

IFeatureWorkspace pFeatWorkspace = pWorkspace as IFeatureWorkspace;

IFeatureClass pFeatureClass = pFeatWorkspace.OpenFeatureClass("Water")

Enterprise Geodatabase

ArcSDE(Enterprise Geodatabase)对应的工作空间为数据库连接,关系数据库是Oracle时连接参数需要五个,分别是SERVER、INSTANCE、USER、 PASSWORD、VERSION。SERVER指服务器的主机名,INSTANCE指服务名或端口号,USER是数据库的用户名,PASSWORD数据 库对应用户的密码,VERSION指Enterprise Geodatabase多版本机制中的某个版本,默认的一个版本是"SDE.DEFAULT",如果关系数据库是SQL Server,那么连接参数还需要Database参数。下面是打开Enterprise Geodatabase中ControlPoint点要素类的代码,关系数据库为Oracle9i。

IWorkspaceFactory pWorkspaceFactory = new SdeWorkspaceFactoryClass();

IPropertySet propSet = new PropertySetClass();

propSet.SetProperty("SERVER", "actc");propSet.SetProperty("INSTANCE", "5151");

propSet.SetProperty("USER", "apdm");

propSet.SetProperty("PASSWORD", "apdm");

propSet.SetProperty("VERSION", "SDE.DEFAULT");

IWorkspace pWorkspace = pWorkspaceFactory.Open(propSet, 0);

IFeatureWorkspace pFeatWS = pWorkspace as IFeatureWorkspace;

IFeatureClass pFeatureClass= pFeatWS.OpenFeatureClass("ControlPoint");

TIN

TIN全称不规则三角网,也叫不规则三角表面,采用一系列不规则的三角点来建立表面。例如,每一个采样点有一对x,y坐标和一个表面值(z值),这些点被 一组互不重叠的三角形的边所连接,从而构成一个表面。TIN数据是空间分析和三维分析重要的数据格式,以文件的形式在磁盘上存储。TIN的工作空间是所在 的文件夹,下面代码是打开D:/ArcTutor/3DAnalyst文件夹下名称为mal的TIN。

IWorkspaceFactory pWSFact = new TinWorkspaceFactoryClass();

IWorkspace pWS = pWSFact.OpenFromFile(@"D:/ArcTutor/3DAnalyst/", 0);

ITinWorkspace pTinWS = pWS as ITinWorkspace;

ITin pTin = pTinWS.OpenTin("mal");

Raster

栅格数据也是GIS数据中很重要的一部分,ArcGIS中最常用的文件型有GRID、TIFF、ERDAS IMAGE等,这几种栅格数据的工作空间也是所在的文件夹。打开栅格数据时需要使用栅格工作空间工厂(RasterWorkspaceFactory), 然后再使用IRasterWorkspace接口的打开栅格数据集方法即可打开一个栅格数据集。在打开栅格数据集时,如果数据格式为是ESRI GRID,那么OpenRasterDataset()方法的参数为栅格要素集的名称,如果数据格式为TIFF格式,那么该方法的参数为完整的文件名,即 要加上.tif扩展名,例如OpenRasterDataset("hillshade.tif")。下面代码为打开GRID格式的栅格数据。

IWorkspaceFactory rasterWorkspaceFactory = new RasterWorkspaceFactoryClass();

IRasterWorkspace rasterWorkspace = rasterWorkspaceFactory.OpenFromFile(@"D:/data/grid", 0) as IRasterWorkspace;

IRasterDataset rasterDataset= rasterWorkspace.OpenRasterDataset("ca_hillshade")

CAD

CAD数据也可以通过AO直接访问,访问CAD数据的方式与Coverage类似,但是注意要使用CAD的工作空间工厂,以下是打开一个dxf的CAD数 据,在打开要素类时使用"cad文件名:要素类名称",注意cad文件名要包含扩展名,否则会报错。以下代码是打开位于D:/ArcTutor /Editor/ExerciseData/EditingFeatures文件夹下的buildings.dxf中的多边形要素类。

IWorkspaceFactory pCadwf = new CadWorkspaceFactoryClass();

IWorkspace pWS = pCadwf.OpenFromFile(@"D:/ArcTutor/Editor/ExerciseData/EditingFeatures", 0);

IFeatureWorkspace pCadFWS = pWS as IFeatureWorkspace;

IFeatureClass pFeatClass = pCadFWS.OpenFeatureClass("buildings.dxf:polygon");

RDBMS

一般关系表中的数据也可以通过ArcGIS直接读取,这为数据的共享提供了极大的便利,对于一些业务上的非空间数据,通过使用OLE方式可以很方便的实现 数据访问,业务数据可以位于各种关系数据库中,以下代码是访问位于Microsoft Access中的Custom表,当然也可以访问Oralce或SQL Server中的数据,只要变化以下连接字符串(CONNECTSTRING)就可以了。

//创建一个连接

IPropertySet pPropset;pPropset = new PropertySetClass();

pPropset.SetProperty("CONNECTSTRING",@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:/Company.mdbl/ersist Security Info=False");

//创建一个新的OleDB工作空间并打开

IWorkspaceFactory pWorkspaceFact;

IFeatureWorkspace pFeatWorkspace;

pWorkspaceFact = new OLEDBWorkspaceFactoryClass();

pFeatWorkspace = pWorkspaceFact.Open(pPropset, 0) as IFeatureWorkspace;

ITable pTTable = pFeatWorkspace.OpenTable("Custom");

以上为几种ArcGIS中常用的数据格式访问方法,用以访问数据进行GIS分析、数据处理和空间可视化,在获取到数据以后可以把数据添加到图层中,也可以对数据进行检索或维护等工作。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值