查询要素

使用过关系数据库的人一般都非常熟悉SQL语句,它使用Select语句对数据库进行查询,Select语句可以发分为两大类:非聚合类查询语句和聚合类查询语句。

SELECT 学号, 姓名, 期中成绩*0.4 + 期末成绩*0.6 as 成绩 FROM 成绩表

WHERE 学号>= 100 AND 学号 =< 200 order by学号 ASC

SELECT AVG(期中成绩) as期中平均成绩, AVG(期末成绩) as期末平均成绩

GROUP BY 班级

上面例子中的第一条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指定的空间参考系不一致,那么会对要素进行坐标转换。

MgFeatureReader SelectFeatures(

MgResourceIdentifier resource,

string className,

MgFeatureQueryOptions options);

MgFeatureReader SelectFeatures(

MgResourceIdentifier resource,

string className,

MgFeatureQueryOptions options,

string coordinateSystem);

MgDataReader SelectAggregate(

MgResourceIdentifier resource,

string className,

MgFeatureAggregateOptions options);

方法SelectFeatures(…)SelectAggregate(…)主要的区别是:

l SelectAggregate(…)用于执行聚集类查询,它支持分组(GroupBy)和唯一(Distinct)操作,而SelectFeatures(…)用于执行非聚合类查询。

l SelectAggregate(…)的返回值是类MgDataReader的对象实例一个的实例,而SelectFeatures(…) 的返回值是一个MgFeatureReader的实例,关于MgFeatureReaderMgDataReader的不同之处请参考下一小节。

1.1.1.1 属性列表

在执行查询的时候,不仅可以通过MgQueryOptions::AddFeatureProperty(…)选择一个或多个已经存在的属性,而且还可以新建一些计算属性,计算属性由已经存在的属性计算得到,例如一个要素类中包含了两个Int32类型的属性“PropA”和“PropB”,我们可以创建一个计算属性“PropA+PropB”,它的值等于这两个属性的和,使用方法MgQueryOptions::AddComputedProperty(…)可以创建这样一个计算属性,其中参数aliasName用于为计算属性指定一个名称,expression用于指定计算属性的计算公式,即一个表达式。

int AddFeatureProperty(string propertyName);

int AddComputedProperty(string aliasName, string expression);

如下的代码展示了如何创建一个计算属性。

$queryOptions = new MgFeatureQueryOptions();

$queryOptions->AddFeatureProperty("FeatId");

$queryOptions->AddFeatureProperty("aDouble");

$queryOptions->AddComputedProperty("ceilADouble", "Ceil(aDouble)");

$featureReader = featureService.SelectFeatures($resourceId, $featClassName, $queryOptions);

上面代码的功能类似于如下的SQL语句。

select FeatId, aDouble, Ceil(aDouble) as ceilADouble from featclass

1.1.1.2 过滤器

过滤器用于选择要素源中的部分要素,例如定义一个过滤器选择要素类Road中与某一条道路相交的其它道路,方法SelectFeatures(…)SelectAggregate(…)都支持使用过滤器选择符合查询条件的要素,在创建类MgDeleteFeaturesMgLockFeaturesMgUnlockFeaturesMgUpdateFeatures的实例时,也需要传入一个过滤器。当执行相应的FDO命令时,会针对每个要素评估过滤器,只有评估结果为真的要素才会被FDO命令所影响。

MapGuide使用字符串来表示一个过滤器,它的语法有点类似于SQL语句的WHERE子句,但是SQL语句针对的是表和列,而MapGuide过滤器针对的是要素类和属性,表8-3列出了一些过滤器以及它们的含义。

过滤器

描述

Lanes >= 4

选择小路(Lanes)数目大于等于4的道路(Road)

Pines.state = "proposed"

选择管道网络(PipeNetworks)中管道状态为“proposed”的所有管道(Pipe)

state = "existing" and owner like "%Smith%"

选择状态为“existing”,并且所有人包含文字“Smith”的所有地块(Parcels)

state in ("affected", "encroached")

选择状态为“affected”或“encroached”的地块(Parcels)

8-3 MapGuide过滤器示例

过滤器可以分为两种:基本过滤器和空间过滤器,这两种过滤器可以独立使用,也可以组合使用。

1) 基本过滤器

基本过滤条件使用非几何属性、数据值和操作符来创建一个过滤字符串,这个字符串通常作为方法MgFeatureQueryOption::SetFilter(…)MgFeatureAggregateOptions::SetFilter(…)的参数。假设“FEATID”是一个属性名称,那么“FEATID>20”定义了一个过滤条件选择所有“FEATID”属性大于20的要素。

void SetFilter(string filterText);

2) 空间过滤器

空间过滤器使用一个关联与两个几何图形的空间操作符定义一个过滤条件,它通常作为MgFeatureQueryOption::SetSpatialFilter(…) MgFeatureAggregateOptions::SetSpatialFilter(…)方法的参数。该方法的原型如下所示,参数geometryProperty用于指定要素类中几何属性的名称,geometry用于指定一个几何对象,参数spatialOperation用于指定一个空间操作符。假设操作符是MgFeatureSpatialOperations::Within,几何对象的WKT表示为POLYGON((0 0, 2 0, 2 2, 0 2, 0 0)),那么此过滤条件的效果是选择在多边形内部的所有要素。

void SetSpatialFilter(string geometryProperty,

MgGeometry geometry,

int spatialOperation);

MgFeatureSpatialOperations定义了MapGudie支持的空间操作符,它们的含义请参考空间关系。

l MgFeatureSpatialOperations::Contains

l MgFeatureSpatialOperations::CoveredBy

l MgFeatureSpatialOperations::Crosses

l MgFeatureSpatialOperations::Disjoint

l MgFeatureSpatialOperations::EnvelopeIntersects

l MgFeatureSpatialOperations::Equals

l MgFeatureSpatialOperations::Inside

l MgFeatureSpatialOperations::Intersects

l MgFeatureSpatialOperations::Overlaps

l MgFeatureSpatialOperations::Touches

l MgFeatureSpatialOperations::Within

3) 组合过滤器

通过调用方法MgFeatureQueryOption::SetBinaryOperator(…)可以使用逻辑操作符ANDOR将基本过滤器和空间过滤器组合在一起,参数andOr的值为TRUE表示使用AND逻辑操作符,FALSE表示使用OR逻辑操作符,该方法只有在基本过滤器和空间过滤器设置的情况下才会发挥作用。如果设置了基本过滤器和空间过滤器,却没有调用此方法,那么使用AND操作符组合基本过滤器和空间过滤器。

void SetBinaryOperator(bool andOr);

过滤器的BNF语法如下所示,从中可以看到表达式是过滤器的重要组成部分,表达式支持的数据类型如表8-4所示,可以使用部分函数如表8-5所示。

<Filter> ::= '(' Filter ')'

| <LogicalOperator>

| <SearchCondition>

<LogicalOperator> ::= <BinaryLogicalOperator>

| <UnaryLogicalOperator>

<BinaryLogicalOperator> ::=

<Filter> <BinaryLogicalOperations> <Filter>

<SearchCondition> ::= <InCondition>

| <ComparisonCondition>

| <GeometricCondition>

| <NullCondition>

<InCondition> ::= <Identifier> IN '(' ValueExpressionCollection')'

<ValueExpressionCollection> ::= <ValueExpression>

| <ValueExpressionCollection> ',' <ValueExpression>

<ComparisonCondition> ::=

<Expression> <ComparisonOperations> <Expression>

<GeometricCondition> ::= <DistanceCondition>

| <SpatialCondition>

<DistanceCondition> ::=

<Identifier> <DistanceOperations> <Expression> <distance>

<NullCondition> ::= <Identifier> NULL

<SpatialCondition> ::=

<Identifier> <SpatialOperations> <Expression>

<UnaryLogicalOperator> ::= NOT <Filter>

<BinaryLogicalOperations> ::= AND | OR

<ComparisionOperations> ::=

= // EqualTo (EQ)

<> // NotEqualTo (NE)

> // GreaterThan (GT)

>= // GreaterThanOrEqualTo (GE)

< // LessThan (LT)

<= // LessThanOrEqualTo (LE)

LIKE // Like

<DistanceOperations> ::= BEYOND | WITHINDISTANCE

<distance> ::= DOUBLE | INTEGER

<SpatialOperations> ::= CONTAINS | CROSSES | DISJOINT

| EQUALS | INTERSECTS | OVERLAPS | TOUCHES | WITHIN | COVEREDBY | INSIDE

<Expression> ::= '(' Expression ')'

| <UnaryExpression>

| <BinaryExpression>

| <Function>

| <Identifier>

| <ValueExpression>

<BinaryExpression> ::=

<Expression> '+' <Expression>

| <Expression> '-' <Expression>

| <Expression> '*' <Expression>

| <Expression> '/' <Expression>

<DataValue> ::=

TRUE

| FALSE

| DATETIME

| DOUBLE

| INTEGER

| STRING

| BLOB

| CLOB

| NULL

<Function> ::= <Identifier> '(' <ExpressionCollection> ')'

<ExpressionCollection> ::=

| <Expression>

| <ExpressionCollection> ',' <Expression>

<GeometryValue> ::= GEOMFROMTEXT '(' STRING ')'

<Identifier> ::= IDENTIFIER

<ValueExpression> ::= <LiteralValue> | <Parameter>;

<LiteralValue> ::= <GeometryValue> | <DataValue>

<Parameter> ::= PARAMETER | ':'STRING

<UnaryExpression> ::= '-' <Expression>

数据类型

描述

String

字符串由单引号括起来,例如’test’,如果需要在字符串中包括单引号,那么使用两个连续的单引号表示一个单引号,例如’aaa’’bbb’

Identifier

标识符是使用双引号括起来的、不等于关键词的字符和数字序列,例如”abc”, 如果需要在标识符中包括双引号,那么使用两个连续的双引号表示一个双引号,例如”aaa””bbb”

Integer

整数是一个十进制数字,它可以使用负号,但不支持正号,如果数字超过了32-bit的精度范围,那么这个数字会被转换为浮点数。

Double

浮点数是一个包含小数点的数字,它可以使用负号,还可以包含指数(e{{[0-9]})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值