ArcEngine 創建線要素圖層


在創建要素圖層的時候,默認的幾何類型是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:不同線程不能打開同一個工作空間。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM