交叉层过滤

跨层过滤提供了从A层查找与B层特征具有特定关系的特征的能力。例如,可以使用该功能查找距离指定商店给定距离内的所有公共汽车站,或者查找包含在指定城市区域内的所有咖啡店。

这个 查询层 模块添加实现跨层过滤的过滤函数。这些函数通过查询应用于主要层的筛选器中的次要层来工作。次要层的名称和要从中提取的属性作为参数提供,同时还提供了一个ECQL筛选器表达式,以确定感兴趣的功能。一个常见的用例是提取几何值属性,然后将空间谓词中的值与主要层中的几何值属性相对应。

地理服务器广泛支持过滤功能,因此跨层过滤可以用于SLD规则、WMS和WFS请求,也可以用于XML或CQL过滤器。

安装querylayer模块

  1. 将扩展存档的内容解压缩到 WEB-INF/lib Geoserver安装的目录。

  2. 要检查模块是否正确安装,请从GeoServer主页请求WFS 1.1功能。这个 Filter_Capabilities 节应包含对名为 queryCollection .

 1 ...
 2 <ogc:Filter_Capabilities>
 3     ...
 4     <ogc:ArithmeticOperators>
 5       ...
 6       <ogc:Functions>
 7         <ogc:FunctionNames>
 8           ...
 9           <ogc:FunctionName nArgs="-1">queryCollection</ogc:FunctionName>
10           <ogc:FunctionName nArgs="-1">querySingle</ogc:FunctionName>
11           ...
12         </ogc:FunctionNames>
13       </ogc:Functions>
14     </ogc:ArithmeticOperators>
15   </ogc:Scalar_Capabilities>
16   ...
17 </ogc:Filter_Capabilities>
18 ...

函数引用

该扩展提供以下过滤功能以支持跨层过滤。

Name

Arguments

Description

查询单个

layer :字符串, attribute :字符串, filter :字符串

查询指定的 layer 应用指定的 ECQL filter 并返回 attribute 从结果集中的第一个特征。层名称必须是限定的(例如。 topp:states ). 如果不需要过滤,则使用过滤器 INCLUDE .

查询集合

layer :字符串, attribute :字符串, filter :字符串

查询指定的 layer 应用指定的 ECQL filter 并返回一个包含 attribute 对于结果集中的每个特征。层名称必须是限定的(例如。 topp:states ). 如果不需要过滤,则使用过滤器 INCLUDE .如果收集的结果太多,将引发异常(请参见 内存限制

集合几何

geometries :几何体对象列表

将几何图形列表转换为单个几何图形对象。的输出 queryCollection 必须由此函数转换才能在空间过滤器表达式中使用它(因为不能直接使用几何列表)。如果收集的坐标太多,将引发异常(请参见 内存限制

优化性能

在geoserver 2.1.x系列中,为了使跨层过滤器以最佳性能执行,在启动JVM时必须指定以下系统变量:

-Dorg.geotools.filter.function.simplify=true

这样可以确保每个查询对函数进行一次计算,而不是对每个结果进行一次计算。对于geoserver 2.2.x系列,此标志不是必需的。(希望这种行为也将成为2.1.x中的默认行为。)

内存限制

这个 queryCollectioncollectGeometries 函数不执行真正的数据库样式联接。相反,它们每次执行时都会对第二层执行查询,并将整个结果加载到内存中。因此,如果查询结果集非常大,或者收集的几何图形非常大,则这些函数可能会使用过多的服务器内存。为防止影响服务器稳定性,可以处理的数据量有内置限制:

  • 最多收集1000个功能 queryCollection

  • 最多可收集37000个坐标(相当于1MB的坐标对象) collectGeometries

可以通过为以下参数设置备用值来覆盖这些限制(这可以使用JVM系统变量、Servlet上下文变量或环境变量来完成):

  • QUERY_LAYER_MAX_FEATURES controls the maximum number of features collected by queryCollection

  • GEOMETRY_COLLECT_MAX_COORDINATES controls the maximum number of coordinates collected by collectGeometries

WMS示例

以下示例使用 sf:bugsitessf:roadssf:restricted 标准GeoServer下载中提供的演示层。

  • 仅显示与类别为3的限制区域重叠的bug站点

上的CQL跨层过滤器 bugsites 层是

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

结果是:

../../_images/bugsitesInRestricted.png
  • 显示任何道路200米范围内的所有Bug站点

上的CQL跨层过滤器 bugsites 层是

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

结果是:

../../_images/bugsitesWithin.png

WFS示例

以下示例使用 sf:bugsitessf:roadssf:restricted 标准GeoServer下载中提供的演示层。

  • 仅检索与类别为3的限制区域重叠的bug站点

 1   <wfs:GetFeature xmlns:wfs="http://www.opengis.net/wfs"
 2                   xmlns:sf="http://www.openplans.org/spearfish"
 3                   xmlns:ogc="http://www.opengis.net/ogc"
 4                   service="WFS" version="1.0.0">
 5     <wfs:Query typeName="sf:bugsites">
 6       <ogc:Filter>
 7         <ogc:Intersects>
 8           <ogc:PropertyName>the_geom</ogc:PropertyName>
 9           <ogc:Function name="querySingle">
10              <ogc:Literal>sf:restricted</ogc:Literal>
11              <ogc:Literal>the_geom</ogc:Literal>
12              <ogc:Literal>cat = 3</ogc:Literal>
13           </ogc:Function>
14         </ogc:Intersects>
15       </ogc:Filter>
16     </wfs:Query>
17   </wfs:GetFeature>
  • 取回任何道路200米范围内的所有窃听点

 1   <wfs:GetFeature xmlns:wfs="http://www.opengis.net/wfs"
 2     xmlns:sf="http://www.openplans.org/spearfish"
 3     xmlns:ogc="http://www.opengis.net/ogc"
 4     service="WFS" version="1.0.0">
 5     <wfs:Query typeName="sf:bugsites">
 6       <ogc:Filter>
 7         <ogc:DWithin>
 8           <ogc:PropertyName>the_geom</ogc:PropertyName>
 9           <ogc:Function name="collectGeometries">
10             <ogc:Function name="queryCollection">
11               <ogc:Literal>sf:roads</ogc:Literal>
12               <ogc:Literal>the_geom</ogc:Literal>
13               <ogc:Literal>INCLUDE</ogc:Literal>
14             </ogc:Function>
15           </ogc:Function>
16           <ogc:Distance units="meter">100</ogc:Distance>
17         </ogc:DWithin>
18       </ogc:Filter>
19     </wfs:Query>
20   </wfs:GetFeature>
Previous: FAQ