geoserver 官方文档翻译(其一)----- CQL and ECQL cql_filter例子

一、引言

geoserver 中的 CQL and ECQL 以及cql_filter可以说是geoserver 中最重要的内容之一了。但是英文文档看起来头大,我这里挑几篇重点内容翻译一下,分享给各位,这是第一篇。其中对有些语句进行了优化以便我们理解。

CQL(Common Query Language,通用查询语言)是由OGC为Catalog Web Services规范创建的查询语言。 与基于XML的过滤器编码语言不同,CQL使用我们更熟悉的文本语法编写。 因此,它更具可读性和适应性。

然而,CQL存在诸多限制。 例如,它不能编码id过滤器,它在任何比较运算符的左侧必须有一个属性。 因此,GeoServer提供了一个名为ECQL的CQL扩展版本。 ECQL消除了CQL的限制,提供了一种更灵活的语言,与SQL具有更强的相似性。

GeoServer支持在WMS和WFS请求中使用CQL和ECQL,也可以在GeoServer的SLD动态符号化器中使用。 若文档可以引用CQL时,它也就可以使用ECQL语法(如果不可以,请将其作为bug上报给我们!)。

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

二、开始

以下示例使用GeoServer附带的topp:states示例层。 它们通过使用WMS CQL_FILTER供应商参数来更改WMS请求显示的数据,来演示CQL过滤器的工作方式。 跟着本教程做的最简单方法是打开geoserver左侧Layer Preview,在右边列表中点击topp:states图层的Openlayers预览。 单击地图预览顶部的“...”按钮以打开高级选项工具栏。 可以在Filter:CQL框中输入示例过滤器。

 

                                                 高级菜单打开的topp:states 预览

 

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

Attribute

states.6

STATE_NAME

Colorado

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运算符:BETWEEN 1000000 AND 3000000:

PERSONS BETWEEN 1000000 AND 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 (‘states.1’, ‘states.12’)

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

STATE_NAME IN (‘New York’, ‘California’, ‘Montana’, ‘Texas’)

五、Filter functions(过滤函数)

CQL / ECQL可以使用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)

相反,您可以使用过滤器选择不与边界框相交的状态: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。

 

翻译不易,转载请注明来源。

猜你喜欢

转载自blog.csdn.net/chaoyang89111/article/details/89490396
今日推荐