OpenLayers 2 WMSGetFeatureInfo getfeatureinfo不选择功能

时间:2015-11-04 15:59:53

标签: openlayers

我创建了一个功能选择器层:

// 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中的某个功能时找不到这些功能?感谢。

1 个答案:

答案 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传递给服务器,并希望显示一个很好的示例。我只是讨厌将垃圾数据发送到服务器。在任何情况下,上述解决方法都可以工作,并从任何层的服务器返回数据。