OpenLayers 2 WMSGetFeatureInfo getfeatureinfo未选择功能

OpenLayers 2 WMSGetFeatureInfo getfeatureinfo未选择功能,openlayers,Openlayers,我已经创建了一个特征选择器层: // Add Feature Picker featurePicker = new OpenLayers.Control.WMSGetFeatureInfo({ url: "http://server01:8080/geoserver/sf/wms", title: 'identify features on click', layers: [l

我已经创建了一个特征选择器层:

// 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等于一:

function selectedFeaturesParse(jsonObject) {

            selectedFeatures = [];

            for (var i = 0 ; i < jsonObject.features.length; i++) {
...
}
函数选择功能稀疏(jsonObject){
selectedFeatures=[];
对于(var i=0;i

我将后端配置为geoserver,两个层的配置相同。一层是表(layer01),另一层是sql视图查询(layer02)。为什么在单击layer02中的功能时找不到这些功能?谢谢。

发现了问题,这似乎是一个错误。您首先使用viewparams定义一个层(在本例中,查询层“layer02”具有参数)。然后将该层传递给新的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对象时,必须再次定义参数):

然后创建使用vendorParams传递viewparams参数的方法:

// This method is called by the picker to setup params
function beforeGetFeatureInfo(e)
{
  e.object.vendorParams = {  viewparams:"username:bob" };
}

注意:使用此解决方法的一个糟糕之处是,无论您单击哪个图层功能,它都会将参数传递回服务器。在上面的示例中,layer01没有参数,但在进行服务器调用时,它仍会将额外的参数传递给服务器。它可以工作,但需要注意的是,您已经将垃圾数据发送到服务器。如果有人知道如何设置事件以测试单击的层功能,并且取决于发送到服务器的层,则仅在需要时将viewparams传递到服务器,并希望显示一个非常好的示例。我只是讨厌将垃圾数据发送到服务器。在任何情况下,上述解决方法都是可行的ks并从服务器返回任何层的数据。

发现问题,这似乎是一个错误。首先使用viewparams定义一个层(在本例中,查询层“layer02”有一个参数)。然后将该层传递给新的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对象时,必须再次定义参数):

然后创建使用vendorParams传递viewparams参数的方法:

// This method is called by the picker to setup params
function beforeGetFeatureInfo(e)
{
  e.object.vendorParams = {  viewparams:"username:bob" };
}
注意:使用此解决方法的一个糟糕之处是,无论您单击哪个图层功能,它都会将参数传递回服务器。在上面的示例中,layer01没有参数,但在进行服务器调用时,它仍会将额外的参数传递给服务器。它可以工作,但需要注意的是,您已经将垃圾数据发送到服务器。如果有人知道如何设置事件以测试单击的层功能,并且取决于发送到服务器的层,则仅在需要时将viewparams传递到服务器,并希望显示一个非常好的示例。我只是讨厌将垃圾数据发送到服务器。在任何情况下,上述解决方法都是可行的ks并从服务器返回任何层的数据