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 盒子。

顶部:状态预览打开高级工具栏。¶
过滤器示例中使用的属性是层中包含的属性。例如,以下是科罗拉多功能的属性名称和值:
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万的州:

PERSONS > 15000000¶
比较运算符的完整列表为: =
, <>
, >
, >=
, <
, <=
.
要选择值的范围,可以使用BETWEEN运算符: PERSONS BETWEEN 1000000 AND 3000000
:

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

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

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

UNEMPLOY / (EMPLOYED + UNEMPLOY) > 0.07¶
ID和列表比较¶
如果我们只想提取具有特定特征ID的状态,我们可以使用 IN
不指定任何属性的运算符,如 IN ('states.1', 'states.12')
:

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

STATE_NAME IN ('New York', 'California', 'Montana', 'Texas')¶
过滤器功能¶
CQL/ECQL可以使用 filter functions 在GeoServer中可用。这大大提高了CQL表达式的能力。
例如,假设我们要查找名称中包含“m”的所有州,而不考虑字母大小写。我们可以使用 strToLowerCase
要将所有状态名转换为小写,然后使用like比较: strToLowerCase(STATE_NAME) like '%m%'
:

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

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

DISJOINT(the_geom, POLYGON((-90 40, -90 45, -60 45, -60 40, -90 40)))¶
几何谓词的完整列表是: EQUALS
, DISJOINT
, INTERSECTS
, TOUCHES
, CROSSES
, WITHIN
, CONTAINS
, OVERLAPS
, RELATE
, DWITHIN
, BEYOND
.