牟乃夏ArcGISEngine地理信息系统开发教程配套PPT---第4章查询统计目录•1.属性查询•2.空间查询•3.图形查询•4.选择集•5.查询选项设置•6.统计分析1.属性查询•属性查询即基于空间数据的属性数据,通过用户提交由SQL查询语言中where子句定义的查询条件,对属性信息进行搜索,从而得到查询结果的操作。•1)相关类与接口•QueryFilter类•QueryDef类•Cursor类•FeatureCursor类•FeatureLayer类•FeatureClass类1.属性查询•QueryFilter类•该类用于根据属性值或关系来过滤数据,它实现了IQueryFilter接口,该接口主要有以下属性和方法。•WhereClause属性•设置用来过滤数据的where条件子句。该子句使用SQL表达式来定义过滤数据的条件,可以使用运算符、通配符、函数等字符来构成where子句,具体的语法根据数据源的不同而有所不同。详细信息可以查看该属性的随机帮助页。•SubFields属性•定义用于数据过滤的属性字段列表,如果列表有多项,则每项之间用英文逗号隔开。其默认值为“*”,意味着返回结果中将包含所有字段,否则可以自定义需要返回的字段。1.属性查询•QueryDef类•该类是ESRI的查询定义类,为ArcGISEngine中的Class类,不能被直接创建,可以由IFeatureWorkspace接口的CreateQueryDef方法创建。它实现了IQueryDef接口,该接口的成员用来操作基于属性的查询,主要有以下属性和方法:•(1)Tables属性•定义所查询表的名称列表,如果列表有多项,则每项之间用英文逗号隔开。•(2)WhereClause属性•该属性的用法与IQueryFilter接口中WhereClause属性的用法相同。•(3)SubFields属性•该属性的用法与IQueryFilter接口中SubFields属性的用法相同。•(4)Evaluate方法•执行所定义的查询并返回查询结果集的游标,该游标为ICursor接口类型。1.属性查询•Cursor类•该类是ESRI的游标类,为ArcGISEngine中的Class类,不能被直接创建,可以由相关接口中的方法创建。•游标接口主要包括ICursor接口和IFeatureCursor接口,IFeatureCursor接口继承于ICursor接口,ICursor接口主要用于操作数据行,IFeatureCursor接口则用来操作要素(Feature)。1.属性查询•FeatureCursor类•该类是ESRI的要素游标类,为ArcGISEngine中的Class类,不能被直接创建,同样可以由相关接口中的方法创建。它实现了IFeatureCursor接口,该接口成员的用法与ICursor接口的成员类似,区别是其操作的对象是要素。在本章中,主要使用其NextFeature方法,它将游标的位置向前移动一位,并返回该位置的要素对象。•FeatureLayer类•该类主要操作要素的集合及要素的可视化表达,它实现了IFeatureLayer接口和IFeatureSelection接口。1.属性查询•1)IFeatureLayer接口•该接口的成员主要是要素图层(FeatureLayer)的各类常用属性和操作,其与查询相关的属性和方法有:•(1)Selectable属性•用于获取或设置要素图层是否可以被选择。•(2)FeatureClass属性•用于获取或设置图层的要素类(FeatureClass)。•(3)Search方法•根据设置的查询条件创建查询结果的游标。其参数包括IQueryFilter接口的查询过滤器,以及布尔型的参数来确定游标是否需要被回收。该方法的返回值为IFeatureCursor接口类型。•2)IFeatureSelection接口•该接口的成员用来控制该图层的要素选择集(FeatureSelection)。•(1)SelectFeatures方法•用于根据设置的查询条件和选择方法等来选择要素。其参数包括IQueryFilter接口的查询过滤器,esriSelectionResultEnum枚举类型的选择集生成方法,以及布尔型的参数控制是否只选择一个要素。该方法没有返回值。读者可以查看esriSelectionResultEnum枚举类型的帮助来了解ArcGIS中提供哪些选择集生成方式。•(2)SelectionSet属性•设置或获取单个矢量图层的选择集,其值为ISelectionSet接口类型。1.属性查询•FeatureClass类•实现了IFeatureClass接口,该接口的成员用于控制要素类的属性和行为,主要有如下方法:•(1)Search方法•根据查询条件进行查询并返回结果的游标,该方法的用法与IFeatureLayer接口中Search方法的用法相同。•(2)Select方法•根据查询条件选择相应的要素,并将其放置在选择集中。其参数包括IQueryFilter接口的查询过滤器,定义选择集的创建方式的参数,定义选择方式的参数,和定义执行查询的工作区(Workspace)的参数。其返回值为ISelectionSet接口类型。1.属性查询•实例介绍•本例通过点击菜单弹出属性信息查询窗体,在窗体中构造查询条件,执行查询来得到查询结果。•实例代码的实现思路为:①在实现主窗体的基础上,添加【根据属性信息查询】窗体,用于通过界面设置属性信息查询条件;②实现【根据属性信息查询】窗体的各类事件,能够完成属性查询条件的设置和执行查询操作;③在主窗体【属性查询】菜单事件中,打开【根据属性信息查询】窗体,由用户通过窗体完成属性查询操作。就实现思路中步骤(2)的实现细节而言,由IQueryFilter接口定义属性查询条件,这可以使用其WhereClause方法输入特定的where子句。执行查询操作后需要获取查询结果并对其进行后续处理,因此要得到查询结果的游标以完成对整个查询结果的遍历。这可以使用IFeatureLayer接口的Search方法,或是IFeatureClass接口中的Search方法。如果只选择要素并将其添加到选择集中,而不需要获取游标进行遍历操作,则可以使用IFeatureSelection接口中的SelectFeatures方法或IFeatureClass接口中的Select方法完成。FeatureLayer对象和FeatureClass对象的ITable接口也同样可以使用Search方法和Seclect方法。1.属性查询相关接口中查询方法使用比较表接口方法名称返回值说明IFeatureClassSearchIFeatureCursor返回查询结果集合的IFeatureCursor接口的游标。目的是为了遍历查询结果,在地图中不会显示查询结果。SelectISelectionSet返回结果为ISelectionSet接口的选择集。在地图中不会显示查询结果。IFeatureLayerSearchIFeatureCursor与IFeatureClass接口的Search方法相同IFeatureSelectionSelectFeaturesvoid无返回值。目的是根据查询条件选择要素,将在地图中高亮显示查询结果。IQueryDefEvaluateICursor根据设定的查询条件执行查询操作。返回值为ICursor接口的游标,可进行基于行的遍历。在地图中不会显示查询结果。1.属性查询•【根据属性信息查询】窗体•该窗体用于显示及设置与属性查询相关的图层、选择方式、属性字段、where语句的运算符、所选择属性字段的值、最终的where语句以及执行查询的按钮等,以实现与ArcMap中类似的属性查询功能。属性查询窗体界面2.空间查询•空间查询功能是通过用户选择的空间几何体以及该几何体与当前地图中要素之间的几何关系,进行空间查找,从而得到查询结果的操作。•相关类与接口•本节实例所使用的与空间查询相关的类主要是SpatialFilter类,其实现的接口主要为ISpatialFilter接口等。SpatialFilter类是空间关系过滤类,ISpatialFilter接口的成员主要用于返回和修改数据过滤器所使用的空间关系。ISpatialFilter接口同时包含了空间和属性两种查询约束,它继承自IQueryFilter接口。SpatialFilter类的属性和方法(1)Geometry属性设置或获取用来筛选数据的几何体,其值为IGeometry接口类型。(2)GeometryField属性获取或设置应用于查询过滤器中几何字段的名称。(3)SpatialRel属性获取或设置过滤器所要使用的空间关系,其值为esriSpatialRelEnum枚举类型,包括相交(esriSpatialRelIntersects)、覆盖(esriSpatialRelOverlaps)、跨越(esriSpatialRelCrosses)等多种空间关系。2.空间查询•实例介绍•本例通过点击菜单弹出【空间查询窗体】,在窗体中构造查询条件,执行查询得到查询结果。•实例代码的实现思路为:①在实现主窗体的基础上,添加【根据空间位置选择】窗体,用于通过界面设置空间查询条件。②实现【根据空间位置选择】窗体的各类事件,能够完成空间查询条件的设置和执行查询操作。③在主窗体【空间查询】菜单事件中,打开【根据空间位置选择】窗体,由用户通过窗体完成空间查询操作。就上述步骤(2)的实现细节而言,实例通过ISpatialFilter接口来定义空间查询条件,其Geometry属性确定用来查询的空间几何体(如本例中的所有铁路),SpatialRel属性定义查询所使用的所有空间关系,为esriSpatialRelEnum枚举类型的变量。包括:esriSpatialRelIntersects(空间相交)、esriSpatialRelTouches(空间相接—共享空间边界)、esriSpatialRelOverlaps(空间覆盖)、esriSpatialRelCrosses(空间跨越)、esriSpatialRelWithin(空间包含)、esriSpatialRelContains(空间被包含)等。因为ISpatialFilter接口继承于IQueryFilter接口,因此在定义好空间查询条件后,可以使用上一节介绍的多个使用IQueryFilter接口的查询方法进行空间查询操作。另外,在合并源图层的几何体时,使用ITopologicalOperator接口的Union方法来进行几何体合并操作,该接口是点、线、面等几何体对象所共同实现的接口。3.图形查询•图形查询是以用户通过鼠标操作生成的图形几何体(即ArcGIS中的Graphics)为输入条件进行查询的操作,其查询结果为该几何体空间范围内的所有要素。常用的查询方式包括点选、线选、多边形选择、圆形选择和矩形选择等。•相关类与接口•图形查询主要使用Map类IMap接口中的方法,此外还需用到Map类的IGraphicsContainer接口和操控图形元素(Element)中的IElement接口,本例使用IMap接口的SelectByShape方法能够根据给定的几何体和选择环境(该参数可选),在当前地图中选择要素。3.图形查询•在ArcGISEngine开发中,有三种方式可以进行图形查询。•使用ArcGISEngine自带工具进行图形查询•通过代码进行图形查询•通过鼠标操作生成图形进行图形查询3.图形查询•使用ArcGISEngine自带工具进行图形查询•在ArcGISEngine中,已经提供了基于图形查询的工具,以及绘制图形的工具(如绘制矩形工具、绘制圆形工具等),因此可以使用2.4.1节的方法添加各种工具按钮实现图形查询,3.图形查询•通过代码进行图形查询•实例代码的实现思路为:①使用IGraphicsContainer接口遍历并获取当前地图中的每个图形(Graphics),