概述
在Geoserver中可通过CQL_FILTER
对要素进行过滤,CQL_FILTER
即支持属性过滤也支持空间过滤,本文通过实际的例子演示如何使用CQL_FILTER
。
简介
CQL(Common Query Language)是为OGC目录规范创建的纯文本语言。GeoServer对其进行了调整,使其更易于使用。GeoServer实际上实现了一个更强大的扩展,称为ECQL(Extended CQL)。在GeoServer中,过滤器可以在多种场景中使用:
- WMS请求中通过
filter
参数选择在地图上展示的要素 - WFS请求中通过
filter
参数过滤返回特定条件的要素 - SLD样式文件中通过
Filter
元素根据不同的条件设置不同的样式
条件可以是一个条件,也可以是多个条件。
规则 | 说明 |
---|---|
Predicate | 单个条件 |
AND 或 OR
|
多个组合条件 |
NOT |
取反条件 |
(|[ 条件 ]|)
|
通过( 或[ 控制条件顺序 |
测试数据
本文中的测试数据是用天地图公共资源中的幼儿园数据,并添加了测试字段,数据和字段情况如下图:
image.png
示例
示例通过Geoserver中图层预览进行演示,如下图,是更进去后的状态。
image.png
1. 属性过滤
1.1 比较运算
比较运算符有等于=
、不等于<>
、小于 <
、小于等于<=
、大于>
、大于等于>=
。其中=
和<>
支持多种数据类型,如varchar、number、boolean、time等,<
、<=
、>
、>=
支持number和time类型。
1)等于=
和不等于<>
通过=
可过滤值等于某个值的要素,其写法跟sql
的语法类似。如下示例中演示了num = 110
的结果。
如下示例中演示了name = '阳光民族幼儿园'
的结果。
通过<>
可过滤值不等于某个值的要素,如下示例中演示了num <> 110
的结果。
如下示例中演示了name <> '阳光民族幼儿园'
的结果。
2)<
、<=
、>
、>=
如下示例演示了number和time类型的比较。如条件为num > 290
的结果如下图所示。
1.2 BETWEEN AND
值域区间
通过BETWEEN AND
可过滤number和time类型的字段的值在某个区间,如下示例,通过num BETWEEN 100 AND 110
条件过滤了num值在100-150之间的要素
1.3 LIKE
值匹配
通过LIKE
可对varchar和num等类型的字段进行过滤,其写法与SQL类似,如下示例,通过name LIKE '%艺术%'
过滤了名称中包含“艺术”儿子的要素。其中:
-
艺术%
,表示以“艺术”开头 -
%艺术
,表示以“艺术”结尾 -
%艺术%
,表示包含“艺术”二字
image.png
1.4 IN
条件
通过IN
设置条件在某一组值中,可对varchar和num等类型的字段进行过滤。如下示例通过num in (110, 120)
演示了num
为110和120的要素。
如下示例通过name in ('阳光民族幼儿园', '起点幼儿园')
演示了name
为阳光民族幼儿园和起点幼儿园的要素。
1.5 IS NULL
通过IS NULL
设置条件判断值为空的要素。如下通过name IS NULL
演示了name
为空的要素,因为数据中没有name为空的,所以结果为一片空白。
1.6 NOT
取反
通过NOT
可进行取反操作,如:
-
image.pngname NOT in ('阳光民族幼儿园', '起点幼儿园')
-
image.pngname NOT LIKE '%艺术%'
-
image.pngnum NOT BETWEEN 100 AND 110
-
image.pngNOT (num <> 110)
,跟num = 110
结果一样
-
image.pngname IS NOT NULL
1.7 时间过滤
时间过滤的条件有:
-
BEFORE
,如time BEFORE '2024-03-31'
表示过滤时间在2024-03-31之前的要素 -
DURING
,过滤时间在一个时间段内的要素 -
AFTER
,如time AFTER '2024-03-31'
表示过滤时间在2024-03-31之后的要素
1.8 AND
和OR
通过AND
和OR
可进行多条件组合进行过滤,AND
表示多个条件同时满足,OR
表示多个条件有一个满足。如name like '%阳光%' and num > 100
表示名称包含“阳光”且num大于100的要素。
2.空间过滤
在Geoserver中支持的空间过滤有:
-
image.pngINTERSECTS(Expression , Expression)
,相交判断,如intersects(the_geom, POLYGON ((106.550313472803 33.6939631715481,111.906007263598 33.5633364937238,111.710067246862 28.8607760920502,106.550313472803 29.3832828033473,106.550313472803 33.6939631715481)))
-
image.pngDISJOINT(Expression , Expression)
,相离判断,其结果与INTERSECTS
相反,如DISJOINT(the_geom, POLYGON ((106.550313472803 33.6939631715481,111.906007263598 33.5633364937238,111.710067246862 28.8607760920502,106.550313472803 29.3832828033473,106.550313472803 33.6939631715481)))
-
CONTAINS(Expression , Expression)
,CONTAINS(a, b)
表示a包含b,使用使需要注意参数的顺序 -
image.pngWITHIN(Expression , Expression)
,WITHIN(a, b)
表示a在b里面,使用使需要注意参数的顺序,如WITHIN(the_geom, POLYGON ((106.550313472803 33.6939631715481,111.906007263598 33.5633364937238,111.710067246862 28.8607760920502,106.550313472803 29.3832828033473,106.550313472803 33.6939631715481)))
-
TOUCHES(Expression , Expression)
,边界相交,在边界处至少有一个点相交,但是在内部不相交 -
CROSSES(Expression , Expression)
,交叉判断,多为线要素和其他要素的判断 -
OVERLAPS(Expression , Expression)
,判断同一类型的要素是否有重叠 -
RELATE(Expression , Expression , pattern)
,相关联 -
image.pngDWITHIN(Expression , Expression , distance , units)
,DWITHIN(the_geom, POLYGON ((106.550313472803 33.6939631715481,111.906007263598 33.5633364937238,111.710067246862 28.8607760920502,106.550313472803 29.3832828033473,106.550313472803 33.6939631715481)), 3, meters)
表示先将b向外扩3m在做逻辑判断,单位可为feet, meters, statute miles, nautical miles, kilometers
-
image.pngBEYOND(Expression , Expression , distance , units)
,语法上跟DWITHIN
一样,结果上刚好相反,如BEYOND(the_geom, POLYGON ((106.550313472803 33.6939631715481,111.906007263598 33.5633364937238,111.710067246862 28.8607760920502,106.550313472803 29.3832828033473,106.550313472803 33.6939631715481)), 3, meters)
-
image.pngBBOX(Expression , Number , Number , Number , Number [ , CRS ] )
,通过四至进行过滤,其中CRS为非必填参数,如bbox(the_geom, 106.55,28.86, 111.90,33.69)
表示过滤四至在106.55,28.86, 111.90,33.69
之内的要素。
注意:在使用空间过滤时,第一个参数Expression 必须是the_geom
,第二个参数是WKT
。
3.表达式
可用表达式作为过滤条件,如(num / 300) > 0.99
表示num / 300
运算的结果大于0.99的要素。
网友评论