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

92 篇文章 6 订阅
2 篇文章 0 订阅

一、开发环境

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

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

从上面的表格可以看出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);
        }
    }
    

    2.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
    

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值