ArcEngine 讀取Geodatabase

概述

在之前的博客中http://blog.csdn.net/mytudousi/article/details/31350807介紹了Geodatabase的大體情況,既然有了Geodatabase這麼一個數據框架,想着我們使用AE讀取的時候應該也不會太複雜,至少在讀取的時候不用太關心其存儲的方式。讀取完數據得到的數據模型可以直接進行展示和編輯操作,而不用關係數據源的類型。AE確實有這樣的一組接口來完成該工作。

在AE用來數據讀取的主要的接口包括IWorkspaceFactory和IWorkspace兩個接口。根據不同的數據源,AE提供了不同的WorkspaceFactory,通過WorkspaceFactory的Open方法得到不同的Workspace,通過Workspace就可以打開各種數據了。其接口體系圖如下:

從上圖我們可以看出當我們需要打開指定的Worksapce之前,我們要確定打開的時哪種類型的Workspace,然後實例化相應的WorkspaceFactory,接下來調用Open方法,當然在調用Open方法時要傳入對用的Workspace的連接參數,最後就能得到Worksapce的實例了。得到該實例之後,我們就可以把得到的IWorkspace轉換成相應的接口來打開要素類數據、柵格數據或其他數據。

下面就是打開常用Workspace的方法。

打開ShapeFile

在打開ShapeFile時,我們把shapeFile所在的文件夾作爲ShapeFile的Workpace,ShapeFile只是該Workspace下面的一個要素類。

      
      ESRI.ArcGIS.Geodatabase.IWorkspaceFactory workspaceFactory = new ESRI.ArcGIS.DataSourcesFile.ShapefileWorkspaceFactoryClass();
      // workspaceFactory.OpenFromFile,傳入的參數是Shapefile文件所在的文件夾路徑
      ESRI.ArcGIS.Geodatabase.IFeatureWorkspace featureWorkspace = (ESRI.ArcGIS.Geodatabase.IFeatureWorkspace)workspaceFactory.OpenFromFile("D:\\", 0); 
      // OpenFeatureClass傳入的參數是shape文件的文件名,不帶後綴
      ESRI.ArcGIS.Geodatabase.IFeatureClass featureClass = featureWorkspace.OpenFeatureClass("道路");

打開SDE

打開SDE的時候,需要設置一些連接參數,例如服務地址、端口、用戶名、密碼和版本。

ESRI.ArcGIS.esriSystem.IPropertySet pPropSet=new PropertySetClass();
pPropSet.SetProperty("server","服務器機器名" );
pPropSet.SetProperty("instance","SDE運行的端口號");
pPropSet.SetProperty("user","用戶名");
pPropSet.SetProperty("password","口令" );
pPropSet.SetProperty("version","版本");
SdeWorkspaceFactory sdeWkspFact=new SdeWorkspaceFactoryClass();
IFeatureWorkspace pFeaWksp=(IFeatureWorkspace)sdeWkspFact.Open(pPropSet,0); 

打開個人數據庫 Acess

個人數據庫就是Acess數據庫了,不過現在已經不太推薦使用,都推薦使用ArcGIS的文件數據庫即GDB

string filePath="E:\\tt.mdb";
AccessWorkspaceFactory fac=new AccessWorkspaceFactoryClass();
IFeatureWorkspace space=(IFeatureWorkspace)fac.OpenFromFile(filePath,0)
OpenFromFile是IWorkspaceFactory的一個對於文件的快捷的打開方式,也可以使用IProperty打開。

IPropertySet propertySet = new PropertySetClass();
/參數database就是Acess文件的路徑
propertySet.SetProperty("DATABASE", database);
IWorkspaceFactory workspaceFactory = new AccessWorkspaceFactoryClass();
return workspaceFactory.Open(propertySet, 0);

打開文件數據庫 GDB

文件數據庫就是GDB文件夾了,裏面存儲着一些二進制文件。打開GDB文件其實和打開Acess文件的方式類似。

string filePath="E:\\tt.gdb";
FileGDBWorkspaceFactoryClass fac=new FileGDBWorkspaceFactoryClass();
IFeatureWorkspace space=(IFeatureWorkspace)fac.OpenFromFile(filePath,0)
OpenFromFile是IWorkspaceFactory的一個對於文件的快捷的打開方式,也可以使用IProperty打開。
IPropertySet propertySet = new PropertySetClass();
/參數database就是gdb文件的路徑
propertySet.SetProperty("DATABASE", database);
IWorkspaceFactory workspaceFactory = new FileGDBWorkspaceFactoryClass();
return workspaceFactory.Open(propertySet, 0);

AutoCAD dwg文件

AutoCAD dwg文件比較特殊,在CAD中似乎不太區分線和麪的,也不太注重面是否有意義。我們使用ArcMap打開一個CAD文件時,可以看到裏面有四個圖層,分別是點、線、面和標註。所以我們使用ArcEngine打開一個CAD文件的結果應該是和ArcMap打開一樣的。例如在D盤有一個0.dwg的CAD文件,打開改文件的代碼如下:

CadWorkspaceFactoryClass fac=new CadWorkspaceFactoryClass ();
String filePath="D:\\";
IFeatureWorkspace space=fac.OpenFromFile(filePath,0) as IFeatureWorkspace ;
<pre name="code" class="csharp">//點
IFeatureClass point=space.OpenFeatureClass ("0.dwg:Point");
layer=new CadFeatureLayerClass ();
layer.FeatureClass =point;
//線IFeatureClass polyline =space.OpenFeatureClass("0.dwg:Polyline");IFeatureLayer layer=new CadFeatureLayerClass ();layer.FeatureClass =polyline;//面IFeatureClass polygon=space.OpenFeatureClass ("0.dwg:Polygon");layer=new CadFeatureLayerClass();layer.FeatureClass =polygon;//註記IFeatureClass anno=space.OpenFeatureClass ("0.dwg:Annotation"); layer=new CadAnnotationLayerClass();layer.FeatureClass =anno;


打開本地柵格數據 tif、img

打開本地的柵格數據有一個快捷的方式,就是通過RasterLayer打開,代碼如下:

IRasterLayer rasterLayer = new RasterLayerClass(); 
<pre name="code" class="csharp">// fileName指存本地的柵格文件路徑
rasterLayer.CreateFromFilePath(fileName); 


用IRasterDataset接口打開柵格數據集

WorkspaceFactory workspaceFactory = new RasterWorkspaceFactory(); 
IWorkspace workspace; 
//inPath柵格數據存儲路徑,文件夾路徑
workspace = workspaceFactory.OpenFromFile(inPath, 0); 
IRasterWorkspace rastWork = (IRasterWorkspace)workspace; 
IRasterDataset rastDataset; 
//inName柵格文件名
rastDataset= rastWork.OpenRasterDataset(inName);



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章