CQL过滤多个类型名称以检索指定几何体内的要素

时间:2018-06-12 07:34:13

标签: geospatial cql geoserver geo

环境

我正在尝试使用CQL过滤从GeoServer上运行的WFS层获取精选数据。我无法访问服务器。

目标

在另一个图层的另一个要素的几何图形内接收两种类型的所有要素;每层最多一个请求(因此不是每种类型)

思路

我必须:

  • 从wfs图层(geometryA)接收几何图形
  • 使用此几何图形从“geometryA”中具有几何图形的另一个图层接收两个类型名称。

尝试

对于单个类型名称,这很容易。首先获取geometryA,然后: https://src/wfs?request=getFeature&version=2.0.0&typenames=namespace:typename&srsName=EPSG:28992&outputFormat=application/json&cql_filter=WITHIN(geometry, geometryA)

但是我无法弄清楚多种类型的名字......我试过了: https://src/wfs?request=getFeature&version=2.0.0&typenames=namespace:typename;namespace:typename2&srsName=EPSG:28992&outputFormat=application/json&cql_filter=WITHIN(geometry, geometryA) 这导致: Extracted invalid join sub-filter [ geometrie within POLYGON ((154884 463434, 154884 463455, 154905 463455, 154905 463434, 154884 463434)) ], it users more than one feature type + []

所以我试过,经过一些谷歌搜索, https://src/wfs?request=getFeature&version=2.0.0&typenames=namespace:typename;namespace:typename2&srsName=EPSG:28992&outputFormat=application/json&cql_filter=WITHIN(geometry, geometryA);WITHIN(geometry, geometryA) 这导致: Join query must specify a filter

现在我很失落......

问题

有人能告诉我如何使用CQL(或其他任何东西)来修复固定几何体中的两个类型名吗?

1 个答案:

答案 0 :(得分:1)

在WFS 2.0中指定2(或更多)typeNames引入join in the query。这将返回根据您提供的过滤器连接的类型的元组。

在你的情况下,我并不完全清楚你是否想要它,如果它不是那么你只能对单一类型提出2个请求(并行速度?)。

如果它是您想要的,您可以通过向类型添加别名来避免geometrie作为两种类型属性的歧义,因此您的查询将变为类似:

  <wfs:Query typeNames="namespace:typename;namespace:typename2" aliases="a b" >
     <fes:Filter>
        <fes:Or>
        <fes:Within>
           <fes:ValueReference>a.geometrie</fes:PropertyName>
           <fes:Literal>POLYGON ((154884 463434, 154884 463455,
  154905 463455, 154905 463434, 154884 463434))</fes:Literal>
        </fes:Within>
        <fes:Within>
           <fes:ValueReference>b.geometrie</fes:PropertyName>
           <fes:Literal>POLYGON ((154884 463434, 154884 463455,
  154905 463455, 154905 463434, 154884 463434))</fes:Literal>
        </fes:Within>
       </fes:Or>
     </fes:Filter>
  </wfs:Query>

我不确定您是否可以使用CQL创建这种联接,但您可以尝试将其作为:

cql_filter=WITHIN(a.geometry, geometryA) OR WITHIN(b.geometry, geometryA)