• 将FeatClass属性表高效率转换成DataTable


    把IFeatureClass ITable转换成DataTable,效率高。

    方法一 ITable遍历行 

    1.用IFeatureClass属性查询的方式较慢,这样速度可提高几十倍。

    2.避免了hresult 0x80040952错误

            /// <summary>
            /// 将FeatClass属性表高效率转换成DataTable  
    ///gisrsman.cnblogs.com
    /// </summary> /// <param name="featCls">输入的要素类</param> /// <param name="pQueryFilter">查询器,无则为Null</param> /// <returns></returns> public static DataTable FeatClass2DataTable(IFeatureClass featCls, IQueryFilter pQueryFilter) { DataTable pAttDT = null; string pFieldName; string pFieldValue; DataRow pDataRow; if (featCls != null) { //根据IFeatureClass字段结构初始化一个表结构 pAttDT = InitTableByFeaCls(featCls); ITable pFeatTable = featCls as ITable; int pFieldCout = pFeatTable.Fields.FieldCount; ICursor pCursor = pFeatTable.Search(pQueryFilter, false); IRow pRow = pCursor.NextRow(); while (pRow != null) { pDataRow = pAttDT.NewRow(); for (int j = 0; j < pFieldCout; j++) { pFieldValue = pRow.get_Value(j).ToString(); pFieldName = pFeatTable.Fields.get_Field(j).Name; pDataRow[pFieldName] = pFieldValue; } pAttDT.Rows.Add(pDataRow); pRow = pCursor.NextRow(); } } return pAttDT; }

    注意: 不要使用pTable.GetRow(i).get_Value(j)这种方式,容易出hresult 0x80040952错误

    方法二 IFeatureClass遍历属性

    遍历要素法查询,效率低

    遍历要素方法
            /// <summary>
            /// 将FeatClass属性表转换成DataTable
            /// </summary>
            /// <param name="featCls"></param>
            /// <param name="pQueryFilter">查询器,无则为Null</param>
            /// <returns></returns>
            public static DataTable FeatClass2DataTable(IFeatureClass featCls, IQueryFilter pQueryFilter)
            {
                DataTable pAttDT = null;
                IFeature pFeature = null;
                IFeatureCursor pFeatCur = null;
                string pFieldName;
                string pFieldValue;
                DataRow pDataRow;
    
                if (featCls != null)
                {
                    pAttDT = InitTableByFeaCls(featCls);
                    pFeatCur = featCls.Search(pQueryFilter, false);
                    if (pFeatCur != null) pFeature = pFeatCur.NextFeature();
    
                    while (pFeature != null)
                    {
                        pDataRow = pAttDT.NewRow();
    
                        IFields pFields = pFeature.Fields;
                        int pNum = pFields.FieldCount;
                        for (int i = 0; i < pNum; i++)
                        {
                            pFieldName = pFields.get_Field(i).Name;
                            pFieldValue = pFeature.get_Value(i).ToString();
                            pDataRow[pFieldName] = pFieldValue;
                        }
                        pAttDT.Rows.Add(pDataRow);
    
                        pFeature = pFeatCur.NextFeature();
                    }
                }
                return pAttDT;
            }

    方法三 :直接用sde用户连接,查询对应表

    每个要素类在数据库中本质上一张表,可以直接用sql语句查询对应要素类的表。

    例如下图是铁路要素类在oracle中的存储。

    hresult 0x80040952错误

    objectID不一定是按顺序排列,所以读取数据不要用for循环,用while。
    1.在遍历featureClass时:Cursor.nextFeature()
    主要原因是使用for循环遍历要素集,但是for循环依据objectID作为ID遍历,而不少要素集的objectID都不是依次从0-n这么规范连续下去的,例如0 1 2 5 6 7 8 ... ...
    还是使用Cursor.nextFeature(),这样就不会出现上述的问题了

    2.在遍历Itable行时:pCursor.NextRow();


    参考:
    ArcGIS Engine效率探究——要素的添加和删除、属性的读取和更新
    Arcengine效率探究之一——属性的读取
    Arcengine效率探究之二——属性的更新
  • 相关阅读:
    两台电脑之间怎么用一根网线传输数据
    IDEA的几个常用配置,日常开发必备
    idea 配置Maven
    IDEA2019 安装和激活
    HTML中各类空格占位符
    jackSon注解-- @JsonInclude 注解不返回null值字段
    Vscode配置Eslint
    Tomcat中容器是什么以及容器与容器之间的数量关系。
    请求是如何传递给StandardEngine的?
    Java中一个线程只有六个状态。至于阻塞、可运行、挂起状态都是人们为了便于理解,自己加上去的。
  • 原文地址:https://www.cnblogs.com/GISRSMAN/p/5063219.html
Copyright © 2020-2023  润新知