我创建了一个功能选择器层:
// Add Feature Picker
featurePicker = new OpenLayers.Control.WMSGetFeatureInfo({
url: "http://server01:8080/geoserver/sf/wms",
title: 'identify features on click',
layers: [layer01,
layer02],
queryVisible: true,
output: 'features',
infoFormat: 'application/json',
format: new OpenLayers.Format.JSON
});
featurePicker.events.register("getfeatureinfo", this, showFeatureInfo);
map.addControl(featurePicker);
featurePicker.activate();
从一个图层(layer01)中找到该要素,但是从另一个图层(layer02)找到该要素时,单击某个要素时找不到该要素。
点击任一图层中的要素时,它会触发showFeatureInfo事件:
function showFeatureInfo(e) {
// Parse the features into an array
selectedFeaturesParse(e.features);
}
但是从layer02单击某个功能时没有返回任何功能:
换句话说,单击layer02中的某个要素时,jsonObject.features.length始终为零。单击layer01中的某个要素时,jsonObject.features.length等于1:
function selectedFeaturesParse(jsonObject) {
selectedFeatures = [];
for (var i = 0 ; i < jsonObject.features.length; i++) {
...
}
我将后端作为地理服务器,并且两个层的配置相同。一层是表(layer01),另一层是sql视图查询(layer02)。为什么在点击layer02中的某个功能时找不到这些功能?感谢。
答案 0 :(得分:0)
发现问题,这似乎是一个错误。首先使用viewparams定义一个图层(在本例中为查询图层&#34; layer02&#34;有一个参数)。然后,将该层传递给新的WMSGetFeatureInfo对象:
// Add Feature Picker
featurePicker = new OpenLayers.Control.WMSGetFeatureInfo({
url: "http://server01:8080/geoserver/sf/wms",
title: 'identify features on click',
layers: [layer01,
layer02],
...
然后是错误:当完成服务器调用以获取功能信息时,它不会将viewparams传递回服务器! (即使您已经在创建图层时定义了参数并将整个图层传递给WMSGetFeatureInfo,实际上您可以在调试时看到参数存在,但它没有使用它)
这是解决方法。 (在beforegetfeatureinfo事件期间创建WMSGetFeatureInfo对象时,必须再次定义参数):
featurePicker.events.register("beforegetfeatureinfo", null, beforeGetFeatureInfo);
然后使用vendorParams创建传递viewparams参数的方法:
// This method is called by the picker to setup params
function beforeGetFeatureInfo(e)
{
e.object.vendorParams = { viewparams:"username:bob" };
}
注意:使用此解决方法很糟糕的一点是,无论您单击哪个层功能,它仍会将参数传递回服务器。在上面的示例中,layer01没有param,但是在进行服务器调用时,它仍将额外参数传递给服务器。它可以工作,但需要注意的是,您正在向服务器发送垃圾数据。如果有人知道如何设置一个事件来测试点击的图层功能,并根据哪个层发送到服务器,只在需要时将viewparams传递给服务器,并希望显示一个很好的示例。我只是讨厌将垃圾数据发送到服务器。在任何情况下,上述解决方法都可以工作,并从任何层的服务器返回数据。