使用边界框策略加载Open layers 3 jsonp矢量层



我在使用OpenLayers3和边界框策略将功能从geoserver加载到向量层时遇到问题。我试图找到如何使用边界框策略加载多个层,但没有成功。唯一的例子我发现它是一个层,使用全局函数,在我的情况下不适用(http://acanimal.github.io/thebookofopenlayers3/chapter03_08_loading_strategies.html)。问题是,加载响应的函数没有全局定义——如果是这样的话,我必须为我想要加载的每一层创建这样的函数,对吧?这是一个请求功能的示例url地址:

http://192.168.1.10/geoserver/wfs?service=WFS&version=1.1.0&request=GetFeature&typename=ubutrusty:places&outputFormat=text/javascript&format_options=callback:success&srsname=EPSG:32635&bbox=161473.81383919955,4698323.564696768,234672.52335922938,4767981.6354873795,EPSG:32635 

您可以看到format_options参数被设置为callback:success,我确信这是问题所在,但我很难设置正确的回调函数。我在javascript方面的知识不是很好,所以这个问题对我来说并不容易

这就是我试图创建一个新的矢量层的方式:

var layer = {
    name: 'ubutrusty:places',
    title: 'Позиции',
    source: createVectorLayer(layer),
    type: 'operational',
    visible: true,
    style: new ol.style.Style({
        stroke: new ol.style.Stroke({
            color: '#800000',
            width: 2
        })
    })
}

这个函数是为我想添加到地图中的每一层调用的,它返回ol.source.ServerVector对象:

MyApp.prototype.createVectorLayer = function(layerData){
    var vectorSource = new ol.source.ServerVector({
        format: new ol.format.GeoJSON(),
        loader: function(extent, resolution, projection) {
            extent = ol.proj.transformExtent(extent, projection.getCode(), ol.proj.get(layerData.srcEPSG).getCode());
            var url = config.proxyUrl + layerData.url + '?service=WFS&' +
                'version=1.1.0&request=GetFeature&typename=' + layerData.name + '&' + 'outputFormat=text/javascript' +
                '&format_options=callback:success&srsname=' + layerData.srcEPSG + '&bbox=' + extent.join(',') + ',' + layerData.srcEPSG;
            $.ajax({
                url: url,
                dataType: 'jsonp',
                success: function(data) {
                    this.addFeatures(this.readFeatures(data));
                },
                error: function (e) {
                    var wtf = e.status;
                }
            });
        },
        strategy: ol.loadingstrategy.bbox,
        projection: layerData.srcEPSG
    })
    return vectorSource;
}
MyApp.map.addLayer(new ol.layer.Vector(layer);

问题是,是否可以定义一个函数来从多个图层加载特征?如果可以,我该如何做到这一点?如果我没有指定回调函数,那么将使用默认的回调函数(对于geoserver,它是parseResponse),该函数也没有定义。如果需要更多信息,我可以给出额外的参数或代码示例。

感谢

在您的URL中,您已经定义了回调函数的名称。它是success,由'&format_options=callback:success&srsname='定义。如果要将createVectorLayer函数用于多层,则需要将其更改为'&format_options=callback:success.' + layerData.name.replace(':', '_') + '&srsName='。然后,您可以在全局对象文字success中创建一个函数注册表,您可以定义一次:

window.success = {};

然后,您可以将以下代码添加到createVectorLayer函数中,该函数将为每个层创建一个回调函数:

success[layerData.name.replace(':', '_')] = function(response) {
  vectorSource.addFeatures(vectorSource.readFeatures(response));
};

最新更新