Загрузить открытые слои 3 векторного слоя jsonp со стратегией ограничительной рамки?

У меня проблема с загрузкой объектов с геосервера в векторный слой с использованием стратегии OpenLayers3 и ограничивающей рамки. Я пытался найти, как я могу загрузить более одного слоя, используя стратегию ограничивающей рамки, но безуспешно. Единственный пример, который я нашел, это с одним слоем и использованием глобальных функций, что в моем случае неприменимо (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);

Вопрос в том, можно ли определить одну функцию для загрузки объектов из более чем одного слоя, и если да, то как это сделать? Если я не указываю функцию обратного вызова, то используется функция по умолчанию (для геосервера это parseResponse), которая также не определена. Если нужна дополнительная информация, я могу предоставить дополнительные параметры или примеры кода.

Спасибо


person Bogdan Hristozov    schedule 20.02.2015    source источник


Ответы (1)


В вашем 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));
};
person ahocevar    schedule 22.02.2015
comment
Извините за мой поздний ответ, я не смог протестировать ваше решение ранее. Это здорово, это решает мою проблему. Я создал один общедоступный объект: success = {} и внутри я создал функцию для каждого отдельного слоя, загруженного на карту. Я изменил функцию, которая читает характеристики, потому что vectorSource не определено: success[operationalLayers[j].name.replace(':', '_')] = function(res){ var layer = app.getLayerBy('name', Object.getOwnPropertyNames(this)[0].replace('_', ':')); layer.getSource().addFeatures(layer.getSource().readFeatures(res)); } Спасибо - person Bogdan Hristozov; 26.02.2015