[C#] [ArcGIS] [Engine] 0x004 属性操作(更新中)

目录

1.Intro

2.Environment

3.Source

4.Conclusion


1.Intro

主要针对字段创建、删除、检查、获取和挂接表等的属性操作。

2.Environment

Environment:Windows 7及以上

Language:C#

IDE:Visual Studio 2012

SDK:ArcGIS Engine 10.2

3.Source

    [Guid("8b52d619-b130-405c-bc90-47ca3ede3ecf")]
    [ClassInterface(ClassInterfaceType.None)]
    [ProgId("Libs_GIS.Attribute_Operate")]
    public sealed class Attribute_Operate
    {
        #region 获取游标

        /// <summary>
        /// 获取选择要素,返回游标进行查询操作
        /// </summary>
        /// <param name="pFeatureLayer">要素图层对象</param>
        /// <returns>返回游标对象</returns>
        public static IFeatureCursor GetSelectedFeatures_Search(IFeatureLayer pFeatureLayer)
        {
            ICursor pCursor = null;
            IFeatureCursor pFeatureCursor = null;
            if (pFeatureLayer == null) return null;
            //选定的特征集
            IFeatureSelection pFeatureSelection = pFeatureLayer as IFeatureSelection;
            ISelectionSet pSelectionSet = pFeatureSelection.SelectionSet;
            if (pSelectionSet.Count == 0) return null;
            pSelectionSet.Search(null, false, out pCursor);
            pFeatureCursor = pCursor as IFeatureCursor;
            return pFeatureCursor;
        }

        /// <summary>
        /// 获取选择要素,返回游标进行更新操作
        /// </summary>
        /// <param name="pFeatLyr">要素图层对象</param>
        /// <returns>返回游标对象</returns>
        public static IFeatureCursor GetSelectedFeatures_Update(IFeatureLayer pFeatureLayer)
        {
            ICursor pCursor = null;
            IFeatureCursor pFeatureCursor = null;
            if (pFeatureLayer == null)
            {
                return null;
            }
            //选定的特征集
            IFeatureSelection pFeatureSelection = pFeatureLayer as IFeatureSelection;
            ISelectionSet2 pSelectionSet2 = pFeatureSelection.SelectionSet as ISelectionSet2;
            if (pSelectionSet2.Count == 0)
            {
                return null;
            }
            pSelectionSet2.Update(null, false, out pCursor);
            pFeatureCursor = pCursor as IFeatureCursor;
            return pFeatureCursor;
        }

        #endregion

        #region 要素数量统计

        /// <summary>
        /// 获取要素的数量(图层获取)
        /// </summary>
        /// <param name="pFeatureLayer">要素图层对象</param>
        /// <returns>返回要素个数</returns>
        public static int Get_Feature_Count(IFeatureLayer pFeatureLayer)
        {
            return pFeatureLayer.FeatureClass.FeatureCount(null);
            
        }

        /// <summary>
        /// 获取要素的数量(图层获取)
        /// </summary>
        /// <param name="pFeatureLayer">要素图层对象</param>
        /// <param name="pQueryFilter">查询语句</param>
        /// <returns>返回要素个数</returns>
        public static int Get_Feature_Count(IFeatureLayer pFeatureLayer, IQueryFilter pQueryFilter)
        {
            return pFeatureLayer.FeatureClass.FeatureCount(pQueryFilter);
        }

        /// <summary>
        /// 获取要素的数量(游标获取)
        /// </summary>
        /// <param name="pFeatureCursor">游标对象</param>
        /// <returns>返回要素个数</returns>
        public static int Get_Feature_Count(IFeatureCursor pFeatureCursor)
        {
            int count = 0;
            IFeature pFeature = pFeatureCursor.NextFeature();
            while (pFeature != null)
            {
                count++;
                pFeature = pFeatureCursor.NextFeature();
            }
            return count;
        }

        /// <summary>
        /// 获取图层要素中选中的要素数量
        /// </summary>
        /// <param name="pFeatureLayer">要素图层对象</param>
        /// <returns>返回选中个数</returns>
        public static int Get_SelectedFeature_Count(IFeatureLayer pFeatureLayer)
        {
            IFeatureSelection pFeatureSelection = pFeatureLayer as IFeatureSelection;
            ISelectionSet pSelectionSet = pFeatureSelection.SelectionSet;
            int selected_Count = pSelectionSet.Count;
            return selected_Count;
        }

        #endregion

        #region 字段创建、检查、删除和获取所有字段名称

        /// <summary>
        /// 检查字段名是否存在
        /// </summary>
        /// <param name="field_Name">字段名</param>
        /// <returns>返回检查结果,存在返回true,不存在返回false</returns>
        public static bool Check_Field_Exists(IFeatureLayer pFeatureLayer, string field_Name)
        {
            IFields pFields = pFeatureLayer.FeatureClass.Fields;
            if (pFields.FindField(field_Name) == -1)
            {
                return false;
            }
            else
            {
                return true;
            }
        }

        /// <summary>
        /// 创建字段
        /// </summary>
        /// <param name="pFeatureLayer">要素图层对象</param>
        /// <param name="field_Name">字段名</param>
        /// <param name="field_AliasName">字段别名</param>
        /// <param name="field_Type">字段类型</param>
        public static void Create_Field(IFeatureLayer pFeatureLayer, string field_Name, string field_AliasName, string field_Type)
        {
            IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
            IClass pClass = pFeatureClass as IClass;
            IField pField = new FieldClass();
            IFieldEdit pFieldEdit = pField as IFieldEdit;
            pFieldEdit.Name_2 = field_Name;
            pFieldEdit.AliasName_2 = field_AliasName;
            switch (field_Type.ToLower().Trim().ToString())
            {
                case "int":
                    pFieldEdit.Type_2 = esriFieldType.esriFieldTypeSmallInteger;
                    break;
                case "text":
                    pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
                    break;
                case "date":
                    pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDate;
                    break;
                case "double":
                    pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble;
                    break;
                case "long":
                    pFieldEdit.Type_2 = esriFieldType.esriFieldTypeInteger;
                    break;
                case "float":
                    pFieldEdit.Type_2 = esriFieldType.esriFieldTypeSingle;
                    break;
            }
            pClass.AddField(pField);
        }

        /// <summary>
        /// 删除字段
        /// </summary>
        /// <param name="featureLayer">要素图层对象</param>
        /// <param name="field_Name">字段名称</param>
        public static void Delete_Field(IFeatureLayer featureLayer, string field_Name)
        {
            ITable pTable = featureLayer as ITable;
            IFields pFields = pTable.Fields;
            int index_Field = pFields.FindField(field_Name);
            IField pField = pFields.get_Field(index_Field);
            pTable.DeleteField(pField);
        }

        /// <summary>
        /// 获取全部字段名
        /// </summary>
        /// <param name="pFeatureClass">要素类对象</param>
        /// <returns>返回字段名列表</returns>
        public static List<string> Get_AllFieldsName(IFeatureClass pFeatureClass)
        {
            int num = pFeatureClass.Fields.FieldCount;
            List<string> list_FieldsName = new List<string>();
            for (int i = 0; i < num; i++)
            {
                string name = pFeatureClass.Fields.get_Field(i).Name;
                list_FieldsName.Add(name);
            }
            return list_FieldsName;
        }

        #endregion

        #region 字段赋值
        /// <summary>
        /// 要素属性获取
        /// </summary>
        /// <param name="pFeature">要素对象</param>
        /// <param name="field_Name">字段名称</param>
        /// <returns>返回字段值</returns>
        private static object Get_FieldValue(IFeature pFeature, string field_Name)
        {
            int index = pFeature.Class.FindField(field_Name);
            object value = pFeature.get_Value(index);
            return value;
        }

        /// <summary>
        /// 要素属性赋值
        /// </summary>
        /// <param name="pFeature">要素对象</param>
        /// <param name="field_Name">字段名</param>
        /// <param name="field_Value">字段值</param>
        private static void Set_FieldValue(IFeature pFeature, string field_Name, object field_Value)
        {
            int index = pFeature.Class.FindField(field_Name);
            pFeature.set_Value(index, field_Value);
        }   

        #endregion        

        #region 挂接表操作

        /// <summary>
        /// 设置属性关联
        /// </summary>
        /// <param name="featureLayer">需要关联的图层要素</param>
        /// <param name="baseFeatureLayer">关联基于的图层要素</param>
        private static void Set_JoinTable(IFeatureLayer featureLayerToJoin, IFeatureLayer baseFeatureLayerToJoin, string join_Field = "OBJECTID", string base_JoinField = "OBJECTID")
        {
            try
            {
                IFeatureClass pFClass = baseFeatureLayerToJoin.FeatureClass;
                ITable pForeignTable = featureLayerToJoin.FeatureClass as ITable;
                IMemoryRelationshipClassFactory pMemoRelCFactory = new MemoryRelationshipClassFactoryClass();
                IRelationshipClass pRelationshipClass = pMemoRelCFactory.Open(
                    "TableJoin1",
                    pFClass,  // 基于join的图层要素
                    base_JoinField,
                    (IObjectClass)pForeignTable,  // join的图层要素
                    join_Field,
                    "forward",
                    "backward",
                    esriRelCardinality.esriRelCardinalityOneToOne
                );
                IDisplayRelationshipClass pDisplayRelationshipClass = (IDisplayRelationshipClass)featureLayerToJoin;
                pDisplayRelationshipClass.DisplayRelationshipClass(pRelationshipClass, esriJoinType.esriLeftOuterJoin); //左连接。
            }
            catch
            {
                return;
            }
        }

        /// <summary>
        /// 获取Join后的FeatureClass对象
        /// </summary>
        /// <param name="featureLayerToJoin">需要join的图层对象</param>
        /// <param name="baseFeatureLayerToJoin">基于的join图层对象</param>
        /// <param name="join_Field">join字段</param>
        /// <returns>返回join后的要素对象</returns>
        private static IFeatureClass Get_BaseJoinFeatureClass(IFeatureLayer featureLayerToJoin, IFeatureLayer baseFeatureLayerToJoin, string join_Field = "OBJECTID", string base_JoinField = "OBJECTID")
        {
            IFeatureClass baseJoinFeatureClass = baseFeatureLayerToJoin.FeatureClass;
            ITable pBaseJoinTable = baseJoinFeatureClass as ITable;

            IFeatureClass joinFeatureClass = featureLayerToJoin.FeatureClass;
            ITable pJoinTable = joinFeatureClass as ITable;

            IMemoryRelationshipClassFactory memoryRelClassFactory = new MemoryRelationshipClassFactory();
            IRelationshipClass relationshipClass = memoryRelClassFactory.Open(
                "TableJoin1",
                pBaseJoinTable as IObjectClass,  // 基于join的图层要素
                base_JoinField,
                pJoinTable as IObjectClass,  // join的图层要素
                join_Field,
                "forward",
                "backward",
                esriRelCardinality.esriRelCardinalityOneToOne
                );
            IRelationshipClassCollectionEdit pRelClassCollEdit = baseFeatureLayerToJoin as IRelationshipClassCollectionEdit;
            pRelClassCollEdit.AddRelationshipClass(relationshipClass);
            IDisplayTable displayTable = pRelClassCollEdit as IDisplayTable;
            IFeatureClass outputFeatureClass = displayTable.DisplayTable as IFeatureClass;
            return outputFeatureClass;
        }

        #endregion

    }

4.Conclusion

不多比比,直接上代码,都在注释里了兄弟。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Dr_Asada

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

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

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

打赏作者

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

抵扣说明:

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

余额充值