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

本文档详细介绍了如何使用C#编程在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;
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不秃头的LT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值