【问题标题】:OpenLayers 2 WMSGetFeatureInfo getfeatureinfo not selecting featureOpenLayers 2 WMSGetFeatureInfo getfeatureinfo未选择功能
【发布时间】:2015-11-12 23:59:03
【问题描述】:

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

// 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中的特征时没有返回任何特征:

换句话说,jsonObject.features.length 在单击 layer02 中的功能时始终为零。当点击 layer01 的一个特征时,jsonObject.features.length 等于一:

function selectedFeaturesParse(jsonObject) {

            selectedFeatures = [];

            for (var i = 0 ; i < jsonObject.features.length; i++) {
...
}

我将后端作为地理服务器,并且两个层的配置相同。一层是表(layer01),另一层是sql视图查询(layer02)。为什么单击 layer02 中的要素时找不到要素?谢谢。

【问题讨论】:

    标签: openlayers


    【解决方案1】:

    发现问题,这似乎是一个错误。您首先使用 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],
    ...
    

    然后这里是错误:当服务器调用完成以获取功能信息时,它没有将视图参数传递回服务器! (虽然你在创建图层的时候已经定义了参数,把整个图层传给了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 没有参数,但是当服务器调用时,它仍然将额外的参数传递给服务器。它有效,但需要注意的是您正在向服务器发送垃圾数​​据。如果有人知道如何设置一个事件来测试单击的图层功能,并且根据将哪个图层发送到服务器,则仅在需要时将视图参数传递给服务器并希望展示一个很棒的示例。我只是讨厌向服务器发送垃圾数​​据。在任何情况下,上述解决方法都有效并从服务器返回任何层的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-08
      相关资源
      最近更新 更多