360a安全卫士-360安全路由

mapguide
2023年4月6日发(作者:矮人dos工具箱下载)

申报要素查询:查询要素

疯狂代码/ĵ:http://BlogDigest/

使用过关系数据库的人一般都非常熟悉SQL语句,它使用Select语句对数据库进行查询,Select语句可以

发分为两大类:非聚合类查询语句和聚合类查询语句。上面例子中的第一条SELECT语句是一条非聚合类查询语

句,用于选择“成绩表”中“学号>=100and学号=<200”的数据,返回的每条记录中包含属性“学号

”、“姓名”和计算属性“成绩”,查询结果按照“学号”升序排序,可以看到非聚合类查询语句包含了如下

几部分:l;属性列表,例如:属性“学号”、“姓名”和计算属性“成绩”。l;From子句,用于指定表的名称

,例如:“成绩表”。l;WHERE子句,用于指定过滤器,例如:“学号>=100and学号=<200”l;

ORDERBY字句,用于排序规则:例如:“学号ASC”。上面例子中的第二条SELECT语句是一条聚合类查询语

句,用于计算每个班级的期中平均成绩和期末平均成绩,与非聚合类查询语句比较,它包含如下的额外成分:l

;聚合函数,例如:“AVG(期中成绩)”。l;GROUPBY子句,用于指定分组规则,例如:“GROUPBY班级

”。与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-3MapGuide过滤器示例;过滤器可以分为两种:基本过滤器和空间过滤器,这两种过滤器可以独立使用

,也可以组合使用。1);基本过滤器基本过滤条件使用非几何属性、数据值和操作符来创建一个过滤字符串

,这个字符串通常作为方法MgFeatureQueryOption::SetFilter(…)或

MgFeatureAggregateOptions::SetFilter(…)的参数。假设“FEATID”是一个属性名称,那么“FEATID>20

”定义了一个过滤条件选择所有“FEATID”属性大于20的要素。2);空间过滤器空间过滤器使用一个关联与

两个几何图形的空间操作符定义一个过滤条件,它通常作为MgFeatureQueryOption::SetSpatialFilter(…)或

MgFeatureAggregateOptions::SetSpatialFilter(…)方法的参数。该方法的原型如下所示,参数

geometryProperty用于指定要素类中几何属性的名称,geometry用于指定一个几何对象,参数

spatialOperation用于指定一个空间操作符。假设操作符是MgFeatureSpatialOperations::Within,几何对象

的WKT表示为POLYGON((00,20,22,02,00)),那么此过滤条件的效果是选择在多边形内部的所有要素。

类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);NULL给定一个字符串类型的属性Name,如果它的属性允许为NULL

,并且在插入一个要素时没有指定此属性的值,那么这个要素Name属性的值为NULL。通过应用过滤条件“

NameNULL”,可以选择所有Name属性值为NULL的所有要素。通过应用过滤条件“NOTNameNULL

”,可以选择所有Name属性值不为NULL的所有要素。2);LIKELike可以用于实现模

糊查询,给定一个字符串模式(Patern),可以使用Like查找所有符合指定模式的要素。其中,百分号“%”用于

匹配0个或多个字符,下划线“_”用于匹配单个字符。假设Description是一个字符串类型的属性,数据源中有

两个包含了此属性的要素,这两个属性的值为“PointData”和“PolygonData”,过滤条件“Description

LIKE'Polygon'”返回“PolygonData”,过滤条件“NOTDescriptionLIKE'Polygon'”返回“PointData

”,过滤条件“DescriptionLIKE'Pol_gon'”返回“PolygonData”。3);IN

()IN操作符用于选择与列表中的任意一个值匹配的要素,给定一个Int16类型的

属性Id,过滤条件“IdIN(-5995,-7033)”选择Id属性值等于-5995或-7033的要素。1.1.1.3;排序调用

MgQueryOptions::SetOrderingFilter(…)可以将查询结果进行排序,该方法的签名如下所示,参数

orderByProperties是一个属性名称的集合,用于指定排序的属性,如果指定了多个属性,那么优先使用

orderByProperties中序号较小的属性,只有在序号较小的属性具有相同的值时,才使用序号较大的属性;参数

orderOption用于指定是以升序的方式还是降序的方式进行排序,它的值可以为

MgOrderingOption::Ascending或MgOrderingOption::Descending,分别用于表示升序和降序。1.1.1.4;

分组调用MgFeatureAggregateOptions::SetGroupingFilter(…)可以将查询结果进行分组,该方法的签名如下

所示,参数groupByProperties是一个属性名称的集合,用于指定分组的属性,如果指定了多个属性,那么优

先使用orderByProperties中序号较小的属性,只有在序号较小的属性具有相同的值时,才使用序号较大的属性

;参数groupFilter用于指定分组的过滤器。如下的代码展示了如何使用分组创建一个聚合类查询。上面代码的

功能类似于如下的SQL语句。1.1.1.5;MgDataReader、MgFeatureReader和MgSqlDataReaderMapGuide

支持三种类型的读取器,它们分别为MgDataReader、MgSqlDataReader和MgFeatureReader,读取器的类

型由类MgReaderType定义。l;MgReaderType::DataReaderl;MgReaderType::FeatureReaderl;

MgReaderType::SqlDataReader类MgDataReader、MgSqlDataReader和MgFeatureReader都继承自

MgReader,都是一个用于读取查询结果的前向只读迭代器(Forward-Only,Read-OnlyIterator),读取器的初

始位置总是位于第一个数据之前,在读取数据之前必须调用方法ReadNext(…),在调用ReadNext(…)之后就无

法读取读取器当前位置之前的数据。它们之间的主要不同点是,MgFeatureReader包含了一个方法

MgFeatureReader::GetClassDefinition(),通过该方法的返回值可以得到查询结果的类定义(ClassDefinition)

,通过类定义得到每个属性的定义、主键等信息,而MgDataReader和MgSqlDataReader仅仅可以通过方法

MgReader::GetPropertyType(…)得到属性的类型。如下的代码展示了将一个MgFeatureReader实例中的所有

要素输出到一个文件中。需要注意的是,在使用读取器读取完数据后要尽量马上调用方法MgReader::Close()

关闭读取器。为什么呢?为了提高MapGuide服务器的响应速度,MapGuide服务器使用了连接池

(ConnectionPool)的方式缓存了要素源FDO连接,即FdoIConnection实例,当接收到一个要素服务请求之后

,它会首先在FDO连接池中查找是否有可用的FDO连接,如果有就使用此FDO连接执行服务请求,否则创建一

个新的FDO连接,但是如果已经超过服务器配置文件中设置的最大FDO连接数,那么此要素服务请求会失败。

当要素服务返回一个读取器之后,为了保证查询结果不会在读取数据之前消失,MapGuide服务器会将读取器

所关联的FDO连接标记为正在使用,只有在调用方法MgReader::Close()关闭读取器后才会关闭和释放此FDO

连接,如果不及时调用方法MgReader::Close()可能会导致超过最大FDO的连接数,最终无法处理要素服务请

求。2009-9-2920:55:33

疯狂代码/

更多推荐

mapguide