1、查找数据
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();
4)属性表的方法读取属性值
ITable pTable = pLayer.FeatureClass as ITable;
clsFldValue = pTable.GetRow(i).get_Value(clsFldIndex);
用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());