GeoServer 查询过滤器 CQL 入门

0 阅读6分钟

^ 关注我,带你一起学GIS ^

前言

GeoServer 是一个基于Java的GIS服务器,它使用户能够查看和编辑地理空间数据。GeoServer遵循开放地理空间联盟(OGC)制定的开放标准,在地图创建和数据共享方面提供了极大的灵活性。

文中以GeoServer2.28.2为例进行讲解。

  • GeoServer 简介[1]
  • GeoServer 下载安装(完整版)[2]
  • GeoServer 集群搭建[3]

如果你还没有看过,建议从以上内容开始。

1. 软件环境

本文使用如下软件环境,以供参考,因为GeoSever的运行依赖于JDK,所以还需在服务器安装JDK并配置环境变量。

时间:2026年

系统:Windows 11

openjdk: 17.0.14

GeoServer:2.28.2

cmd窗口输入java -version命令,检查是否输出JDK版本信息。

如果没有,请先安装JDK。

2. GeoServer 语法过滤器 CQL 介绍

CQL(通用查询语言)是OGC(开放地理空间联盟)为 Catalogue Web Services(目录网络服务)规范创建的一种查询语言。与基于XML的过滤编码语言不同,CQL采用熟悉的基于文本的语法编写。因此,它更具可读性,更适合手动编写。

然而,CQL存在一些局限性。例如,它无法对id过滤器进行编码,并且要求任何比较运算符的左侧都必须有一个属性。出于这个原因,GeoServer提供了一个名为ECQL的CQL扩展版本。

ECQL消除了CQL的局限性,提供了一种更灵活的语言书写方式,与SQL的相似性更强。

GeoServer支持在WMS和WFS请求以及GeoServer的SLD(动态符号化器)中使用CQL和ECQL。当文档中提到CQL时,也可以使用ECQL语法。

3. GeoServer 语法过滤器 CQL 使用

在以下例子中采用topp:statesGeoServer示例图层进行演示。

下面将通过使用WMS的CQL_FILTER过滤参数来更改WMS请求所显示的数据,从而演示CQL过滤器的工作原理。

跟随本教程最简单的方法是打开GeoServer图层预览,选择topp:states图层。

也可以直接在图层预览上方的搜索框中输入图层名称states进行查找。

选择OpenLayers预览方式打开图层。

示例图层显示如下。

点击地图预览顶部的**Options**按钮,打开高级选项工具栏。

示例过滤器可以在“Filter: CQL”框中输入。

在过滤器示例中使用的是包含在图层中的属性。例如,以下是Colorado要素的属性名称和值:

属性名称属性值
STATE_NAMEColorado
STATE_FIPS08
SUB_REGIONMtn
STATE_ABBRCO
LAND_KM268659.501
WATER_KM960.364
PERSONS3294394.0
FAMILIES854214.0
HOUSHOLD1282489.0
MALE1631295.0
FEMALE1663099.0
WORKERS1233023.0
DRVALONE1216639.0
CARPOOL210274.0
PUBTRANS46983.0
EMPLOYED1633281.0
UNEMPLOY99438.0
SERVICE421079.0
MANUAL181760.0
P_MALE0.495
P_FEMALE0.505
SAMP_POP512677.0

3.1. 简单比较

现在从一个简单的例子开始。在CQL语法中,算术运算和比较操作都是用纯文本表示的。筛选条件PERSONS > 15000000将选择人口超过1500万的州:

为了选择一个范围值可以使用操作符BETWEEN ANDPERSONS BETWEEN 1000000 AND 3000000:

比较运算符也支持文本值,如想要筛选加利福尼亚州,则筛选条件为STATE_NAME='California';而更通用的操作是使用LIKE运算符,条件STATE_NAME LIKE 'N%'将会筛选所有以“N”字母开头的州。

也可以对两个属性进行相互比较。MALE > FEMALE(男性 > 女性)选择男性人口超过女性人口的州(这种情况很少见):

算术表达式可以使用+、-、*、/运算符进行计算。筛选条件UNEMPLOY / (EMPLOYED + UNEMPLOY) > 0.07会选择失业率高于7%的所有州(请注意,样本数据非常陈旧,因此不要从结果中得出任何结论!)

3.2. ID和列表比较

如果我们只想提取具有特定ID的州,可以使用IN操作符,而无需指定任何属性,如IN ('states.1', 'states.12')

并且如果想从给定名称列表中筛选出与名称相符合的州,也可以使用IN操作符。STATE_NAME IN ('NewYork','California','Montana','Texas')

3.3. 函数(方法)过滤

CQL/ECQL可以使用GeoServer中提供的任何过滤函数。这极大地增强了CQL表达式的功能。

例如,假设我们想找到所有名称中包含“m”的州,无论字母大小写。我们可以使用strToLowerCase函数将所有州名转换为小写,然后使用like比较:strToLowerCase(STATE_NAME) like '%m%':

3.4. 几何过滤

CQL提供了一整套几何过滤功能。例如,假设你只想显示与(-90,40,-60,45)边界框相交的州。几何过滤器为:BBOX(the_geom,-90,40,-60,45)

与之相反,可以使用过滤器选择那些不与边界框相交的州:DISJOINT(the_geom,POLYGON((-9040,-9045,-6045,-6040,-9040)))

以下为完整的几何谓词列表:

几何谓词说明
EQUALS等于
DISJOINT不相交
INTERSECTS相交
TOUCHES相切
CROSSES相交于
WITHIN包含于
CONTAINS包含
OVERLAPS重叠
RELATE关联
DWITHIN距离内
BEYOND距离外

4. GeoServer 账户信息

GeoServer默认账号信息

访问地址:http://localhost:8080/geoserver

端口:8080

账户: admin

密码:geoserver

5. 参考资料

CQL语法:https://docs.geoserver.org/latest/en/user/tutorials/cql/cql_tutorial.html

ECQL语法:https://docs.geoserver.org/latest/en/user/filter/ecql_reference.html#filter-ecql-reference

GIS之路 开发示例数据下载,请在公众号后台回复:vector

全国信息化工程师-GIS 应用水平考试资料,请在公众号后台回复:GIS考试


GIS之路 公众号已经接入了智能助手 可以在对话框进行提问,也可以直接搜索历史文章进行查看。

都看到这了,不要忘记点赞、收藏 + 关注

本号不定时更新有关 GIS开发 相关内容,欢迎关注 !