Cross-layer filtering
跨层过滤提供了从层A中查找与层B中的特征具有特定关系的特征的能力。例如,这可以用于查找距离指定商店给定距离内的所有公交车站,或者查找指定城区内的所有咖啡店。
querylayer
模块添加了实现跨层过滤的过滤功能。这些功能通过查询应用于主图层的过滤器中的辅助图层来工作。辅助层的名称和要从中提取的属性作为参数提供,同时提供ECQL过滤器表达式以确定感兴趣的功能。一个常见的用例是提取几何体值的属性,然后将空间谓词中的值用于主层中的几何体属性。
GeoServer广泛支持过滤器功能,因此跨层过滤可以在SLD
规则、WMS
和WFS
请求中使用,也可以在XML
或CQL
过滤器中使用。
安装querylayer模块
访问网站下载页面,找到版本,然后下载:geoserver-2.23.x-querylayer-plugin.zip
注意 扩展的版本必须与GeoServer实例的版本匹配。
- 将扩展归档的内容提取到GeoServer安装
的WEB-INF/lib
目录中。 - 要检查模块是否正确安装,请从GeoServer主页请求WFS 1.1功能。
Filter_Cabilities
部分应包含对名为queryCollection
的函数的引用。
...
<ogc:Filter_Capabilities>
...
<ogc:ArithmeticOperators>
...
<ogc:Functions>
<ogc:FunctionNames>
...
<ogc:FunctionName nArgs="-1">queryCollection</ogc:FunctionName>
<ogc:FunctionName nArgs="-1">querySingle</ogc:FunctionName>
...
</ogc:FunctionNames>
</ogc:Functions>
</ogc:ArithmeticOperators>
</ogc:Scalar_Capabilities>
...
</ogc:Filter_Capabilities>
...
函数说明
该扩展提供了以下过滤器功能,以支持跨层过滤。
名称 | 参数 | 说明 |
---|---|---|
querySingle | layer :String ,attribute :String ,filter :String | Queries the specified layer applying the specified ECQL filter and returns the value of attribute from the first feature in the result set. The layer name must be qualified (e.g. topp:states ). If no filtering is desired use the filter INCLUDE. |
queryCollection | layer :String ,attribute :String ,filter :String | Queries the specified layer applying the specified ECQL filter and returns a list containing the value of attribute for every feature in the result set. The layer name must be qualified (e.g. topp:states ). If no filtering is desired use the filter INCLUDE. An exception is thrown if too many results are collected (see Memory Limits). |
collectGeometries | geometries : a list of Geometry objects | Converts a list of geometries into a single Geometry object. The output of queryCollection must be converted by this function in order to use it in spatial filter expressions (since geometry lists cannot be used directly). An exception is thrown if too many coordinates are collected (see Memory Limits). |
性能优化
在GeoServer 2.1.x系列中,为了使跨层过滤器以最佳性能执行,启动JVM时需要指定以下系统变量:
-Dorg.geotools.filter.function.simplify=true
这样可以确保每个查询对函数求值一次,而不是对每个结果特性求值一次。GeoServer 2.2.x系列不需要此标志。(希望这种行为也能成为2.1.x中的默认行为。)
内存限制
queryCollection和collectGeometries函数不执行真正的数据库样式联接。相反,它们每次执行时都会对辅助层执行查询,并将整个结果加载到内存中。因此,如果查询结果集非常大,或者如果收集的几何图形非常大,则函数有使用过多服务器内存的风险。为了防止影响服务器稳定性,可以处理的数据量有内置限制:
queryCollection
最多收集1000个功能collectGeometry
最多收集37000个坐标(相当于1MB的坐标对象)
可以通过为以下参数设置备用值来覆盖这些限制(这可以使用JVM系统变量、servlet上下文变量或环境变量来完成):
- QUERY_LAYER_MAX_FEATURES控制queryCollection收集的最大特征数
- GEOMETRY_COLLECT_MAX_COORDINATES控制collectGeometry收集的最大坐标数
WMS示例
以下示例使用标准GeoServer下载中提供的sf:bugsites
、sf:roads
和sf:restricted
演示层。
- 仅显示与类别为3的限制区域重叠的bug站点:
错误站点层上的CQL跨层筛选器为:
INTERSECTS(the_geom, querySingle('restricted', 'the_geom','cat = 3'))
WMS 请求:
http://localhost:8080/geoserver/wms?LAYERS=sf%3Aroads%2Csf%3Arestricted%2Csf%3Abugsites&STYLES=&FORMAT=image%2Fpng&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A26713&CQL_FILTER=INCLUDE%3BINCLUDE%3BINTERSECTS(the_geom%2C%20querySingle(%27restricted%27%2C%20%27the_geom%27%2C%27cat%20%3D%203%27))&BBOX=589081.6705629,4914128.1213261,609174.02430924,4928177.0717971&WIDTH=512&HEIGHT=358
结果:
显示任何道路200米范围内的所有错误站点:
错误站点层上的CQL跨层筛选器为:
DWITHIN(the_geom, collectGeometries(queryCollection('sf:roads','the_geom','INCLUDE')), 200, meters).
WMS请求:
http://localhost:8080/geoserver/wms?LAYERS=sf%3Aroads%2Csf%3Arestricted%2Csf%3Abugsites&STYLES=&FORMAT=image%2Fpng&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A26713&CQL_FILTER=INCLUDE%3BINCLUDE%3BDWITHIN(the_geom%2C%20collectGeometries(queryCollection(%27sf%3Aroads%27%2C%27the_geom%27%2C%27INCLUDE%27))%2C%20200%2C%20meters)&BBOX=589042.42768447,4914010.3926913,609134.78143081,4928059.3431623&WIDTH=512&HEIGHT=358
结果为:
WFS示例
以下示例使用标准GeoServer下载中提供的sf:bugsites
、sf:roads
和sf:restricted
演示层。
- 仅检索类别为3的与限制区域重叠的bug站点:
<wfs:GetFeature xmlns:wfs="http://www.opengis.net/wfs"
xmlns:sf="http://www.openplans.org/spearfish"
xmlns:ogc="http://www.opengis.net/ogc"
service="WFS" version="1.0.0">
<wfs:Query typeName="sf:bugsites">
<ogc:Filter>
<ogc:Intersects>
<ogc:PropertyName>the_geom</ogc:PropertyName>
<ogc:Function name="querySingle">
<ogc:Literal>sf:restricted</ogc:Literal>
<ogc:Literal>the_geom</ogc:Literal>
<ogc:Literal>cat = 3</ogc:Literal>
</ogc:Function>
</ogc:Intersects>
</ogc:Filter>
</wfs:Query>
</wfs:GetFeature>
- 检索任何道路200米范围内的所有故障点:
<wfs:GetFeature xmlns:wfs="http://www.opengis.net/wfs"
xmlns:sf="http://www.openplans.org/spearfish"
xmlns:ogc="http://www.opengis.net/ogc"
service="WFS" version="1.0.0">
<wfs:Query typeName="sf:bugsites">
<ogc:Filter>
<ogc:DWithin>
<ogc:PropertyName>the_geom</ogc:PropertyName>
<ogc:Function name="collectGeometries">
<ogc:Function name="queryCollection">
<ogc:Literal>sf:roads</ogc:Literal>
<ogc:Literal>the_geom</ogc:Literal>
<ogc:Literal>INCLUDE</ogc:Literal>
</ogc:Function>
</ogc:Function>
<ogc:Distance units="meter">100</ogc:Distance>
</ogc:DWithin>
</ogc:Filter>
</wfs:Query>
</wfs:GetFeature>