Openlayers 3 - WFS未在地图平移

时间:2015-05-26 14:04:14

标签: javascript openlayers openlayers-3

我使用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));
};

1 个答案:

答案 0 :(得分:0)

您不能在同一个WFS请求中一起使用CQL过滤器和BBOX。如果您有CQL属性过滤器,则需要将BBOX过滤器添加为CQL过滤器。

例如,这个BBOX过滤器:

bbox: extent.join(',') + ',EPSG:3857'

等效于此CQL过滤器:

cql_filter: "BBOX(geometry," + extent.join(',') + ")"