在創建要素圖層的時候,默認的幾何類型是Polygon:
Dim objectClassDescription As IObjectClassDescription = New FeatureClassDescription Dim fields2 As Fields = objectClassDescription.RequiredFields
代碼來源:http://resources.arcgis.com/en/help/arcobjects-net/componenthelp/index.html#//0049000000pz000000
上面代碼的fields2包含2個字段,一個OBJECTID字段和一個SHAPE字段,而SHAPE字段決定了要素的幾何類型(GeometryType),這個是環境自己生成,他的幾何類型是Polygon。
如果想生成其他的幾何類型的要素圖層就要自己手動創建這兩個字段,並在SHAPE添加幾何類型的信息,下面圖層的要素類型為Polyline。如下代碼(VB)所示:
Dim featureClassName As String = "圖層名稱" '臨時圖層名稱 Dim workspaceFactory As IWorkspaceFactory = New InMemoryWorkspaceFactory() '內存空間 Dim WorkspaceName As IWorkspaceName = workspaceFactory.Create("", "MyWorkspace", Nothing, 0) Dim name As IName = WorkspaceName Dim workspace As IWorkspace = name.Open() Dim featureWorkspace As IFeatureWorkspace = workspace 'Dim workspace2 As IWorkspace2 = workspace Dim fields As IFields = Nothing Dim CLSID As ESRI.ArcGIS.esriSystem.UID = Nothing Dim CLSEXT As ESRI.ArcGIS.esriSystem.UID = Nothing Dim strConfigKeyword As String = "" Dim featureClass As IFeatureClass ' 賦值類ID如果未分配 If CLSID Is Nothing Then CLSID = New ESRI.ArcGIS.esriSystem.UID CLSID.Value = "esriGeoDatabase.Feature" End If '環境默認生成的兩個字段,字段的幾何類型為Polygon,決定了要素圖層的集合類型 'Dim objectClassDescription As IObjectClassDescription = New FeatureClassDescription 'Dim fields2 As Fields = objectClassDescription.RequiredFields If fields Is Nothing Then ' 創建要素幾何信息 Dim pGeometryDef As IGeometryDef = New GeometryDef() ' 為esriFieldTypeGeometry類型的字段創建幾何定義,包括類型和空間參照 Dim pGeometryDefEdit As IGeometryDefEdit = pGeometryDef pGeometryDefEdit.GridCount_2 = 1 pGeometryDefEdit.GeometryType_2 = ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline '決定要素圖層的幾何類型 pGeometryDefEdit.SpatialReference_2 = pMap.SpatialReference '必須設置圖層的空間參考系 fields = New Fields Dim fieldsEdit As IFieldsEdit = CType(fields, IFieldsEdit) '自己創建OBJECTID字段 Dim fieldOID As IField = New Field() Dim fieldEditOID As IFieldEdit = CType(fieldOID, IFieldEdit) fieldEditOID.Name_2 = "OBJECTID" fieldEditOID.AliasName_2 = "OBJECTID" fieldEditOID.Type_2 = esriFieldType.esriFieldTypeOID fieldEditOID.Editable_2 = False fieldsEdit.AddField(fieldOID) '自己創建幾何字段, Dim fieldShape As IField = New Field() Dim fieldEditShape As IFieldEdit = CType(fieldShape, IFieldEdit) fieldEditShape.Name_2 = "SHAPE" fieldEditShape.AliasName_2 = "SHAPE" fieldEditShape.Type_2 = esriFieldType.esriFieldTypeGeometry fieldEditShape.GeometryDef_2 = pGeometryDef fieldEditShape.Editable_2 = True fieldsEdit.AddField(fieldShape) Dim field As IField = New Field Dim fieldEdit As IFieldEdit = CType(field, IFieldEdit) ' 顯示轉換 ' 設置字段屬性 fieldEdit.Name_2 = "RISK" fieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble fieldEdit.IsNullable_2 = False fieldEdit.AliasName_2 = "RISK" fieldEdit.DefaultValue_2 = 0 fieldEdit.Editable_2 = True fieldsEdit.AddField(field) Dim field2 As IField = New Field Dim fieldEdit2 As IFieldEdit = CType(field2, IFieldEdit) ' 顯示轉換 ' 設置字段屬性 fieldEdit2.Name_2 = "管線ObjId" fieldEdit2.Type_2 = esriFieldType.esriFieldTypeInteger fieldEdit2.IsNullable_2 = False fieldEdit2.AliasName_2 = "管線ObjId" fieldEdit2.DefaultValue_2 = 0 fieldEdit2.Editable_2 = True '添加到字段集中 fieldsEdit.AddField(field2) fields = CType(fieldsEdit, IFields) End If Dim strShapeField As String = "" Dim j As Int32 For j = 0 To fields.FieldCount If fields.Field(j).Type = esriFieldType.esriFieldTypeGeometry Then strShapeField = fields.Field(j).Name 'fields.Field(j).GeometryDef.GeometryType = ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline Exit For End If Next j Dim fieldChecker As IFieldChecker = New FieldChecker Dim enumFieldError As IEnumFieldError = Nothing Dim validatedFields As IFields = Nothing fieldChecker.ValidateWorkspace = workspace fieldChecker.Validate(fields, enumFieldError, validatedFields) featureClass = featureWorkspace.CreateFeatureClass(featureClassName, validatedFields, CLSID, CLSEXT, esriFeatureType.esriFTSimple, strShapeField, strConfigKeyword)
C#
/// <summary> /// 創建點要素圖層,內存圖層 /// </summary> /// <param name="featureClassName">圖層名稱</param> /// <returns>要素圖層</returns> private IFeatureClass CreateFeatureClass(string featureClassName) { IWorkspaceFactory workspaceFactory = new InMemoryWorkspaceFactory();//內存空間 IWorkspaceName WorkspaceName = workspaceFactory.Create("", "MyWorkspace", null, 0); IName name = WorkspaceName as IName; IWorkspace workspace = name.Open(); IFeatureWorkspace featureWorkspace = workspace as IFeatureWorkspace; IFields fields=null; ESRI.ArcGIS.esriSystem.UID CLSID= null; ESRI.ArcGIS.esriSystem.UID CLSEXT=null; String strConfigKeyword = ""; IFeatureClass featureClass; //賦值類ID如果未分配 if( CLSID==null){ CLSID = new ESRI.ArcGIS.esriSystem.UID(); CLSID.Value = "esriGeoDatabase.Feature"; } //環境默認生成的兩個字段,字段的幾何類型為Polygon,決定了要素圖層的集合類型 //Dim objectClassDescription As IObjectClassDescription = New FeatureClassDescription //Dim fields2 As Fields = objectClassDescription.RequiredFields if( fields==null) { //創建要素幾何信息 IGeometryDef pGeometryDef = new GeometryDef();//為esriFieldTypeGeometry類型的字段創建幾何定義,包括類型和空間參照 IGeometryDefEdit pGeometryDefEdit=pGeometryDef as IGeometryDefEdit; pGeometryDefEdit.GridCount_2 = 1; pGeometryDefEdit.GeometryType_2 = ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint; //決定要素圖層的幾何類型 pGeometryDefEdit.SpatialReference_2 = axSceneControl1.Scene.SpatialReference;//必須設置圖層的空間參考系 fields = new Fields(); IFieldsEdit fieldsEdit =fields as IFieldsEdit; //自己創建OBJECTID字段 IField fieldOID = new Field(); IFieldEdit fieldEditOID =fieldOID as IFieldEdit; fieldEditOID.Name_2 = "OBJECTID"; fieldEditOID.AliasName_2 = "OBJECTID"; fieldEditOID.Type_2 = esriFieldType.esriFieldTypeOID; fieldEditOID.Editable_2 = false; fieldsEdit.AddField(fieldOID); //自己創建幾何字段, IField fieldShape = new Field(); IFieldEdit fieldEditShape = fieldShape as IFieldEdit; fieldEditShape.Name_2 = "SHAPE"; fieldEditShape.AliasName_2 = "SHAPE"; fieldEditShape.Type_2 = esriFieldType.esriFieldTypeGeometry; fieldEditShape.GeometryDef_2 = pGeometryDef; fieldEditShape.Editable_2 = true; fieldsEdit.AddField(fieldShape); IField field = new Field(); IFieldEdit fieldEdit =field as IFieldEdit;// 顯示轉換 //設置字段屬性 fieldEdit.Name_2 = "RISK"; fieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble; fieldEdit.IsNullable_2 = false; fieldEdit.AliasName_2 = "RISK"; fieldEdit.DefaultValue_2 = 0; fieldEdit.Editable_2 = true; fieldsEdit.AddField(field); IField field2 = new Field(); IFieldEdit fieldEdit2=field2 as IFieldEdit; // 顯示轉換 //設置字段屬性 fieldEdit2.Name_2 = "管線ObjId"; fieldEdit2.Type_2 = esriFieldType.esriFieldTypeInteger; fieldEdit2.IsNullable_2 = false; fieldEdit2.AliasName_2 = "管線ObjId"; fieldEdit2.DefaultValue_2 = 0; fieldEdit2.Editable_2 = true; //添加到字段集中 fieldsEdit.AddField(field2); fields =fieldsEdit as IFields; } String strShapeField = ""; for (int j = 0; j < fields.FieldCount; j++) { if(fields.get_Field(j).Type == esriFieldType.esriFieldTypeGeometry) { strShapeField =fields.get_Field(j).Name; } } IFieldChecker fieldChecker =new FieldChecker(); IEnumFieldError enumFieldError =null; IFields validatedFields =null; fieldChecker.ValidateWorkspace = workspace; fieldChecker.Validate(fields,out enumFieldError, out validatedFields); featureClass = featureWorkspace.CreateFeatureClass(featureClassName, validatedFields, CLSID, CLSEXT, esriFeatureType.esriFTSimple, strShapeField, strConfigKeyword) return featureClass; }
打開內存空間(C#)
IRasterLayer pRasterLayer = new RasterLayerClass(); IWorkspaceFactory workspaceFactory2 = new InMemoryWorkspaceFactory(); IRasterWorkspace2 workspace = (IRasterWorkspace2)workspaceFactory2.OpenFromFile("MyWorkspace", 0);
PS:不同線程不能打開同一個工作空間。