#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;'
}),