把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效率探究之二——属性的更新
时间: 2024-10-26 19:06:38