在建立地理信息系统时,很多时候需要只显示指定范围的要素。例如只显示指定的行政区或分幅图的数据,其它的不显示。借助IFeatureLayerDefinition接口有两种方式建立查询图层可以实现这类需求。
1、通过属性建立查询图层
if (filterSQL.Length == 0) return false;
IFeatureLayer pFeatureLayer = null;
IFeatureClass pFeatureClass = pWorkspace.OpenFeatureClass(layerName);
if (pFeatureClass == null) return false ;
if (pFeatureClass.FeatureType =esriFeatureType.esriFTAnnotation )
{
pFeatureLayer = new FDOGraphicsLayerClass();
}
else
{
pFeatureLayer = new FeatureLayerClass();
}
pFeatureLayer.FeatureClass = pFeatureClass;
pFeatureLayer.Name = layerName;
IFeatureLayerDefinition pFeatureLayerDef = pFeatureLayer as IFeatureLayerDefinition;
pFeatureLayerDef.DefinitionExpression = filterSQL; //只需要设置Where查询条件就可以只显示查询到的要素
_map.AddLayer((ILayer)pFeatureLayer);
return true ;
有时候跨图层查询并没有关联字段,而是通过图层间拓扑关系显示要素集,则需要以下方式。
2、通过范围建立查询图层
IFeatureLayer pFeatureLayer = null;
IFeatureClass pFeatureClass = pWorkspace.OpenFeatureClass(layerName);
if (pFeatureClass == null) return false;
if (pFeatureClass.FeatureType =esriFeatureType.esriFTAnnotation )
{
//初始化标注图层
pFeatureLayer = new FDOGraphicsLayerClass();
}
else
{
pFeatureLayer = new FeatureLayerClass();
}
pFeatureLayer.FeatureClass = pFeatureClass;
pFeatureLayer.Name = layerName;
IFeatureSelection featSelection = pFeatureLayer as IFeatureSelection;
ISpatialFilter sfilter = new SpatialFilter();
sfilter.Geometry = boundary; // boundary为显示要素的范围
sfilter.SearchOrder = esriSearchOrder.esriSearchOrderSpatial;
sfilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;//相交的要素显示
featSelection.SelectFeatures(sfilter,esriSelectionResultEnum.esriSelectionResultNew, false);
IFeatureLayerDefinition pFeatureLayerDef = pFeatureLayer as IFeatureLayerDefinition;
IFeatureLayer newLayer= pFeatureLayerDef .CreateSelectionLayer (_layerName ,true,"",""); //一定要选true,用选择集创建新图层
featSelection.Clear();
//设置图层的Render或其属性
....
//
_map.AddLayer((ILayer)newLayer);
return true;
建立查询图层后,如果不仅是查看图层还要在图层上编辑修改和删除要素,会实时显示在图面上,但是新增要素,则不能反映在查询图层上,因为查询图层只是原图层的视图,需要
ISelectionSet selection= pFeatureLayerDef.DefinitionSelectionSet;
selection.Add(pFeature.OID);
加入到选择集中才会显示。