ARCEngine创建要素类(以点为例)

思路:获取空间参考——>打开几何编辑——>设置要素类类型(点、线、面)——>设置空间参考——>设置字段集合——>定义单个集合,并添加到字段集合中——>打开工作空间创建要素类

一. 创建点要素类
在工作空间中建立:

        /// <summary>
        /// 创建独立要素类 
        /// </summary>
        /// <param name="workspace">目标工作空间</param>
        /// <param name="featureClassName">目标数据集名称</param>
        /// <param name="fieldsCollection">字段集合</param>
        /// <param name="shapeFieldName">几何字段名</param>
        /// <returns></returns>
        public IFeatureClass CreateStandaloneFeatureClass(IWorkspace workspace, string featureClassName, IFields pFields, string shapeFieldName)
        {
    
    
            if (pFields == null)
            {
    
    
                ISpatialReference pSpatialReference = axMapControl1.ActiveView.FocusMap.SpatialReference;

                IGeometryDefEdit pGeoDef = new GeometryDefClass();
                IGeometryDefEdit pGeoDefEdit = pGeoDef as IGeometryDefEdit;
                pGeoDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint;//esriGeometryPolyline,esriGeometryPolygon
                pGeoDefEdit.SpatialReference_2 = pSpatialReference;
                //定义一个字段集合对象

                pFields = new FieldsClass();
                IFieldsEdit pFieldsEdit = (IFieldsEdit)pFields;

                //定义单个的字段

                IField pField = new FieldClass();
                IFieldEdit pFieldEdit = (IFieldEdit)pField;
                pFieldEdit.Name_2 = "SHAPE";

                pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
                pFieldEdit.GeometryDef_2 = pGeoDef;
                pFieldsEdit.AddField(pField);

                //定义单个的字段,并添加到字段集合中 
                pField = new FieldClass(); pFieldEdit = (IFieldEdit)pField;
                pFieldEdit.Name_2 = "STCD";

                pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
                pFieldsEdit.AddField(pField);

                //定义单个的字段,并添加到字段集合中 
                pField = new FieldClass(); pFieldEdit = (IFieldEdit)pField;
                pFieldEdit.Name_2 = "SLM10";

                pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
                pFieldsEdit.AddField(pField);

                //定义单个的字段,并添加到字段集合中 
                pField = new FieldClass(); pFieldEdit = (IFieldEdit)pField;
                pFieldEdit.Name_2 = "SLM20";

                pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
                pFieldsEdit.AddField(pField);

                //定义单个的字段,并添加到字段集合中 
                pField = new FieldClass(); pFieldEdit = (IFieldEdit)pField;
                pFieldEdit.Name_2 = "SLM40";

                pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
                pFieldsEdit.AddField(pField);
            }

                IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace;
                IFeatureClassDescription fcDesc = new FeatureClassDescriptionClass();
                IObjectClassDescription ocDesc = (IObjectClassDescription)fcDesc;
                // Use IFieldChecker to create a validated fields collection.
                IFieldChecker fieldChecker = new FieldCheckerClass();
                IEnumFieldError enumFieldError = null;
                IFields validatedFields = null;
                fieldChecker.ValidateWorkspace = workspace;
                fieldChecker.Validate(pFields, out enumFieldError, out validatedFields);
                // The enumFieldError enumerator can be inspected at this point to determine 
                // which fields were modified during validation.
                IFeatureClass featureClass = featureWorkspace.CreateFeatureClass(featureClassName, validatedFields, ocDesc.InstanceCLSID, ocDesc.ClassExtensionCLSID, esriFeatureType.esriFTSimple, shapeFieldName, null);
            }
            catch (Exception ex)
            {
    
    
                MessageBox.Show(ex.ToString(), "提示");
                return null;
            }
            return featureClass;
        }

上面代码看着有些累赘,将字段几何取出
二. 创建点要素类

  1. CreateStandaloneFeatureClass函数
        /// <summary>
        /// 创建独立要素类
        /// </summary>
        /// <param name="workspace">目标工作空间</param>
        /// <param name="dicFields">属性结构</param>
        /// <param name="featureClassName">目标数据集名称</param>
        /// <param name="fieldsCollection">字段集合</param>
        /// <param name="shapeFieldName">几何字段名</param>
        /// <returns></returns>
        public IFeatureClass CreateStandaloneFeatureClass(IWorkspace workspace, Dictionary<string, string> dicFields, string featureClassName, IFields pFields, string shapeFieldName)
        {
    
    
            IFeatureClass featureClass = null;
            try
            {
    
    
                ISpatialReference pSpatialReference = axMapControl1.ActiveView.FocusMap.SpatialReference;

                //IGeometryDef geometryDef = new GeometryDefClass();
                IGeometryDefEdit pGeoDef = new GeometryDefClass();
                IGeometryDefEdit pGeoDefEdit = pGeoDef as IGeometryDefEdit;
                pGeoDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint;//创建点
                pGeoDefEdit.SpatialReference_2 = pSpatialReference;//获取空间参考系

                //创建要素类的字段集合
                pFields = new FieldsClass();
                IFieldsEdit pFieldsEdit = (IFieldsEdit)pFields;
                if (dicFields != null && dicFields.Count == 0)
                {
    
    
                    return null;
                }
                foreach (var item in dicFields)
                {
    
    
                    pFieldsEdit.AddField(BuildField(item.Key, item.Value));
                }

                #region 添加Shape字段
                //添加Shape字段
                IField pField = new FieldClass();
                IFieldEdit pFieldEdit = (IFieldEdit)pField;
                pFieldEdit.Name_2 = "SHAPE";

                pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
                pFieldEdit.GeometryDef_2 = pGeoDef;  //添加Shape字段
                pFieldsEdit.AddField(pField);
;
                #endregion
                IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace;
                IFeatureClassDescription fcDesc = new FeatureClassDescriptionClass();
                IObjectClassDescription ocDesc = (IObjectClassDescription)fcDesc;
                // Use IFieldChecker to create a validated fields collection.
                IFieldChecker fieldChecker = new FieldCheckerClass();
                IEnumFieldError enumFieldError = null;
                IFields validatedFields = null;
                fieldChecker.ValidateWorkspace = workspace;
                fieldChecker.Validate(pFields, out enumFieldError, out validatedFields);
                // The enumFieldError enumerator can be inspected at this point to determine 
                // which fields were modified during validation.
                featureClass = featureWorkspace.CreateFeatureClass(featureClassName, validatedFields, ocDesc.InstanceCLSID, ocDesc.ClassExtensionCLSID, esriFeatureType.esriFTSimple, shapeFieldName, null);
            }
            catch (Exception ex)
            {
    
    
                MessageBox.Show(ex.ToString(), "提示");
                return null;
            }
            return featureClass;
        }

2.构建属性字段BuildField函数

      /// <summary>
      /// 创建属性结构
      /// </summary>
      /// <param name="fldname">属性结构名称</param>
      /// <param name="fldtype">属性结构字段类型</param>
      /// <returns></returns>
      private static IField BuildField(string fldname, string fldtype)
      {
    
    
          //IFields fields = new FieldsClass();
          IField oidField = new FieldClass();
          IFieldEdit oidFieldEdit = (IFieldEdit)oidField;
          oidFieldEdit.Name_2 = fldname;
          switch (fldtype.ToString().ToLower())
          {
    
    
              case "objectid":
                  oidFieldEdit.Type_2 = esriFieldType.esriFieldTypeOID;
                  break;

              case "longinteger":
                  oidFieldEdit.Type_2 = esriFieldType.esriFieldTypeInteger;
                  break;

              case "shortinteger":
                  oidFieldEdit.Type_2 = esriFieldType.esriFieldTypeSmallInteger;
                  break;
              case "text":
                  oidFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
                  oidFieldEdit.Length_2 = 50;
                  break;
              case "double":
                  oidFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble;
                  break;
              case "geometry":
                  oidFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
                  break;
          }
          return oidField;
      }
  1. main:创建点要素类
            //字段
            Dictionary<string, string> dicFields = new Dictionary<string, string>();
            dicFields.Add("ID", "objectid");
            //创建要素类
            string featureClassName = "Features";
            string shapeFieldName = "SHAPE";
            CreateStandaloneFeatureClass(pWs, dicFields, featureClassName, null, shapeFieldName);

三.在数据集中建立

        /// <summary>
        /// 在工作空间下创建图层
        /// </summary>
        /// <param name="featureClassName">图层名称</param>
        /// <param name="dicFields">属性结构</param>
        /// <param name="pfeaturedataset">数据集名称</param>
        /// <param name="classExtensionUID">类型UID</param>
        /// <param name="featureWorkspace">工作空间</param>
        /// <param name="spatialRef">空间参考</param>
        /// <param name="esrigeomtryType">几何类型</param>
        /// <returns></returns>
        public static IFeatureClass CreateFeatureClass(string featureClassName, Dictionary<string, string> dicFields, IFeatureDataset pfeaturedataset, UID classExtensionUID, IFeatureWorkspace featureWorkspace, esriGeometryType esrigeomtryType, ISpatialReference spatialRef)
        {
    
    
            IFeatureClass featureClass = null;
            try
            {
    
    
                //创建要素类的字段集合
                IFields fields = new FieldsClass();
                IFieldsEdit fieldsEdit = (IFieldsEdit)fields;
                if (dicFields != null && dicFields.Count == 0)
                {
    
    
                    return null;
                }
                foreach (var item in dicFields)
                {
    
    
                    fieldsEdit.AddField(BuildField(item.Key, item.Value));
                }

                #region 添加Shape字段
                //添加Shape字段
                IGeometryDef geometryDef = new GeometryDefClass();
                IGeometryDefEdit geometryDefEdit = (IGeometryDefEdit)geometryDef;
                geometryDefEdit.GeometryType_2 = esrigeomtryType;
                geometryDefEdit.SpatialReference_2 = spatialRef;

                IField geometryField = new FieldClass();
                IFieldEdit geometryFieldEdit = (IFieldEdit)geometryField;
                geometryFieldEdit.Name_2 = "Shape";
                geometryFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
                geometryFieldEdit.GeometryDef_2 = geometryDef;
                fieldsEdit.AddField(geometryField);
                #endregion

                //创建一个Validated Fields集合
                IFieldChecker fieldChecker = new FieldCheckerClass();
                IEnumFieldError enumFieldError = null;
                IFields validatedFields = null;
                fieldChecker.ValidateWorkspace = (IWorkspace)featureWorkspace;
                fieldChecker.Validate(fields, out enumFieldError, out validatedFields);

                featureClass = pfeaturedataset.CreateFeatureClass(featureClassName, validatedFields, null, classExtensionUID,
                esriFeatureType.esriFTSimple, "Shape", "");
                return featureClass;
            }
            catch (Exception ex)
            {
    
    
            }
            return null;
        }

四.克隆要素类

       /// <summary>
        /// 创建要素类,克隆模式
        /// </summary>
        /// <param name="featureClass_InputLine"></param>
        /// <returns></returns>
        private IFeatureClass CreateStandaFeatureClass(IFeatureClass featureClass_InputLine)
        {
    
    
            IGeometryDef pGeometryDef = new GeometryDef();
            IGeometryDefEdit pGeometryDefEdit = pGeometryDef as IGeometryDefEdit;
            if (featureClass_InputLine.ShapeType == esriGeometryType.esriGeometryPoint)
            {
    
    
                pGeometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryMultipoint;
                pGeometryDefEdit.HasM_2 = false;
                pGeometryDefEdit.HasZ_2 = false;
                pGeometryDefEdit.SpatialReference_2 = spatialReference;
            }
            else if (featureClass_InputLine.ShapeType == esriGeometryType.esriGeometryPolyline)
            {
    
    
                pGeometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolyline;
                pGeometryDefEdit.HasM_2 = false;
                pGeometryDefEdit.HasZ_2 = false;
                pGeometryDefEdit.SpatialReference_2 = spatialReference;
            }
            else
            {
    
    
                pGeometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolygon;
                pGeometryDefEdit.HasM_2 = false;
                pGeometryDefEdit.HasZ_2 = false;
                pGeometryDefEdit.SpatialReference_2 = spatialReference;
            }

            // 字段集合
            IFields pFields = new Fields();
            IFieldsEdit pFieldsEdit = pFields as IFieldsEdit;
            for (int i = 0; i < featureClass_InputLine.Fields.FieldCount; i++)
            {
    
    
                IField field = featureClass_InputLine.Fields.get_Field(i);
                pFieldsEdit.AddField(field);
            }
            // 创建要素类 并将将要接边的要素导入
            string EdgeSnapFeaturesName = "Features";
            IFeatureClass pFeatureClass = pFtDataset.CreateFeatureClass(EdgeSnapFeaturesName, pFields, null, null, esriFeatureType.esriFTSimple, "Shape", "");
            return pFeatureClass;
        }

猜你喜欢

转载自blog.csdn.net/firstlt0217/article/details/109808989