AE二次开发-获取图层的属性表

Arcgis Engine二次开发C#常用库封装:Github源码

获取矢量或栅格图层的属性表,且可以指定获取的行数。
可以根据字段属性设置数据表的列属性。

        /// <summary>
        /// 获取图层的属性表
        /// </summary>
        /// <param name="layer">图层</param>
        /// <param name="rowCount">指定获取的行数</param>
        /// <returns>属性表</returns>
        public static DataTable GetAttributeTable(ILayer layer, long rowCount = -1)
        {
            ITable iTable = null;
            if (layer is IFeatureLayer)
            {
                iTable = (ITable)layer;
            }
            else
            {
                IRasterLayer rasLayer = layer as IRasterLayer;
                //判断是否存在属性表
                if (rasLayer != null && IsRasterLayerHaveTable(rasLayer.Raster))
                {
                    iTable = (ITable)layer;
                }
            }
            if (iTable == null) return null;
            DataTable dataTable = new DataTable();
            IFields fields = iTable.Fields;
            for (int i = 0; i < fields.FieldCount; i++)
            {
                dataTable = AddTableColumnsByField(fields.Field[i], dataTable);
            }
            string shapeType = FeatureFunction.GetShapeType(layer);
            ICursor pCursor = iTable.Search(null, false);
            IRow pRow = pCursor.NextRow();
            while (pRow != null)
            {
                //新建DataTable的行对象
                DataRow pDataRow = dataTable.NewRow();
                for (int i = 0; i < pRow.Fields.FieldCount; i++)
                {
                    //如果字段类型为esriFieldTypeGeometry,则根据图层类型设置字段值
                    switch (pRow.Fields.Field[i].Type)
                    {
                        case esriFieldType.esriFieldTypeGeometry:
                            pDataRow[i] = shapeType;
                            break;
                        case esriFieldType.esriFieldTypeBlob:
                            pDataRow[i] = "Element";
                            break;
                        default:
                            pDataRow[i] = pRow.Value[i];
                            break;
                    }
                }
                //添加DataRow到DataTable
                dataTable.Rows.Add(pDataRow);
                pRow = pCursor.NextRow();
                //设置指定的行数
                if (rowCount != -1 && dataTable.Rows.Count == rowCount)
                {
                    break;
                }
            }
            return dataTable;
        }


        /// <summary>
        /// 判断栅格图层是否拥有属性表
        /// </summary>
        /// <param name="pRaster">栅格</param>
        /// <returns>是否拥有属性表</returns>
        public static bool IsRasterLayerHaveTable(IRaster pRaster)
        {
            IRasterProps pProp = pRaster as IRasterProps;
            if (pProp == null)
            {
                return false;
            }
            if (pProp.PixelType == rstPixelType.PT_FLOAT || pProp.PixelType == rstPixelType.PT_DOUBLE) //判断栅格像元值是否是整型
            {
                return false;
            }
            IRasterBandCollection pRasterbandCollection = (IRasterBandCollection)pRaster;
            IRasterBand rasterBand = pRasterbandCollection.Item(0);
            ITable rTable = rasterBand.AttributeTable;
            return rTable != null;
        }

        /// <summary>
        /// 根据字段属性设置数据表的列属性
        /// </summary>
        /// <param name="field">字段</param>
        /// <param name="table">数据表</param>
        /// <returns>数据表</returns>
        public static DataTable AddTableColumnsByField(IField field, DataTable table)
        {
            //新建一个DataColumn并设置其属性
            DataColumn pDataColumn = new DataColumn(field.Name);
            //字段值是否允许为空
            pDataColumn.AllowDBNull = field.IsNullable;
            //字段别名
            pDataColumn.Caption = field.AliasName;
            //字段数据类型
            pDataColumn.DataType = Type.GetType(ConvertFieldType(field.Type));
            //字段默认值
            pDataColumn.DefaultValue = field.DefaultValue;
            //当字段为String类型是设置字段长度
            if (field.VarType == 8)
            {
                pDataColumn.MaxLength = field.Length;
            }
            //字段添加到表中
            table.Columns.Add(pDataColumn);
            return table;
        }

  • 0
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值