ArcgisEngine+C#开发中,对一个图层进行过滤,并只显示符合条件的要素
在二次开发中,经常会对一个图层进行查询,查询出符合条件的要素,我们通常会想到:
IQueryFilter queryFilter = new QueryFilterClass();
queryFilter.WhereClause = "XZQDM =510113";
IFeatureCursor featureCursor = sourceFeatureClass.Search(queryFilter, true);
IFeature feature= featureCursor.NextFeature();
while (feature!= null)
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(feature);
pFeature = featureCursor.NextFeature();
}
System.Runtime.InteropServices.Marshal.ReleaseComObject(featureCursor);
但是这种方法虽然可以找到我们希望得到的效果,但是不符合条件的要素依然显示。
其实有一种高效的方法,可以实现从一个图层查询,并只显示符合条件的要素:
其中featureLayer是进行查询的图层,"XZQDM =510113"是查询条件
IFeatureLayerDefinition featureLayerDefinition = featureLayer as IFeatureLayerDefinition;
featureLayerDefinition.DefinitionExpression ="XZQDM =510113";
在使用地图模块动态开发,即地图图层的要素类动态从sde数据库中获取要素类时(大量空间数据存储在sde的要素类中),
此方法十分有效,前提是模板要素类的表结构和sde中的获取要素类表结构相同。
其中featureClass是从sde空间数据库中获取的要素类,
featureLayer.FeatureClass=featureClass;
IFeatureLayerDefinition featureLayerDefinition = featureLayer as IFeatureLayerDefinition;
featureLayerDefinition.DefinitionExpression ="XZQDM =510113";
关于IFeatureLayerDefinition
IFeatureLayerDefinition--自定义要素层接口
实现该接口的主要组件类(CoClass)--FeatureLayer
项目中使用该接口实现的方法:
将某个图层的选择集提取出来新建临时图层:
IFeatureLayer pFeatureLayer = _myMap.get_Layer(0) as IFeatureLayer; //MessageBox.Show(pFeatureLayer.Name+"1111"); IFeatureSelection pFeatureSelection = pFeatureLayer as IFeatureSelection; ISelectionSet pSelectionSet = pFeatureSelection.SelectionSet; if (pSelectionSet == null) { System.Windows.Forms.MessageBox.Show("请选择一块图幅!"); } IFeatureLayerDefinition pFeatureLayerDef = pFeatureLayer as IFeatureLayerDefinition; pFeatureLayerDef.CreateSelectionLayer("tempLayer", true, null, null); IFeatureLayer pTempFeatureLayer = pFeatureLayerDef as IFeatureLayer;
对图层的显示进行处理(屏蔽):
IFeatureLayer featureLayer = _myMap.Layer[0] as IFeatureLayer; IFeatureLayerDefinition featureLayerDefinition = featureLayer as IFeatureLayerDefinition; //只显示objectID = 657的要素,其他要素屏蔽掉 featureLayerDefinition.DefinitionExpression = "OBJECTID = '657'";