版權聲明:轉載時請以超鏈接形式標明文章原始出處和作者信息及本聲明
http://mxf-gis.blogbus.com/logs/30457468.html
提供創建和打開各種數據集和其他workspace級別對象的成員。
IFeatureWorkspace接口用於訪問和管理地理數據庫中的要素的重要成分—數據集,如Tables,ObjectClasses,FeatureClasses,FeatureDatasets,和RelationshipClasses。所有的Open方法(例如OpenTable)都要以dataset的名稱作爲輸入。在企業數據庫上工作時,就需要使用完全限定名(例如,”database.owner.tablename”或”owner.tablename”).
處理地理數據庫時(personal,file或ArcSDE),workspace將運行一個實例datasets的對象表。不同的opendatasets的方法返回一個對其的引用。
IFeatureWorkspace是用workspace創建和打開對象、對象類的主接口。
成員
CreateFeatureClass,CreateFeatureDataset,CreateQueryDef,CreateRelationshipClass,CreateTable,OpenFeatureClass,OpenFeatureDataset,OpenFeatureQuery,OpenRelationshipClass,OPenRelationshipQuery,OpenTable.
若干個常用的成員
IFeatureWorkspace.CreateFeatureClass方法
[Visual Basic.NET] Public Function CreateFeatureClass(ByVal Name As String,ByVal Fields As IFields,ByVal CLSID As UID,ByVal EXTCLSID As UID,ByVal FeatureType As esriFeatureType,ByVal ShapeFieldName As String,ByVal ConfigKeywork As String) As IFeatureClass
[C#] public IFeatureClass CreateFeatureClass(string Name,IFields Fields,UID CLSID,UID EXTCLSID,esriFeatureType FeatureType,string ShapeFieldName,string ConfigKeyword);
CreateFeatureClass方法可以用來創建獨立的要素類。除了CreateTable所需的參數外,還要指定FeatureType參數(如esriFTsimple,esriFTComplexEdgeFeature和其他)和shapeFieldName。ShapeFieldName表示要素類幾何圖形字段的名稱。在調用CreateFeatureClass之前,設置好GeometryDef對象的空間參考以及空間索引。
在Geodatabase wokspace中創建FeatureClass要包含一些必須的字段。從你要創建的對象類型的類描述中可以獲得所需字段(IObjectClassDescription的RequiredFields字段)。
CLSID參數用來指定實例化對象的GUID。如果未傳入參數,地理數據庫將使用與esriGeoDatabase.Feature有關的CLSID。多數例子中該法可行。如果要素類有自定義的Feature而不是esriGeoDatabase.Feature,這時或以後調用要素類的IClassSchemaEdit接口傳入GUID。
EXTCLSID可選參數指定實例化FeatureClassExtension對象的GUID。該對象至少要支持IClassExtension接口。使用configurationKeyword參數可以控制RDBMS中的表的物理佈局—例如,在Oracle數據庫中,configuration keyword控制表創建的空間、初始化、next extents和其他屬性。ArcSDE的configurationKeyword由ArcSDE data adimistrator設置。
在9.2地理數據庫之前的workspace中,GeometryDef引用一個低精度的空間參考。9.1和之前的版本只支持低精度的空間參考,9.2要求高精度的空間參考。使用IControlPrecision2::IsHighRecision來管理空間參考的精度。使用IGeodatabaseRelease接口釋放geodatabase。
注意:不支持下列表和要素名稱前綴:”gdb_”,”sde_”,”delta_”
Example
[Visual Basic 6.0]
Public Sub CreateShapefile()
Const strFolder As String="D:/DATA"
Const strName As String="MyShapeFile" '不要包含.shp擴展
Const strShapeFieldName As String="Shape"
'打開包含shapefile的文件夾作爲workspace
Dim pFWS As IFeatureWorkspace
Dim pWorkspaceFactory As IWorkspaceFactory
Set pWorkspaceFactory=New ShapefileWorkspaceFactory
Set pFWS=pWorkspaceFactory.OpenFromFile(strFolder,0)
Dim pFields As IFields
Dim pFieldsEdit As IFieldsEdit
Set pFields=New esriGeoDatabase.Fields
Set pFieldsEdit=pFields
Dim pField As IField
Dim pFieldEdit As IFieldEdit
Set pField=New esriGeoDatabase.Field
Set pFieldEdit=pField
pFieldEdit.Name=strShapeFieldName
pFieldEdit.Type=esriFieldTypeGeometry
Dim pGeomDef As IGeometryDef
Dim pGeomDefEdit As IGeometryDefEdit
Set pGeomdef=New GeometryDef
Set pGeomDefEdit=pGeometryDef
With pGeomDefEdit
.GeometryType=esriGeometryPolygon
Set.SpatialReference=New UnknownCoordinateSystem
End With
Set pFieldEdit.GeometryDef=pGeomDef
pFieldsEdit.AddField pField
Set pField=New esriGeoDatabase.Field
Set pFieldEdit=pField
With pFieldEdit
.Length=30
.Name="MiscText"
.Type=esriFieldTypeString
End With
pFieldsEdit.AddField pField
'創建shapefile
Dim pFeatClass As IFeatureClass
Set pFeatClass=pFWS.CreateFeatureClass(strName,pFields,Nothing,Nothing,esriFTSimple,strShapeFieldName,"")
End Sub
IFeatureWorkspace.OpenFeatureClass方法
[Visual Basic.NET] Public Function OpenFeatureClass(ByVal Name As String) As IFeatureClass
[C#] public IFeatureClass OpenFeatureClass(string Name);
使用完全限定名可以打開workspace中任何已存在的要素類。地理數據庫中的每一個要素類都有唯一的完全限定名,使用OpenFeatureClass可以直接打開要素類。
使用IDatabaseConnectionInfo接口確定User和Database。ISQLSyntax::QualifyTableName可以用來確定要素類的完全限定名。使用IWorkspace2接口的NameExists來確定geodatabase中的要素類是否有適當的名稱。
打開參與topology或geometric network的要素類將在內存中打開所有參與的要素類。
OpenFeatureClass名稱參數的一些例子。
Coverage要素類
building:polygon
Oracle 要素類(如果已經連接到要素類,則不需要owner前綴。
gdb.Buildings
SQLServer要素類
fdo_data.gdb.Buildings
Informix要素類
Bladetest2:gdb.Buildings
VPF要素類
Ks032193:veg:vgfarea(library:coverage:feature class)
VPF數據的library名稱區分大小寫,並且要和LAT中存儲的一致(Library Attribute Table)
與Topology有關的4個表格:T_#_DirtyAreas,T_#_PolyErrors,T_#_LineErrors和T_#_PointErrors可以直接編輯。由於這個原因他們不能打開,打開時返回一個地理數據庫的錯誤。
Example
[Visual Basic 6.0]
Public Sub OpenFeatureClass_Example()
Dim pWorkspaceFactory As IWorkspaceFactory
Set pWorkspaceFactory=New ShapefileWorkspaceFactory
Dim pFeatureWorkspace As IFeatureWorkspace
Set pFeatureWorkspace=pWorkspaceFactory.OpenFromFile("D:/Data/Esridata/USA",0)
Dim pFeatureClass As IFeatureClass
Set pFeatureClass=pFeatureWorkspace.OpenFeatureClass("States")
MsgBox"There are " & pFeatureClass.FeatureCount(Nothing) & "states"
End Sub
[C#]
//e.g.,nameOfShapefile="States";
// dataPath="D://Data//Esridata//USA"
public void IFeatureWorkspace_OpenFeatureClass_Example(string dataPath,string nameOfShapefile)
{
IWorkspaceFactory workspaceFactory=new ESRI.ArcGIS.DataSourcesFile.ShapefileWorkspaceFactoryClass();
IFeatureWorkspace featureWorkspace=(IFeatureWorkspace)workspaceFactory.OpenFromFile(dataPath,0);
IFeatureClass featureClass=featureWorkspace.OpenFeatureClass(nameOfShapefile);
Console.WriteLine("There are {0} features in the {1} feature class",featureClass.FeatureCount(new QueryFilterClass()),featureClass.AliasName);
}
//適用於各種類型workspace的通用形式
//e.g.,nameOfFeatureClass="States"
//on ArcSDE use ISqlSyntax::QualifyTableName for qualified names
public IFeatureClass getIFeatureClass(IWorkspace workspace,string nameOfFeatureClass)
{
//cast for the feature workspace from the workspace
IFeatureWorkspace featureWorkspace=(IFeatureWorkspace)workspace;
//open the featureclass
return featureWorkspace.OpenFeatureClass(nameOfFeatureClass);
}