CQL 过滤多个类型名以检索指定几何中的特征

Posted

技术标签:

【中文标题】CQL 过滤多个类型名以检索指定几何中的特征【英文标题】:CQL filter multiple typenames to retrieve features within specified geometry 【发布时间】:2018-11-21 12:36:12 【问题描述】:

环境

我正在尝试使用 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】:

在 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)

【讨论】:

以上是关于CQL 过滤多个类型名以检索指定几何中的特征的主要内容,如果未能解决你的问题,请参考以下文章

FFMPEG:组合多个过滤器时指定输出流类型

在 Cassandra 中如何通过多个过滤器选择行?

UG类选择器怎么用呀

仅具有几何特征的Mapbox

1.《SQL必知必会》--(更新中...)

您可以使用多个过滤器调用 Directory.GetFiles() 吗?