cql和ecql

CQL(公共查询语言)是OGC为 Catalogue Web Services specification .与基于XML的过滤器编码语言不同,cql是使用熟悉的基于文本的语法编写的。因此,它更具可读性,更适合手动创作。

然而,cql有一些局限性。例如,它不能对ID过滤器进行编码,并且它要求属性位于任何比较运算符的左侧。因此,geoserver提供了一个名为ecql的cql扩展版本。ecql消除了cql的局限性,提供了一种更灵活的语言,与sql有更强的相似性。

GeoServer支持在WMS和WFS请求以及GeoServer的SLD中同时使用CQL和ECQL dynamic symbolizers .每当文档提到cql时,也可以使用ecql语法(如果没有,请将其作为bug报告!).

本教程通过示例介绍CQL/ECQL语言。有关完整的参考,请参阅 ECQL参考 .

入门

以下示例使用 topp:states GeoServer附带的示例层。它们演示了CQL过滤器如何使用WMS工作 CQL_FILTER vendor parameter 更改WMS请求显示的数据。遵循本教程的最简单方法是为 topp:states 层。点击 选项 “地图预览”顶部的按钮,打开“高级选项”工具栏。示例过滤器可以输入到 过滤器:CQL 盒子。

../../_images/gettingStarted1.png

顶部:状态预览打开高级工具栏。

过滤器示例中使用的属性是层中包含的属性。例如,以下是科罗拉多功能的属性名称和值:

Attribute

states.6

STATE_NAME

科罗拉多州

STATE_FIPS

08

SUB_REGION

MTN公司

STATE_ABBR

CO

LAND_KM

268659.501

WATER_KM

960.364

PERSONS

3294394.0

FAMILIES

854214.0

HOUSHOLD

1282489.0

MALE

1631295.0

FEMALE

1663099.0

WORKERS

1233023.0

DRVALONE

1216639.0

CARPOOL

210274.0

PUBTRANS

46983.0

EMPLOYED

1633281.0

UNEMPLOY

99438.0

SERVICE

421079.0

MANUAL

181760.0

P_MALE

0.495

P_FEMALE

0.505

SAMP_POP

512677.0

简单比较

让我们从一个简单的例子开始。在CQL算法中,比较用纯文本表示。过滤器 PERSONS > 15000000 将选择居住人口超过1500万的州:

../../_images/more15M.png

PERSONS > 15000000

比较运算符的完整列表为: =<>>>=<<= .

要选择值的范围,可以使用BETWEEN运算符: PERSONS BETWEEN 1000000 AND 3000000

../../_images/between.png

1000000至3000000人

比较运算符也支持文本值。例如,要只选择加利福尼亚州,过滤器是 STATE_NAME = 'California' . 可以使用 LIKE 操作员。 STATE_NAME LIKE 'N%' 将提取以“N”开头的所有状态:

../../_images/startn.png

STATE_NAME LIKE 'N%'

也可以相互比较两个属性。 MALE > FEMALE 选择男性人口超过女性人口的状态(罕见情况):

../../_images/malefemale.png

MALE > FEMALE

算术表达式可以使用 +, -, *, / 操作员。过滤器 UNEMPLOY / (EMPLOYED + UNEMPLOY) > 0.07 选择失业率高于7%的所有州(记住样本数据很旧,所以不要从结果中得出任何结论!)

../../_images/employ.png

UNEMPLOY / (EMPLOYED + UNEMPLOY) > 0.07

ID和列表比较

如果我们只想提取具有特定特征ID的状态,我们可以使用 IN 不指定任何属性的运算符,如 IN ('states.1', 'states.12')

../../_images/idfilter.png

IN('状态1','状态12')

如果我们想提取名字在给定列表中的状态,我们可以使用 IN 指定属性名的运算符,如 STATE_NAME IN ('New York', 'California', 'Montana', 'Texas')

../../_images/statenames.png

STATE_NAME IN ('New York', 'California', 'Montana', 'Texas')

过滤器功能

CQL/ECQL可以使用 filter functions 在GeoServer中可用。这大大提高了CQL表达式的能力。

例如,假设我们要查找名称中包含“m”的所有州,而不考虑字母大小写。我们可以使用 strToLowerCase 要将所有状态名转换为小写,然后使用like比较: strToLowerCase(STATE_NAME) like '%m%'

../../_images/mstates.png

strToLowerCase(STATE_NAME) like '%m%'

几何滤波器

cql提供了一整套几何过滤功能。例如,您只想显示与(-90,40,-60,45)边界框相交的状态。过滤器将 BBOX(the_geom, -90, 40, -60, 45)

../../_images/bbox.png

BBOX(the_geom, -90, 40, -60, 45)

相反,您可以选择 not 使边界框与过滤器相交: DISJOINT(the_geom, POLYGON((-90 40, -90 45, -60 45, -60 40, -90 40)))

../../_images/disjoint.png

DISJOINT(the_geom, POLYGON((-90 40, -90 45, -60 45, -60 40, -90 40)))

几何谓词的完整列表是: EQUALSDISJOINTINTERSECTSTOUCHESCROSSESWITHINCONTAINSOVERLAPSRELATEDWITHINBEYOND .