Отключить WMSGetFeatureInfo для слоев, которые в данный момент не видны - PullRequest
0 голосов
/ 28 января 2011

У меня есть карта OpenLayers / GeoExtJS, и у меня появляется всплывающее окно WMSGetFeatureInfo каждый раз, когда пользователь нажимает на точку на карте.Тем не менее, всплывающее окно отображает результаты даже для слоев, которые не видны в разрешении, которое установлено во время щелчка пользователя.Слой OpenLayers layer.calculateInRange () довольно хорошо сообщает мне, какие слои в данный момент находятся в диапазоне или нет, но я не знаю, как исключить их из запроса getfeatureinfo ...

Даже попытка использования EventListener перед getfeatureinfo не сработала...

Любые идеи были бы по-настоящему замечательными:)

var layersToBeQueried = [layerA, layerB, layerC, layerD, layerE];

function removeLayersOutOfRange(layerArray) {
    for (var i = 0; i < layerArray.length; i++) {
        alert(layerArray[i].name);
        if (layerArray[i].calculateInRange() == false) {
            layerArray.splice(i, 1);
        }
    }
    return layerArray;
}
var info = new OpenLayers.Control.WMSGetFeatureInfo({
    url: layerURL,
    layerUrls: [layerURL],
    title: 'Identify features by clicking',
    queryVisible: true,
    eventListeners: {
        beforegetfeatureinfo: function (event) {
            this.layers = removeLayersOutOfRange(layersToBeQueried);
        },
        getfeatureinfo: function (event) {

            if (event.text.length <= 687) { } else {

                popup = new GeoExt.Popup({
                    title: "Popup",
                    location: event.xy,
                    autoScroll: true,
                    height: $('#myViewPort').height() - 250,
                    maximizable: true,
                    collapsible: true,
                    map: mapPanel.map,
                    anchored: true,
                    html: '<div id="popupWrap"></div>',
                    listeners: {
                        close: function () {
                            // closing a popup destroys it, but our reference is truthy
                            popup = null;
                        }
                    }
                });

                popup.show();

            }//end if
        }//end getfeatureinfo
    }//end eventListeners
});//end OpenLayers.Control.WMSGetFeatureInfo

mapPanel.map.addControl(info);
info.activate();

Спасибо,

elshae

Ответы [ 2 ]

3 голосов
/ 28 января 2011

Не решение вашей исходной проблемы, но я думаю, вам следует переосмыслить функцию removeLayersOutOfRange.Использование сплайсинга на вашем массиве изменит его в цикле, изменяя также и индексы.Это означает, что вы не будете правильно перебирать все слои.

Я бы посоветовал вам создать новый массив и вставить слои, находящиеся в диапазоне, в этот массив, передав его вместо редактирования входного массива.

Как-то так (не проверено):

function removeLayersOutOfRange(layerArray){
    var retArray = new Array();
    for(var i = 0; i < layerArray.length; i++) {
        //alert(layerArray[i].name);
        if(layerArray[i].calculateInRange() == false){
            retArray.push(layerArray[i]);
        }
    }
    return retArray;
}

Глядя на исходную проблему сейчас.Может быть, логика слоя может быть выполнена после завершения поиска?В методе getFeatureInfo, спрашивая логику слоя, какие слои видимы, а затем компилировать сообщение, используя только информацию из этих слоев?Вмешательство в слои запросов, возможно, может быть виновником здесь.Не имея опыта в этом, только догадываясь ...

2 голосов
/ 11 октября 2012

Я думаю, все, что вам нужно сделать, это добавить параметр "layer" в WMSGetFeatureInfo, например,

var info = new OpenLayers.Control.WMSGetFeatureInfo({
                   url: layerURL,
                   layers: [layersToBeQueried]
                   title: 'Identify features by clicking',
                   queryVisible: true,
                   infoFormat: 'application/vnd.ogc.gml'
                   ...
});

В любом случае, у меня работает с OpenLayer 2.12 и GeoServer 2.1.

...