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并从服务器返回任何层的数据