基于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方法就行了。

  • 示例代码
cs 复制代码
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);
    }
}

2.ISpatialFilter接口

  • ISpatialFilter继承了接口IQueryFilter,在属性查询的基础上加了要素与要素的空间关系进行查询。其中Geometry用于设置查询几何;SpatialRel设置查询的空间关系,空间关系esriSpatialRelEnum可参考我另一篇文章的介绍。以及esri官网的介绍
    SpatialFilterClass还继承了IQueryFilterDefinition2接口。
  • 示例代码
cs 复制代码
#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

3.IQueryDef 接口

IQueryDef用于属性查询。它支持复杂的SQL查询并且能在同一工作空间内做连表查询。但是查询后的结果不支持编辑。且不能在Shapefile 和Coverage 数据中使用,而仅仅可以使用在GeoDatabase数据库中。
*

相关推荐
福大大架构师每日一题17 小时前
2026年1月TIOBE编程语言排行榜,Go语言排名第16,Rust语言排名13。C# 当选 2025 年度编程语言。
golang·rust·c#
wangnaisheng17 小时前
【C#】gRPC的使用,以及与RESTful的区别和联系
c#
JosieBook17 小时前
【开源】基于 C# 和 Halcon 机器视觉开发的车牌识别工具(附带源码)
开发语言·c#
龙潜月七17 小时前
做一个背单词的脚本
数据库·windows·c#·aigc·程序那些事
逑之17 小时前
C语言笔记14:结构体、联合体、枚举
c语言·开发语言·笔记
崇山峻岭之间17 小时前
Matlab学习记录30
开发语言·学习·matlab
stillaliveQEJ17 小时前
【JavaEE】Spring IoC(二)
java·开发语言·spring
民乐团扒谱机17 小时前
【微实验】MATLAB 仿真实战:多普勒效应 —— 洒水车音乐的音调变化仿真
开发语言·matlab·多普勒效应·多普勒频移
寻星探路17 小时前
【Python 全栈测开之路】Python 基础语法精讲(一):常量、变量与运算符
java·开发语言·c++·python·http·ai·c#
朔北之忘 Clancy17 小时前
2020 年 6 月青少年软编等考 C 语言一级真题解析
c语言·开发语言·c++·学习·算法·青少年编程·题解