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


    一、开发环境

    开发环境为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方法就行了。

    • 示例代码
      1. private void 属性查询ToolStripMenuItem_Click(object sender, EventArgs e)
      2. {
      3. try
      4. {
      5. //判断第一个图层是否是矢量图层,如果是则开始属性查询,如果不是程序不再执行
      6. if (axMapControl1.get_Layer(0) is IFeatureLayer)
      7. {
      8. //把第一个图层强制转换为要素类图层
      9. IFeatureLayer pFeatureLayer = axMapControl1.get_Layer(0) as IFeatureLayer;
      10. //创建一个QueryFilter对象
      11. IQueryFilter pQueryFilter = new QueryFilter();
      12. //输入查询过滤条件【查询当前要素类 FID为1或2的要素】
      13. pQueryFilter.WhereClause = "FID = 1 or FID = 2";
      14. IFeatureSelection pFeatureSelection = pFeatureLayer as IFeatureSelection;
      15. //进行空间查询,并加入选择集
      16. pFeatureSelection.SelectFeatures(pQueryFilter, esriSelectionResultEnum.esriSelectionResultNew, false);
      17. //刷新主地图进行高亮显示,一般用局部刷新
      18. axMapControl1.Refresh();
      19. }
      20. }
      21. catch (Exception ex)
      22. {
      23. MessageBox.Show("请先加载数据后再进行查询!","",MessageBoxButtons.OK,MessageBoxIcon.Warning);
      24. }
      25. }

      2.ISpatialFilter接口

    • ISpatialFilter继承了接口IQueryFilter,在属性查询的基础上加了要素与要素的空间关系进行查询。其中Geometry用于设置查询几何;SpatialRel设置查询的空间关系,空间关系esriSpatialRelEnum可参考我另一篇文章的介绍。以及esri官网的介绍
      SpatialFilterClass还继承了IQueryFilterDefinition2接口。
    • 示例代码
      1. #region 通过点击主地图的面状图形,获取其临近要素
      2. private void axMapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
      3. {
      4. try
      5. {
      6. //清空地图选择集
      7. axMapControl1.ActiveView.FocusMap.ClearSelection();
      8. //实例化一个点,以该点作拓扑算子,将点击的位置坐标赋予pPoint
      9. IPoint pPoint = new ESRI.ArcGIS.Geometry.Point();
      10. ITopologicalOperator pTopologicalOperator = pPoint as ITopologicalOperator;
      11. pPoint.PutCoords(e.mapX, e.mapY);
      12. //以缓冲半径为0进行缓冲 得到一个点
      13. IGeometry pGeometry = pTopologicalOperator.Buffer(0);
      14. //以该点进行要素选择(只能选中面状要素,点和线无法选中)
      15. axMapControl1.Map.SelectByShape(pGeometry, null, false);
      16. //刷新视图
      17. axMapControl1.Refresh(esriViewDrawPhase.esriViewGeoSelection, null, null);
      18. // 获取选择集
      19. ISelection pSelection = axMapControl1.Map.FeatureSelection;
      20. // 获取要素
      21. IEnumFeature pEnumFeature = pSelection as IEnumFeature;
      22. IFeature pFeature = pEnumFeature.Next();
      23. while (pFeature != null)
      24. {
      25. //定义一个空间查询对象
      26. ISpatialFilter spatialFilter = new SpatialFilter();
      27. //空间查询对象为点选的的几何对象
      28. spatialFilter.Geometry = pFeature.Shape;
      29. //设置空间查询关系为 空间临接查询
      30. spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelTouches;
      31. //遍历axMapControl1中的所有图层
      32. for (int i = 0; i < axMapControl1.LayerCount; i++)
      33. {
      34. //清空地图选择集
      35. axMapControl1.ActiveView.FocusMap.ClearSelection();
      36. //判断当前图层是否为矢量图层
      37. if (axMapControl1.get_Layer(i) is IFeatureLayer)
      38. {
      39. //将图层强制转换为IFeatureLayer
      40. IFeatureLayer pFeatureLayer = axMapControl1.get_Layer(i) as IFeatureLayer;
      41. //输入目标图层,并转换为IFeatureSelection对象
      42. IFeatureSelection featureSelection = pFeatureLayer as IFeatureSelection;
      43. //开始空间查询,查询到的结果保存在ISelectionSet中,可以用游标Cursor来遍历要素
      44. featureSelection.SelectFeatures((IQueryFilter)spatialFilter, esriSelectionResultEnum.esriSelectionResultNew, false);
      45. }
      46. }
      47. break;
      48. }
      49. }
      50. catch (Exception ex)
      51. {
      52. MessageBox.Show("程序执行失败!"+ex);
      53. }
      54. }
      55. #endregion

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

  • 相关阅读:
    基于TF-IDF与逻辑回归模型实现文本实体关系抽取
    腾讯mini项目-【指标监控服务重构】2023-07-22
    nodejs 异步架构
    前端入门学习笔记五十一
    87-分布式前端微信操作
    SpringCloud无介绍快使用,gateway的基本使用(十六)
    JVM监控工具jstat使用介绍
    参数调整F-score折线图
    UI设计开发原则
    pytest接口自动化测试框架搭建的全过程
  • 原文地址:https://blog.csdn.net/Prince999999/article/details/133140081