基于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数据库中。
*

相关推荐
legend_jz15 分钟前
【Linux】线程控制
linux·服务器·开发语言·c++·笔记·学习·学习方法
tangliang_cn36 分钟前
java入门 自定义springboot starter
java·开发语言·spring boot
程序猿阿伟37 分钟前
《智能指针频繁创建销毁:程序性能的“隐形杀手”》
java·开发语言·前端
新知图书1 小时前
Rust编程与项目实战-模块std::thread(之一)
开发语言·后端·rust
威威猫的栗子1 小时前
Python Turtle召唤童年:喜羊羊与灰太狼之懒羊羊绘画
开发语言·python
力透键背1 小时前
display: none和visibility: hidden的区别
开发语言·前端·javascript
bluefox19791 小时前
使用 Oracle.DataAccess.Client 驱动 和 OleDB 调用Oracle 函数的区别
开发语言·c#
ö Constancy1 小时前
c++ 笔记
开发语言·c++
墨染风华不染尘1 小时前
python之开发笔记
开发语言·笔记·python
徐霞客3202 小时前
Qt入门1——认识Qt的几个常用头文件和常用函数
开发语言·c++·笔记·qt