我有一个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
答案 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。