基于C#的AE二次开发之IQueryFilter、ISpatialFilter、IQueryDef的查询接口的介绍

基于C#的AE二次开发之IQueryFilter、ISpatialFilter、IQueryDef的查询接口的介绍

我的开发环境为ArcGIS Engine 10.2与Visual studio2010。在使用ArcEngine查询进行查询的时候主要使用三种查询接口IQueryFilter(属性查询) 、ISpatialFilter(空间查询) 、IQueryDef (多表查询)
那么这三个接口的区别是什么呢?

要求 IQueryFilter ISpatialFilter IQueryDef
属性约束 True True True
空间约束 False True False
查询结果包括多个表的字段 False False True
查询结果返回一个游标 True True True
RecordSet对象可以从结果中创建 True True True
返回的记录可以被编辑 True True False
记录集包括在活动编辑会话中进行的编辑 True True False

从上面的表格可以看出IQueryFilter、IQueryDef 都可以进行属性查询,ISpatialFilter可以进行空间查询。

  1. IQueryFilter接口

这是最常见的属性查询,输入WhereClause条件用于获取或设置查询过滤条件,然后调用IFeatureClass或者ITable的Search方法就行了。

  • 示例代码
private void 属性查询ToolStripMenuItem_Click(object sender, EventArgs e)
{
    try
    {
        //判断第一个图层是否是矢量图层,如果是则开始属性查询,如果不是程序不再执行
        if (axMapControl1.get_Layer(0) is IFeatureLayer)
        {
            //把第一个图层强制转换为要素类图层
            IFeatureLayer pFeatureLayer = axMapControl1.get_Layer(0) as IFeatureLayer;
            //创建一个QueryFilter对象
            IQueryFilter pQueryFilter = new QueryFilter();
            //输入查询过滤条件【查询当前要素类 FID为1或2的要素】
            pQueryFilter.WhereClause = "FID = 1 or FID = 2";
            IFeatureSelection pFeatureSelection = pFeatureLayer as IFeatureSelection;
            //进行空间查询,并加入选择集
            pFeatureSelection.SelectFeatures(pQueryFilter, esriSelectionResultEnum.esriSelectionResultNew, false);
            //刷新主地图进行高亮显示,一般用局部刷新
            axMapControl1.Refresh();
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("请先加载数据后再进行查询!","",MessageBoxButtons.OK,MessageBoxIcon.Warning);
    }
}
  1. ISpatialFilter接口
    ISpatialFilter继承了接口IQueryFilter,在属性查询的基础上加了要素与要素的空间关系进行查询。其中Geometry用于设置查询几何;SpatialRel设置查询的空间关系,空间关系esriSpatialRelEnum可参考我另一篇文章的介绍。以及esri官网的介绍。
    SpatialFilterClass还继承了IQueryFilterDefinition2接口。
  • 示例代码
#region 通过点击主地图的面状图形,获取其临近要素
private void axMapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
{
    try
    {
        //清空地图选择集
        axMapControl1.ActiveView.FocusMap.ClearSelection();
        //实例化一个点,以该点作拓扑算子,将点击的位置坐标赋予pPoint
        IPoint pPoint = new ESRI.ArcGIS.Geometry.Point();
        ITopologicalOperator pTopologicalOperator = pPoint as ITopologicalOperator;
        pPoint.PutCoords(e.mapX, e.mapY);
        //以缓冲半径为0进行缓冲  得到一个点
        IGeometry pGeometry = pTopologicalOperator.Buffer(0);
        //以该点进行要素选择(只能选中面状要素,点和线无法选中)
        axMapControl1.Map.SelectByShape(pGeometry, null, false);
        //刷新视图
        axMapControl1.Refresh(esriViewDrawPhase.esriViewGeoSelection, null, null);
        // 获取选择集
        ISelection pSelection = axMapControl1.Map.FeatureSelection;
        // 获取要素
        IEnumFeature pEnumFeature = pSelection as IEnumFeature;
        IFeature pFeature = pEnumFeature.Next();
        while (pFeature != null)
        {
            //定义一个空间查询对象
            ISpatialFilter spatialFilter = new SpatialFilter();
            //空间查询对象为点选的的几何对象
            spatialFilter.Geometry = pFeature.Shape;
            //设置空间查询关系为 空间临接查询
            spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelTouches;
            //遍历axMapControl1中的所有图层
            for (int i = 0; i < axMapControl1.LayerCount; i++)
            {
                //清空地图选择集
                axMapControl1.ActiveView.FocusMap.ClearSelection();
                //判断当前图层是否为矢量图层
                if (axMapControl1.get_Layer(i) is IFeatureLayer)
                {
                    //将图层强制转换为IFeatureLayer
                    IFeatureLayer pFeatureLayer = axMapControl1.get_Layer(i) as IFeatureLayer;
                    //输入目标图层,并转换为IFeatureSelection对象
                    IFeatureSelection featureSelection = pFeatureLayer as IFeatureSelection;
                    //开始空间查询,查询到的结果保存在ISelectionSet中,可以用游标Cursor来遍历要素                          
                    featureSelection.SelectFeatures((IQueryFilter)spatialFilter, esriSelectionResultEnum.esriSelectionResultNew, false);
                }
            }
            break;
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("程序执行失败!"+ex);
    }
}
#endregion
  • 效果预览
    基于C#的AE二次开发之IQueryFilter、ISpatialFilter、IQueryDef的查询接口的介绍_第1张图片
  1. IQueryDef 接口
    IQueryDef用于属性查询。它支持复杂的SQL查询并且能在同一工作空间内做连表查询。但是查询后的结果不支持编辑。且不能在Shapefile 和Coverage 数据中使用,而仅仅可以使用在GeoDatabase数据库中。

    基于C#的AE二次开发之IQueryFilter、ISpatialFilter、IQueryDef的查询接口的介绍_第2张图片

你可能感兴趣的:(组件GIS,#,AE二次开发,C#)