申报要素查询查询要素
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
申报要素查询:查询要素
疯狂代码 / ĵ:http://BlogDigest/Article75704.html
使用过关系数据库的人一般都非常熟悉SQL语句,它使用Select语句对数据库进行查询,Select语句可以发分为两大类:非聚合类查询语句和聚合类查询语句。上面例子中的第一条SELECT语句是一条非聚合类查询语句,用于选择“成绩表”中“学号>= 100 and 学号 =< 200”的数据,返回的每条记录中包含属性“学号”、“姓名”和计算属性“成绩”,查询结果按照“学号”升序排序,可以看到非聚合类查询语句包含了如下几部分:l ; 属性列表,例如:属性“学号”、“姓名”和计算属性“成绩”。l ; From子句,用于指定表的名称,例如:“成绩表”。l ; WHERE子句,用于指定过滤器,例如:“学号>= 100 and 学号 =< 200”l ; ORDER BY字句,用于排序规则:例如:“学号 ASC”。上面例子中的第二条SELECT语句是一条聚合类查询语句,用于计算每个班级的期中平均成绩和期末平均成绩,与非聚合类查询语句比较,它包含如下的额外成分:l ; 聚合函数,例如:“AVG(期中成绩)”。l ; GROUP BY子句,用于指定分组规则,例如:“GROUP BY 班级”。与SELECT语句类似,要素服务也提供了非聚合类查询和聚合类查询方法,调用方法MgFeatureService::SelectFeatures(…)或MgFeatureService::SelectAggregate(…)可以从要素源中选择符合查询条件的要素,它们的方法签名如下所示,其中参数resource用于指定一个要素源,参数className用于指定一个要素类的名称或一个Join的名称,它类似于SELECT语句的FROM子句;参数options用于指定查询条件,可以指定返回的属性、过滤器、排序规则,添加计算属性;参数coordinateSystem用于指定返回要素的空间参考系,这意味着如果要素源的空间参考系和coordinateSystem指定的空间参考系不一致,那么会对要素进行坐标转换。方法SelectFeatures(…)和SelectAggregate(…)主要的区别是:l ; SelectAggregate(…)用于执行聚集类查询,它支持分组(GroupBy)和唯一(Distinct)操作,而SelectFeatures(…)用于执行非聚合类查询。l ; SelectAggregate(…)的返回值是类MgDataReader的对象实例一个的实例,而SelectFeatures(…) 的返回值是一个MgFeatureReader的实例,关于MgFeatureReader和MgDataReader的不同之处请参考下一小节。
1.1.1.1 ; 属性列表在执行查询的时候,不仅可以通过MgQueryOptions::AddFeatureProperty(…)选择一个或多个已经存在的属性,而且还可以新建一些计算属性,计算属性由已经存在的属性计算得到,例如一个要素类中包含了两个Int32类型的属性“PropA”和“PropB”,我们可以创建一个计算属性“PropA+PropB”,它的值等于这两个属性的和,使用方法MgQueryOptions::AddComputedProperty(…)可以创建这样一个计算属性,其中参数aliasName用于为计算属性指定一个名称,expression用于指定计算属性的计算公式,即一个表达式。如下的代码展示了如何创建一个计算属性。上面代码的功能类似于如下的SQL语句。1.1.1.2 ; 过滤器过滤器用于选择要素源中的部分要素,例如定义一个过滤器选择要素类Road中与某一条道路相交的其它道路,方法SelectFeatures(…)和SelectAggregate(…)都支持使用过滤器选择符合查询条件的要素,在创建类MgDeleteFeatures、MgLockFeatures、MgUnlockFeatures和MgUpdateFeatures的实例时,也需要传入一个过滤器。当执行相应的FDO命令时,会针对每个要素评估过滤器,只有评估结果为真的要素才会被FDO命令所影响。MapGuide使用字符串来表示一个过滤器,它的语法有点类似于SQL语句的WHERE子句,但是SQL 语句针对的是表和列,而MapGuide过滤器针对的是要素类和属性,表8-3列出了一些过滤器以及它们的含义。;表8-3 MapGuide过滤器示例 ;过滤器可以分为两种:基本过滤器和空间过滤器,这两种过滤器可以独立使用,也可以组合使用。1) ; 基本过滤器基本过滤条件使用非几何属性、数据值和操作符来创建一个过滤字符串
,这个字符串通常作为方法MgFeatureQueryOption::SetFilter(…)或
MgFeatureAggregateOptions::SetFilter(…)的参数。假设“FEATID”是一个属性名称,那么“FEATID>20
”定义了一个过滤条件选择所有“FEATID”属性大于20的要素。2) ; 空间过滤器空间过滤器使用一个关联与两个几何图形的空间操作符定义一个过滤条件,它通常作为MgFeatureQueryOption::SetSpatialFilter(…) 或MgFeatureAggregateOptions::SetSpatialFilter(…)方法的参数。该方法的原型如下所示,参数geometryProperty用于指定要素类中几何属性的名称,geometry用于指定一个几何对象,参数spatialOperation用于指定一个空间操作符。假设操作符是MgFeatureSpatialOperations::Within,几何对象的WKT表示为POLYGON((0 0, 2 0, 2 2, 0 2, 0 0)),那么此过滤条件的效果是选择在多边形内部的所有要素。类MgFeatureSpatialOperations定义了MapGudie支持的空间操作符,它们的含义请参考空间关系。l ; MgFeatureSpatialOperations::Containsl ; MgFeatureSpatialOperations::CoveredByl ; MgFeatureSpatialOperations::Crossesl ; MgFeatureSpatialOperations::Disjointl ; MgFeatureSpatialOperations::EnvelopeIntersectsl ; MgFeatureSpatialOperations::Equalsl ; MgFeatureSpatialOperations::Insidel ; MgFeatureSpatialOperations::Intersectsl ; MgFeatureSpatialOperations::Overlapsl ; MgFeatureSpatialOperations::Touchesl ; MgFeatureSpatialOperations::Within3) ; 组合过滤器通过调用方法
MgFeatureQueryOption::SetBinaryOperator(…)可以使用逻辑操作符AND或OR将基本过滤器和空间过滤器组合在一起,参数andOr的值为TRUE表示使用AND逻辑操作符,FALSE表示使用OR逻辑操作符,该方法只有在基本过滤器和空间过滤器设置的情况下才会发挥作用。如果设置了基本过滤器和空间过滤器,却没有调用此方法,那么使用AND操作符组合基本过滤器和空间过滤器。过滤器的BNF语法如下所示,从中可以看到表达式是过滤器的重要组成部分,表达式支持的数据类型如表8-4所示,可以使用部分函数如表8-5所示。 ;表8-4 表达式支持的数据类型 ;表8-5 表达式中可以使用的部分函数 ;表达式中的一些函数可以使用单个要素的属性值作为参数,返回一个和此属性值相关的值,例如ceil、floor、concat和upper等,这些函数可以使用于非聚合类和聚合类查询;一些函数可以将多个要素的属性值作为参数,返回一个和一组属性值相关的值,例如avg、count 、max、min、stddev和sum等,这些函数只能使用于聚合类查询。下面是一些表达式的例子,以及如何使用这些表达式进行查询。1) ;
(