1)、利用FeaturCursor进行空间查询
//空间查询 ISpatialFilter spatialFilter = new SpatialFilterClass(); spatialFilter.Geometry = envelope;//指定几何体 String shpFld = featureClass.ShapeFieldName; spatialFilter.GeometryField = shpFld; spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;//相交 IQueryFilter queryFilter = new QueryFilterClass(); queryFilter = (IQueryFilter)spatialFilter; IFeatureCursor searchCursor = featureClass.Search(queryFilter, true); IFeature feature = searchCursor.NextFeature(); int n = 0; while (feature != null){ n++; feature = baseCursor.NextFeature(); }
2)、利用FeatureCursor在选择集中进行查询
IFeatureSelection pFeatureSelectio = pFeatureLayer as IFeatureSelection; ICursor ppCursor; pFeatureSelectio.SelectionSet.Search(null, false, out ppCursor); IFeatureCursor pFeatureCursor = ppCursor as IFeatureCursor; IFeature pFeature = pFeatureCursor.NextFeature();
3)、利用FeatureCursor进行属性查询
IQueryFilter pQueryFilter = new QueryFilterClass(); pQueryFilter.WhereClause = "PROJECTCODE = '" + this.ProjectNumTextBox.Text.Trim() + "'"; IFeatureCursor pFeatureCursor = LineFeaClass.Search(pQueryFilter, false); IFeature pFeatureIfExit = pFeatureCursor.NextFeature();
用Environment.TickCount进行代码执行时间测试,结果发现4)读取整个表的时间为4984ms,而 3)读取同一个属性给的时间仅为32 ms,3)的执行效率是法一的156倍!!!
完整测试代码如下:
IFeatureLayer pLayer = Utilities.GetLayerByName((string)cmbRegLayers.SelectedItem, m_mapControl) as IFeatureLayer; IFeatureCursor FCursor = pLayer.FeatureClass.Search(new QueryFilterClass(), false); IFeature feature = FCursor.NextFeature(); int t = Environment.TickCount; object clsFldValue=null; for (int i = 0; i < pLayer.FeatureClass.FeatureCount(null); i++) { clsFldValue = feature.get_Value(3); feature = FCursor.NextFeature(); } t = Environment.TickCount - t; MessageBox.Show(t.ToString()); ITable pTable = pLayer.FeatureClass as ITable; t = Environment.TickCount; for (int i = 0; i < pTable.RowCount(null); i++) clsFldValue = pTable.GetRow(i).get_Value(3); t = Environment.TickCount - t; MessageBox.Show(t.ToString());