【发布时间】:2021-12-23 21:33:49
【问题描述】:
是否知道如何通过 Leaflet TimeDimension 传递 WMS cql_filter?
我正在使用 Geoserver 和 Leaflet,使用 Geoserver 中的 Cross Layer filter 扩展和 Leaflet 的 TimeDimension 插件。我有两个点层,一个停车位(静态,没有日期时间字段)和一个船(移动,有日期时间字段)。我可以像这样通过 TimeDimension 很好地显示哪些停车位是空的(5 米以外的船)或被占用(5 米内的船):
var vacant_parking = L.tileLayer.wms(baseUrl, {
layers: 'workspace:parking_spacesLayer',
cql_filter: 'BEYOND(the_geom,collectGeometries(queryCollection(\'workspace:boatsLayer\',\'the_geom\',\'datetime=2021-11-09\')),5,meters)',
format: 'image/png',
transparent: true
});
var vacant_parking_time = L.timeDimension.layer.wms(vacant_parking, {
updateTimeDimension: true
});
但我需要通过 timeDimension 传递 cql_filter 以便能够动态显示哪些停车位是空置(或占用)的,而不是仅在固定时间进行过滤(例如 datetime=2021-11-09)或用户通过时间维度控件提供的时间段。
我尝试了几种不同的组合,但这些都不起作用,因为 timeDimension 仅读取指定层('workspace:parking_spacesLayer')中的日期时间字段,而不是 cql 过滤器中的船层('workspace:boatsLayer' )。具体来说,我想在对parking_spacesLayer 执行cql_filter 之前,使用当前选择的timedimension 时间对boatsLayer 进行预过滤,以在任何给定时间突出显示空置(或占用)的停车位。
我试过了:
将boats 层嵌套在 timeDimension 层中以在 timedimension 中包含 cql 过滤器
var vacant_parking_time = L.timeDimension.layer.wms(
(L.tileLayer.wms(baseUrl, {
layers: 'workspace:parking_spacesLayer',
cql_filter: 'BEYOND(the_geom,collectGeometries(queryCollection(\'workspace:boatsLayer\',\'the_geom\',\'INCLUDE\')),5,meters)',
format: 'image/png',
transparent: true
})), {
updateTimeDimension: true
}).addTo(map);
同时将两个图层添加到 WMS(图层:'workspace:parking_spacesLayer,boatsLayer'),这会通过时间维度过滤两个图层,但不执行 cql_filter。
并像这样替换指定的时间,将 my_date 替换为“2021-11-03”(适用于固定时间)或 this.time; this._timeDimension.getCurrentTime(); this._timeDimension.currentLoadedTime(); $(".timecontrol-date").text(); $(".timecontrol-date").html().split("T")[0]; (这些都不起作用)。
cql_filter: 'BEYOND(the_geom,collectGeometries(queryCollection(\'workspace:boatsLayer\',\'the_geom\',\'datetime=' + my_date + '\')),5,meters)',
但到目前为止还没有工作。我怀疑我可能需要使用 .apply() 或 .call() 函数来不断更新 datetime 字段。
有什么想法吗?
【问题讨论】: