首页 > 代码库 > (转)ArcEngine读取数据(数据访问)
(转)ArcEngine读取数据(数据访问)
读取和访问数据是进行任何复杂的空间分析及空间可视化表达的前提,ArcGIS支持的数据格式比较丰富,下面就这些格式Shapefile、Coverage、Personal Geodatabase、Enterprise Geodatabase、Tin、Raster
、CAD、RDBMS等类型。
一 Shapefile
Shapefile是ESRI提供的一种无拓扑信息的矢量数据格式,一个 Shape file由一组文件组成,其中必要的基本文件包括坐标文件(主文件)(*.shp )、索引文件(*.shx )和属性文件(*.dbf )三个文件。主文件每个记录描述构成一个地理特征(Feature)的所有vertices坐标值;索引文件(.shx)主要包含坐标文件的索引信息;属性文件包含SHP文件中每一Feature的特征属性;
方法1:
//打开工作空间需要使用对应的工作空间工厂,即ShapefielWorkspaceFactoryClass
IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactoryClass() ;
//打工作空间工厂的打开方法返回的是一般意义的工作空间,根据具体数据还需要进行接口转换
IWorkspace pWorkSpace= pWorkspaceFactory.OpenFromFile(@"D:\Data" , 0) ;
IFeatureWorkspace pFeatWorkSpace = pWorkSpaceas IFeatureWorkspace
//打开一个要素类
IFeatureClass pFeatureClass = pFeatWorkSpace.OpenFeatureClass("Cities") ;
方法2:
string strShpFile=@"D:\Data\Cities.shp";
IWorkspaceName pWorkspaceName = new WorkspaceNameClass();
pWorkspaceName.WorkspaceFactoryProgIDle="esriDataSourcesFile.ShapefileWorkspaceFactory";
pWorkspaceNamePathName = System.IO.Path.GetDirectoryName(strShpFile);
IName pName = (IName)pWorkspaceNamePathName;
IWorkspace pWorkspace =(IWorkspace)pName.Open();
IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
IFeatureClass pFeatureClass = pFeatureWorkspace.OpenFeatureClass(System.IO.Path.GetFileNameWithoutExtension(strShpFile));
二 Coverage
Coverage是ArcInfo workstation的原生数据格式。该格式是基于文件夹存储的,Coverage文件夹可能存储lab.adf、arc.adf、sec.adf、pal.adf、cnt.adf、tic.adf、lnk.adf、bnd.adf等坐标文件,arx.adf、pax.adf等索引文件和pat.adf、aat.adf等属性文件。(.Lab) 表示标识点坐标数据文件 (.Prj) 表示投影信息文件 (.Tol) 表示记录坐标距离容限和悬挂长度的值的文件 (.Arx) 表示弧段索引文件 (.Cnx) 表示多边形中心点索引文件 (.Pax)表示标识点索引文件 (.arf)表示弧坐标和拓扑关系表 (.cnt)表示多边形中心表 (.log)表示工作空间的日志文件(.msk)表示记录修改过的geometry的信息,重建拓扑时用到。(.pal)表示多边形图形文件 (.pat)表示多边形属性文件 (.arc)表示弧线图形文件 (.aat)表示弧线属性文件 (.bnd)表示边框文件 (.tic)表示控制点文件。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 要素类的代码。
方法1:
IWorkspaceFactory pFactory = new AccessWorkspaceFactoryClass() ;
IWorkspace pWorkspace = pFactory.OpenFromFile(@"D:\ArcTutor\Monto.mdb" , 0) ;
IFeatureWorkspace pFeatWorkspace = pWorkspace as IFeatureWorkspace;
IFeatureClass pFeatureClass = pFeatWorkspace.OpenFeatureClass("Water")
方法2:
string strMdbFile = @"D:\ArcTutor\Monto.mdb";
IWorkspaceName pWorkspaceName = new WorkspaceNameClass();
pWorkspaceName.WorkspaceFactoryProgIDle="esriDataSourcesFile.AccessWorkspaceFactory";
pWorkspaceNamePathName = strMdbFile;
IName pName = (IName)pWorkspaceNamePathName;
IWorkspace pWorkspace =(IWorkspace)pName.Open();
IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
IFeatureClass pFeatureClass = pFeatureWorkspace.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.mdb;Persist 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 分析、数据处理和空间可视化的,在获取到数据以后可以把数据加到图层里,也可以对数据进行检索或维护等工作。