在创建要素图层的时候,默认的几何类型是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:不同线程不能打开同一个工作空间。