• ArcEngine 9.3 学习笔记(八):地图查询(Cursor对象,QueryFilter对象 和 SpatialFilter对象,SelectionSet要素选择集对象)


    5 地图查询

      地图查询、统计是GIS系统的基本功能模块,实际上统计功能的前提也是通过查询获取结果,以文字或者图表等报表的形式展现查询结果数据。

      地图查询有两种类型的查询:
      1. 空间查询:在地图上设置一定范围,查询这一范围内的要素。
        例如:在地图上画一范围,查询这一区域内所有消防栓,这一范围的所有消防栓高亮显示(或其他显示方式),并展现出所有消防栓的属性信息
      2. 属性查询:通过一定的查询条件,获取目标要素。
        例如:我们需要查询中国行政区上人口大于5000万,同时GDP大于1万亿的省份,通过执行查询,符合条件的省份高亮显示,并展现出这些省份的属性信息。

      AE 为开发者提供了无需写代码即可进行查询功能的Identify公交,但是这个工具是一个通用的信息查询工具
      开发者需要定制出自己需要的查询功能模块。

      5.1 目标:
        1、熟悉Cursor,FeatureCursor对象,使用IFeatureCursor接口;
        2、熟悉QueryFilter,SpatialFilter对象,使用IQueryFilter,ISpatialFilter接口
        3、熟悉要素选择集SelectionSet对象,会使用IfeatureSelection,ISelectionSet接口
        4、开发一个属性查询小功能Demo,获取符合查询条件的Feature,并用IFeatureLayerDefinition接口创建一个新的要素图层加载到MapControl上
        5、开发一个空间多边形查询功能的demo,学会创建内存半透明图层用于显示选择范围。

      5.3 Cursor对象

      Cursor对象,本质上是一个指向数据的指针,本身不包含数据内容,他是连接到Row对象或要素对象的桥梁;
      游标有三种类型:查询游标、插入游标、更新游标;每种游标通过对应方法获得,如Search(),Insert(),Update();
      更新和插入游标都需要是使用一个过滤器(Filter)对象,因为它们首先必须获取要进行操作的要素;

      Cursor对象支持的接口是ICursor,它定义了操作一个Row几何或一个Row对象的属性和方法;
      1)使用IFeatureClass的Insert方法,返回一个插入型游标,它通常用于往表中插入一条记录:
        pCursor=IFeatureCLass.Insert();
      2)使用Update方法,返回 一个更新型游标,他勇于更新或者删除一条记录:
        pCursor=IFeatureCLass.Update();
      3)使用Search方法对表进行查询后,可以得到一个查询型Cursor对象,它指向一个或多个Row对象:
        pCursor=IFeatureCLass.Search();

      本章主要内容是使用查询游标
      FeatureCursor是Cursor的一个子类,指向一个或多个要素,它实行了IFeatureCursor接口,

      AE开发 所针对矢量图层实现的查询功能都是实现IFeatureCursor。

    5.4 QueryFilter对象 SpatialFilter对象
      在关系型数据库中,查询条件是通过SQL语句的Where子句完成的,
      在AE中不能直接使用SQL语句,但AE提供了QueryFilter和SpatialFilter两个过滤器对象,来配合完成查询条件的设置,从而查询到想要的数据。

      QueryFilter过滤器 主要用于对属性数据查询条件的设置,它主要实现IQueryFilter接口,从而实现属性查询功能

    1   IQueryFilter pQueryFilter = new QueryFilterClass();
    2   // 设置过滤器对象的属性
    3   pQueryFilter.WhereClasue="人口>1000000";

      SpatialFilter过滤器主要用于空间范围查询条件的设置,它主要实现ISpatialFilter( 继承IQueryFilter接口) 接口,从而实现空间查询功能。

    1   ISpatialFilter pSpatialFilter = new SpatialFilterClass();
    2   // 设置空间过滤器的范围(多边形)
    3   pSpatialFilter.Geomerty=pGeometry;
    4   // 设置空间过滤器空间关系类型
    5   pSpatialFilter.SpatialRel= esriSpatialRelEnum.esriSpatialRelContains;

      空间过滤器的空间关系类型主要有以下几种:
        esriSpatialRelUndefined  未定义;esriSpatialRelIntersects  A与B图形相交
        esriSpatialRelEnvelopeIntersects A的Envelope和B的Envelope相交
        esriSpatialRelIndexIntersects  A与B 索引相交
        esriSpatialRelTouches A与B 边界相接
        esriSpatialRelOverlaps A 与B 相叠加
        esriSpatialRelCrosses A与B 相交(两条线相较于一点,一条线和一个面相交)(与其说相交,不如说空间上穿过)
        esriSpatialRelWithin A在B内
        esriSpatialRelContains  A 包含B
        esriSpatialRelRelation  A 与 B 空间关联

    5.5 SelectionSet要素选择集对象
      在AG中,当在ArcMap中显示查询结果是,所有满足条件的要素 都以蓝色高亮的形式显示在地图控件上
      这些高亮显示选中的要素对应一个要素选择集对象中,通过IFeatureSelection的SelectionSet属性可以获取选择集
      FeatureLayer对象实现了IFeatureSelection接口.

      IFeatureSelction接口演示:

     1         public void IFeatureSelectionTest(AxMapControl axMapControl)
     2         {
     3             IFeatureLayer pFeatureLayer = axMapControl.get_Layer(0) as IFeatureLayer;
     4             // QI至IFeatureSelection
     5             IFeatureSelection pFeatureSelection = pFeatureLayer as IFeatureSelection;
     6             // 创建过滤器
     7             IQueryFilter pQueryFIlter = new QueryFilterClass();
     8             // 设置过滤器对象的查询条件
     9             pQueryFIlter.WhereClause = "人口>1000000";
    10             // 从选择集中过滤要素
    11             pFeatureSelection.SelectFeatures(pQueryFIlter, esriSelectionResultEnum.esriSelectionResultNew, false);
    12             // 获取选中集对象
    13             ISelectionSet pSelectionSet = pFeatureSelection.SelectionSet;
    14             // 设置选择集的符号
    15             //pFeatureSelection.SelectionSymbol = pSymbol;
    16         }
    View Code

    下一篇,将用两个实例演示如何对图层进行查询操作(属性查询、空间查询)。

  • 相关阅读:
    Django框架之虚拟环境搭建
    Ubantu16.04系统优化
    关于装双系统Ubantu16.04+Win10引导问题
    网络编程相关
    数据库常用语句
    javascript异步编程的六种方式
    关于 CSS 的一些小 tips
    typeof 返回的数据类型 及 javascript数据类型中的一些小知识点
    JavaScript || 和 && 的总结
    正则表达式
  • 原文地址:https://www.cnblogs.com/cloud915/p/3116292.html
Copyright © 2020-2023  润新知