基于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);
        }
    }
    

    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数据库中。文章来源地址https://www.toymoban.com/news/detail-730931.html

到了这里,关于基于C#的AE二次开发之IQueryFilter接口、ISpatialFilter接口、IQueryDef 接口的查询接口的介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【JMeter】 二次开发插件开发 Dubbo 接口测试插件浅析

    在一些企业中,各类业务系统非常丰富,相互之间或对外提供很多的服务或接口 这些服务或接口中,有很多是需要强契约约束的,服务的提供方、服务的使用方必须遵守相同契约 这类服务最典型的就是RPC,其中应用广泛的有Dubbo、gRPC等 使用JMeter对这些RPC接口的测试,可以自

    2024年02月09日
    浏览(40)
  • 【VisionMaster SDK开发】第三讲 C#二次开发介绍及应用案例

    VisionMaster(后简称VM)作为一款功能强大的工业图像算法平台,可对工业中遇到的各种图像进行处理,同时拥有性能强大的算子以及丰富的教学例程,作为图像处理的通用平台是非常不错的选择。但Vision Master软件依旧有不足,就是难以配置复杂或定制化的图形界面,故需要结

    2024年02月05日
    浏览(57)
  • UG NX二次开发(C#)-装配-删除阵列矩阵

    在外部模式对装配体进行替换或者删除时,有时遇到部分组件不能替换或者删除,其中一个原因是阵列主组件,是不允许更改的。下面介绍下采用UG NX二次开发的方法删除阵列主组件。 在一个装配体模型中,删除某个组件时会出现下面的错误: “不能删除组件图样的主组件”

    2024年02月07日
    浏览(54)
  • C# SolidWorks 二次开发 -从零开始创建一个插件(2)

    上一篇我详细讲解了如何创建一个插件,但是无界面无按钮,这种插件适合配合事件偷偷的在后台做点什么事情。今天这篇讲一下如何增加一些按钮到工具栏、菜单上去。 先告诉大家这个东西注册表在哪,因为solidworks在这方面做的不太好,插件你改个名字,就有多个工具栏

    2024年02月15日
    浏览(60)
  • C# SolidWorks二次开发-第100篇 属性卡刷新方案

    SolidWorks推出属性卡应该很多年了吧,毕竟可以用户自己定义界面,而且方便修改,毕竟点击自带的的属性按钮再去修改要操作好几次。 我们今天讲一个很简单的功能要求,就是在SolidWorks中实现零件的编码问题。 毕竟设计好的东西后面需要生产,进各种系统,进行流转。 需

    2024年02月12日
    浏览(72)
  • UG NX二次开发(C#)-创建点到曲线(边)的切线

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 在UG NX二次开发时,对于求点到曲线的切线,采用ufun函数可以实现,即是UF_CURVE_create_line_point_tangent,但是对于C#,这个函数尚未封装进来,所以没有直接对应的函数。本文讲一下采用C#创建点到曲线的切

    2024年02月09日
    浏览(60)
  • UG NX二次开发(C#)-机械管线布置-添加管道路径

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 机械管道布局是UG NX的一个应用模块,以前给客户做过一个项目,现在分享给大家。这篇文章是讲解如何布置管道路径(创建线性路径),后面会逐步的讲解,如果有需要的可以私信博主,或者加入QQ群

    2024年01月20日
    浏览(95)
  • C# Solidworks二次开发:程序工具界面和选项相关API详解

    大家好,今天要讲的是关于程序工具相关的API介绍。 下面是要介绍的API: (1)第一个为GetAutoPartSimplification,这个API的含义为获取简化配置的指针,下面是官方具体解释: 其输入参数的类型在上一篇文章中已经介绍过了gtError_e,返回值为指向简化配置的指针。 (2)第二个为Ge

    2024年04月17日
    浏览(51)
  • C# Solidworks二次开发:创建距离配合以及移动组件API详解

    今天要讲的文章是关于如何创建距离配合和移动组件的API详解。 (1)创建配合API,CreateMate() 这个API的解释是根据指定的特性数据对象来创建配合,也就可以理解为输入什么样的特征对象就可以创建出什么配合,这个API的输入参数类型为object,返回的参数类型为Feature。 而输

    2024年02月09日
    浏览(56)
  • C# Solidworks二次开发:自动创建虚拟零件及使用注意事项

    今天要讲的是关于在solidworks中如何自动创建虚拟零件的功能,也就是solidworks中插入新零件这个功能。 实现这个功能需要使用的API如下所示: InsertNewVirtualPart(swFaceOrPlane1, out swcomp2); 其中这个方法中使用到了两个参数。 第一个参数:为一个平面,或是一个基准平面。 第二

    2024年02月15日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包