我使用CQL过滤器根据特定类型返回我的点数。然后我在过滤器中添加了一个BBOX,将结果仅限制在地图的当前范围内。这一切都正常。唯一的问题是如果我平移地图它不会重新加载WFS调用。因此,如果我放大wfs正确过滤一个点,如果我然后平移到我知道有一个点的区域,那么除非我改变缩放级别,否则什么都没有。这将更新WFS。
在我的ServerVector加载程序参数中,我调用函数updateWFSURL(extent)。我使用它来根据要传递给CQL_FILTER的过滤条件构建WFS URL。我目前没有加载策略,我尝试使用createTile和bbox,但都没有给我正确的结果。
以下是我用来将BBOX添加到我的CQL_FILTER的代码。之后会添加更多过滤器,此过滤器将附加到WFS URL。
var coord1 = ol.proj.transform([extent[0], extent[1]], 'EPSG:3857', 'EPSG:4326');
var coord2 = ol.proj.transform([extent[2], extent[3]], 'EPSG:3857', 'EPSG:4326');
var filter = "&CQL_FILTER=BBOX(GEOM, " + coord1 + ", " + coord2 + ", 'EPSG:4326')";
我找到的解决方法是捕获map moveend事件并从那里调用updateWFSURL(extent)。这将在平移上正确更新,但会导致updateWFSURL在缩放时被调用两次,因为它会从WFS加载器和moveend事件中触发。
我正在寻找的解决方案是在平底锅上正确更新我的WFS,或者如何确定平移/缩放之间的差异,这样如果它是缩放,我就无法在moveend中调用该函数。
在下面添加了更多代码。删除了我正在使用的geoserver url和图层名称,并删除了一些只过滤ID的CQL过滤器。如果没有我的解决方案,这个wfs不会在平台上更新地图。
//this function gets called on page load
function loadPointAssets() {
// Source retrieving WFS data in GeoJSON format using JSONP technique
pointAssetVector = new ol.source.ServerVector({
format: new ol.format.GeoJSON(),
loader: function (extent, resolution, projection) {
//this gets called whenever the map zooms
updateWFSURL(extent);
},
projection: 'EPSG:3857'
});
//cluster markers adds the markers to the map from the pointAssetVector
clusterMarkers();
}
function updateWFSURL(extent) {
//transform the extent to coordinates can be passed in as lat/long
var coord1 = ol.proj.transform([extent[0], extent[1]], 'EPSG:3857', 'EPSG:4326');
var coord2 = ol.proj.transform([extent[2], extent[3]], 'EPSG:3857', 'EPSG:4326');
var filter = "&CQL_FILTER=BBOX(GEOM, " + coord1 + ", " + coord2 + ", 'EPSG:4326')";
$.ajax({
//create the url with the filter
url: 'http://myGeoserverURL/wfs?' +
'service=WFS&request=GetFeature&' +
'version=1.1.0&typename=LayerName&outputFormat=text/javascript&' +
'format_options=callback:loadFeatures&' +
'srsname=EPSG:4326' + filter,
dataType: 'jsonp'
});
pointAssetVector.clear(true);
}
// Executed when data is loaded by the $.ajax method.
var loadFeatures = function (response) {
//clear the features before adding them to the source again
pointAssetVector.clear();
pointAssetVector.addFeatures(pointAssetVector.readFeatures(response));
};
答案 0 :(得分:0)
您不能在同一个WFS请求中一起使用CQL过滤器和BBOX。如果您有CQL属性过滤器,则需要将BBOX过滤器添加为CQL过滤器。
例如,这个BBOX过滤器:
bbox: extent.join(',') + ',EPSG:3857'
等效于此CQL过滤器:
cql_filter: "BBOX(geometry," + extent.join(',') + ")"