• 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:不同线程不能打开同一个工作空间。

  • 相关阅读:
    Silverlight2 开发环境 安装程序顺序
    Java——IO流超详细总结
    【慢慢学Android】:2.SharedPreferences对数据的存储
    【慢慢学算法】:求最大公约数
    【慢慢学算法】:求较大素数 筛选法
    【慢慢学算法】:排名
    手把手教你将vim配置成一个C/C++的超级IDE
    【慢慢学算法】:特殊乘法
    【慢慢学算法】:qsort()与sort的用法(收藏)
    【慢慢学算法】:数字阶梯求和
  • 原文地址:https://www.cnblogs.com/GIScore/p/5487287.html
Copyright © 2020-2023  润新知