对当前不可见的图层禁用WMSGetFeatureInfo

时间:2011-01-27 22:06:57

标签: javascript extjs openlayers

我有一个OpenLayers / GeoExtJS地图,每次用户点击地图上的某个点时,我都会弹出一个WMSGetFeatureInfo弹出窗口。但是,即使对于在用户点击时设置的分辨率不可见的图层,弹出窗口也会显示结果。 OpenLayers layer.calculateInRange()非常清楚地告诉我哪些层目前在范围内,但我不知道如何从getfeatureinfo请求中消除它们......

即使尝试eventListener beforegetfeatureinfo也不起作用......

任何想法都会非常精彩:)

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 个答案:

答案 0 :(得分:3)

不是原始问题的解决方案,但我认为您应该重新考虑removeLayersOutOfRange函数。在数组上使用splice将在循环中更改它,从而也改变索引。这意味着您不会正确遍历所有图层。

我建议您创建一个新数组并将范围内的图层推送到该数组中,然后传递该数组而不是编辑输入数组。

像这样(未经测试):

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方法中,询问层逻辑哪些层是可见的,然后仅使用来自这些层的信息编译消息?弄乱查询层可能是这里的罪魁祸首。没有经验,只猜猜......

答案 1 :(得分:2)

我认为您需要做的就是在WMSGetFeatureInfo中添加“layers”参数,例如

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。