GeoExt.LayerOpacitySlider не работает на слоях WMS, есть идеи, почему?

#javascript #slider #openlayers #opacity #geoext

#javascript #слайдер #openlayers #непрозрачность #geoext

Вопрос:

У меня есть веб-сайт, использующий OpenLayers и библиотеку GeoExt. Моя цель — иметь ползунок непрозрачности для каждого из моих слоев (у меня 5 слоев). Прямо сейчас он работает с моим векторным слоем, но не с моими слоями WMS. Я попробовал с базовым слоем (открытая карта улиц), и он работает нормально.

Это код, который создает слой:

 //This part is inside an "if success" in an ajax request.   
map.addLayer(new OpenLayers.Layer.WMS(openlayers_wms_layer_analyses, CMCDataServer, {
layers: analysesWMSLayer[currentStatePeriod],
styles: analysesWMSStyle[currentStatePeriod],
format: "image/png",
transparent: true,
time: currentStateDate.getUTCFullYear()   "-"   ('0'   (currentStateDate.getUTCMonth()   1)).slice(-2)   "-"   ('0'   currentStateDate.getUTCDate()).slice(-2)   "T"   timeChopArray[currentStateIndex]   ":00:00Z"
     },
{
     opacity: 0.73,
     visibility: true
 }));
Ext.getCmp('analyses_validity_display_extjs').setValue(extjs_gui_state_panel_valid_analyses);
Ext.getCmp('extjs_gui_legend_tab_panels').setActiveTab(0);
} else {
    Ext.getCmp('analyses_validity_display_extjs').setValue(extjs_gui_state_panel_invalid_analyses);
    Ext.Msg.alert(extjs_gui_analyses_missing_warning_title, extjs_gui_analyses_missing_warning);
    Ext.getCmp('analyses_checkbox_extjs').setValue(false);
    }
}
});

//This part is a little lower in my code, it's an "else" after the ajax request on top. 
}else if(map.getLayersByName(openlayers_wms_layer_analyses).length!=0){
    adjustStatePanelAnalysesValidity();
    map.removeLayer(map.getLayersByName(openlayers_wms_layer_analyses)[0]);
}
    adjustStatePanelProducts(checkbox, checked);
}
  

И это код моего слайдера:

 new GeoExt.LayerOpacitySlider({
       width: 100,
       value: 100,
       layer: map.getLayersByName(openlayers_wms_layer_analyses)[0],
       aggressive: true, 
       style: {
            position: 'absolute',
            left: '150px'
       }
 }), 
  

Я использую тот же точный код для слайдера моего векторного слоя, и он работает нормально. И если я изменю имя слоя на свой базовый слой, он также будет работать нормально. Я не могу думать, что это потому, что я не выбираю правильный слой, поскольку я использую имя, используемое при создании слоя. Если вы проверите способ удаления слоя, вы увидите, что он использует ту же строку, что и я, вот так: map.removeLayer(map.getLayersByName(openlayers_wms_layer_analyses)[0]);

Не могли бы вы мне помочь, пожалуйста?

ОБНОВЛЕНИЕ: я написал map.getLayersByName(openlayers_wms_layer_analyses)[0] в консоли javascript. Если я не установил флажок, чтобы увидеть слой, я получаю ‘undefined’, но если он установлен и я вижу слой, я вижу слой правильно. Что означает, что мой слайдер должен работать .. нет?

Ответ №1:

Наконец, GeoExt.LayerOpacitySlider, похоже, вообще не работает, когда слой создается «на лету». Я думаю, что для этого нужно, чтобы слой был создан до создания слайдера (что для меня не имеет никакого смысла). Я полагаю, это была ошибка в GeoExt.

Моим решением было создать «стандартный» внешний слайдер, который изменяет непрозрачность. Это сработало отлично, это код, который я использовал, если у вас такая же проблема:

 new Ext.Slider({
    width: 125,
    value: 73,
    listeners: {
        change: function(analysesSlider, val) {
             map.getLayersByName(openlayers_wms_layer_analyses)[0].setOpacity(val/100);
         }},
     style: 'position:absolute; left:135px;'
      }),