过滤器功能¶
OGC过滤器编码规范提供了 过滤功能 .筛选函数是一个具有任意数量参数的命名函数,可在筛选表达式中用于执行特定计算。这为定义过滤器提供了更丰富的表现力。过滤函数可以在XML过滤编码语言和文本ECQL语言中使用,使用适合该语言的语法。
geoserver提供了许多不同类型的过滤函数,涵盖了广泛的功能,包括数学、字符串格式和几何运算。完整列表见 过滤函数引用 .
备注
过滤器编码规范为过滤器函数提供了一种标准语法,但不要求指定一组特定的函数。服务器可以自由地提供他们想要的任何函数,因此一些函数表达式可能只在特定的软件中工作。
实例¶
下面的示例说明如何使用筛选函数。第一个显示使用 geometryType
功能。第二部分介绍如何使用SLD中的函数来改进标签渲染。
WFS过滤¶
假设我们有一个特征类型,其几何字段, geom
,可以包含任何类型的几何图形。对于某个应用程序,我们只需要提取其几何图形是简单点或多点的特征。这可以使用名为 geometryType
.以下是WFS请求,包括过滤功能:
<wfs:GetFeature service="WFS" version="1.0.0"
outputFormat="GML2"
xmlns:wfs="http://www.opengis.net/wfs"
xmlns:ogc="http://www.opengis.net/ogc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.opengis.net/wfs
http://schemas.opengis.net/wfs/1.0.0/WFS-basic.xsd">
<wfs:Query typeName="sf:archsites">
<ogc:Filter>
<ogc:PropertyIsEqualTo>
<ogc:Function name="geometryType">
<ogc:PropertyName>geom</ogc:PropertyName>
</ogc:Function>
<ogc:Literal>Point</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
</wfs:Query>
</wfs:GetFeature>
WFS 2.0命名空间¶
WFS 2.0不依赖于任何一个GML版本,因此需要GML的显式名称空间和模式位置。这个后置示例使用空间查询选择特征。注意名称空间前缀的完整声明。在GET请求中,可以将命名空间放置在筛选器元素上。
<?xml version="1.0" encoding="UTF-8"?>
<wfs:GetFeature service="WFS" version="2.0.0"
xmlns:wfs="http://www.opengis.net/wfs/2.0"
xmlns:fes="http://www.opengis.net/fes/2.0"
xmlns:gml="http://www.opengis.net/gml/3.2"
xmlns:sf="http://www.openplans.org/spearfish"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.opengis.net/wfs/2.0
http://schemas.opengis.net/wfs/2.0/wfs.xsd
http://www.opengis.net/gml/3.2
http://schemas.opengis.net/gml/3.2.1/gml.xsd">
<wfs:Query typeNames="sf:bugsites">
<fes:Filter>
<fes:Not>
<fes:Disjoint>
<fes:ValueReference>sf:the_geom</fes:ValueReference>
<!-- gml:id is mandatory on GML 3.2 geometry elements -->
<gml:Polygon
gml:id="polygon.1"
srsName='http://www.opengis.net/def/crs/EPSG/0/26713'>
<gml:exterior>
<gml:LinearRing>
<!-- pairs must form a closed ring -->
<gml:posList>590431 4915204 590430
4915205 590429 4915204 590430
4915203 590431 4915204</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</fes:Disjoint>
</fes:Not>
</fes:Filter>
</wfs:Query>
</wfs:GetFeature>
SLD格式¶
我们要在等高线图中显示高程标签。高程存储为浮点值,因此原始数值可能显示不需要的小数点(例如“150.0”或“149.999999”)。我们希望确保数字适当四舍五入(即显示“150”)。为了达到这个目的, numberFormat
筛选函数可用于SLD标签内容表达式:
...
<TextSymbolizer>
<Label>
<ogc:Function name="numberFormat">
<ogc:Literal>##</ogc:Literal>
<ogc:PropertyName>ELEVATION</ogc:PropertyName>
</ogc:Function>
</Label>
...
</TextSymbolizer>
...
性能影响¶
在SLD符号表达式中使用过滤器函数不会有很大的开销,除非函数执行非常繁重的计算。
但是,在某些情况下,在WFS筛选或SLD规则表达式中使用函数可能会导致性能问题。这通常是因为特定的过滤函数不能被本地数据存储过滤器编码器识别,因此geoserver必须在内存中执行这些函数。
例如,给定一个类似于 BBOX(geom,-10,30,20,45) and geometryType(geom) = 'Point'
大多数数据存储将把过滤器分成两个单独的部分。边界框过滤器将编码为主过滤器并在SQL中执行,而 geometryType
函数将在内存中对来自主筛选器的结果执行。