在 OL3 和 GeoServer 中使用 OGC 过滤器比较两个字段

Posted

技术标签:

【中文标题】在 OL3 和 GeoServer 中使用 OGC 过滤器比较两个字段【英文标题】:Compare two fields with OGC filter in OL3 and GeoServer 【发布时间】:2016-08-27 14:19:22 【问题描述】:

我正在使用 Opeonlayers 3.18 + GeoServer。我可以制作一个 ogc 过滤器来比较字段和值。如何比较两个字段? 下面的代码显示了我正在寻找的内容:

var f = ol.format.ogc.filter.greaterThan('Field1', 100);  // this works nicely
var f = ol.format.ogc.filter.greaterThan('Field1', 'Field2'); // this doesn't work

等效的工作 CQL 过滤器是:'Field1 > Field2'

问候

【问题讨论】:

【参考方案1】:

这种过滤应该可以工作。我会注意到许多数据库可能无法以最佳方式执行该过滤器,因此,此类过滤器的处理可能不正确。

首先要检查的是 GeoServer 日志是否有任何其他信息。对于大多数请求,有日志消息将提供请求的所有详细信息(包括过滤器)。

如果 OL3 发出无意义的请求,首先应该有某种解析错误。如果数据存储在请求方面遇到问题,您可能会看到异常。

为了进一步提供帮助,您使用的是哪个版本的 GeoServer 和哪个数据存储?另外,日志中是否有其他信息?

更新:根据下面的评论,我查看了 Open Layers 3 源代码。如果您查看here,看起来 OL3 将第一个参数视为属性名称,将第二个参数视为文字。在项目的 GitHub 页面上填写错误/功能请求可能值得。

【讨论】:

它的 Geoserver 2.8.2 和 shapefile 层以及这两个字段都是 Long 类型。 GeoServer 只返回一个空响应,其日志显示:“无法解析过滤器:... Field1Field2”。如果我通过将 Literal 标签更改为 PropertyName 标签来制作纯文本过滤器,现在 Openlayers 返回错误:“TypeError:filter.getTagName 不是函数。ol.xml.makeSimpleNodeFactory(filter.getTagName())”。跨度> 谢谢。如果第二个参数不应该是 Literal -in this case- ,那么它必须是什么?我的意思是这种情况下正确和标准的过滤器是什么? 第二个参数必须是 PropertyName。我的猜测是,当您尝试在 javascript 中将其设为 PropertyName 时,OL3 并不满意,因为它希望第二个参数是文字。

以上是关于在 OL3 和 GeoServer 中使用 OGC 过滤器比较两个字段的主要内容,如果未能解决你的问题,请参考以下文章

Geoserver2.11矢量切片与OL3中的调用展示

ol3 Demo1 ----加载geoserver发布的地图数据

arcgis api 支持geoserver发布的OGC标准的地图吗

GeoServer 用于共享地理空间数据的开源服务器

GeoServer 可以在商业应用程序中使用吗? [关闭]

OGC——WMS服务