Ссылочные слои базовой карты (текст) игнорируют непрозрачность при изменении выбора?

Я пытаюсь сохранить непрозрачность слоя базовой карты на постоянном уровне между различными выборками (пользователь может управлять им с помощью ползунка). Любые слои базовой карты, которые не имеют связанного «опорного» слоя, ведут себя так, как ожидалось (т. е. если топографическая карта находится на уровне 25 % до перехода к изображениям, она будет обновлена ​​до 25 % при изменении). Если пользователь выбирает базовую карту, которая также имеет базовый слой (изображение с метками, светло-серое полотно и т. д.), эталонный слой игнорирует настройку непрозрачности при загрузке и изменится только ПОСЛЕ того, как пользователь попытается переместить ползунок. Мысли?

Забавный момент... Слой базовой карты «Terrain with Labels» полностью игнорирует это как для изображений, так и для текста при замене. Он почти выглядит так, как будто он обновляется после загрузки.

Вот рабочий пример в JSFiddle (http://jsfiddle.net/disuse/ez6mN/) и код додзё, который я использую для воспроизведения своей проблемы. Использование последней версии Esri ArcGIS Javascript 3.7.

Кодовый блок

var baseMap_Opacity;
var baseOpacity = 0.25;

require([
    "esri/map", 
    "esri/dijit/BasemapGallery",
    "dijit/form/HorizontalSlider",
    "dijit/form/HorizontalRule",
    "dijit/form/HorizontalRuleLabels",
    "dojo/parser",
    "dojo/dom",   
    "dojo/on", 
    "dojo/ready",
    "dojo/domReady!"
], function(
    Map,
    BasemapGallery,
    HorizontalSlider, 
    HorizontalRule, 
    HorizontalRuleLabels,
    parser,
    dom,
    on,
    ready
) {
ready(function() {
    map = new Map("map", {
        center: [-121.569, 39.00],
        zoom: 7,
        optimizePanAnimation: true,
        basemap: "topo"
    });
    var basemapGallery = new BasemapGallery({
      showArcGISBasemaps: true,
      map: map
    }, "basemaps");
    basemapGallery.startup(); 

    basemap = map.getLayer("layer0");
    basemap.setOpacity(baseOpacity);

    on(basemapGallery, "selection-change", function() {
       changeBasemapOpacity(baseOpacity); 
    });

    createHorzSlider();
});    

function createHorzSlider() {
    baseMap_Opacity = dom.byId("baseMap_Opacity");
    baseMap_Opacity.innerHTML = Math.round(baseOpacity*100) + "%";

    var horzSlider = new HorizontalSlider({
        minimum: 0,
        maximum: 1,
        value: baseOpacity,
        intermediateChanges: true,
        showButtons: true,
        discreteValues: 101,
        style: "width: 300px; margin-left: 25px;",
        onChange: function(value) {
            changeBasemapOpacity(value);
        }

    }, "horzSlider");    
    horzSlider.startup();   

    var horzSliderRule = new HorizontalRule({
       container: "bottomDecoration",
       count: 2 ,
       style: "height: 5px; width: 288px; margin-top: 5px; margin-left: 32px;"
    }, "horzSliderRule");
    horzSliderRule.startup();

    var horzSliderLabels = new HorizontalRuleLabels({
       container: "bottomDecoration",
       labels: ["0", "100"],
       style: "width: 288px; margin-left: 32px;",
       labelStyle: "font-style: normal; font-weight: bold; font-size: 14px;"
    }, "horzSliderLabels");
    horzSliderLabels.startup();
}  
function changeBasemapOpacity(value) {
    baseOpacity = value;
    baseMap_Opacity.innerHTML = Math.round(baseOpacity*100) + "%";

    var esriURL = "http://services.arcgisonline.com";

    var layers = map.getLayersVisibleAtScale();

    for (var i = 0; i < layers.length; i++) {
        var lyr = map.getLayer(layers[i].id);
        if ((lyr._basemapGalleryLayerType) || (lyr.id == "layer0") || ((lyr.url) && (lyr.url.indexOf(esriURL) == 0))) {
            lyr.setOpacity(baseOpacity);
        }    
    }

}    
});

person disuse    schedule 17.10.2013    source источник
comment
Добро пожаловать в СО. +1 за отличное качество вашего вопроса. Держись в том же духе! ;)   -  person dic19    schedule 18.10.2013


Ответы (1)


Событие selection-change галереи базовых карт запускается после того, как вновь выбранная базовая карта появится на карте. Это срабатывает перед добавлением опорных слоев и является предполагаемым дизайном, идея которого заключается в том, что вы не захотите манипулировать опорными слоями. В вашем случае это не то, что вы хотите, поэтому использование изменения выбора отсутствует.

Чтобы выполнить то, что вы хотите, используйте событие layer-add-result карты и проверьте, является ли layer._basemapGalleryLayerType правдивым. Если это так, вы знаете, что слой, используемый галереей базовых карт, был добавлен на карту, и вам следует изменить его непрозрачность. Вот фрагмент кода:

map.on("layer-add-result", function(e) {
    if ( e.layer._basemapGalleryLayerType ) {
        e.layer.setOpacity(baseOpacity);
    }
});

Что касается проблемы с базовой картой Terrain with Labels, то все работает как положено. Поскольку эталонный слой этой базовой карты включает в себя метки, а также политические границы и основные дороги, создается впечатление, что непрозрачность не применяется, хотя на самом деле это так. Использование приведенного выше кода установит непрозрачность для обоих слоев, представляющих ландшафт. базовая карта, а также эталонный слой.

Вот модифицированная версия вашей страницы, которая, я думаю, выполняет то, что вы хотите: http://jsbin.com/IyixAPa/1/edit

person Derek Swingley    schedule 18.10.2013
comment
Привет Дерек. Это прекрасно работает и намного проще, чем то, что я пытался сделать. Не догадался посмотреть на это из события layer-add-result. Я принял это как ответ. - person disuse; 18.10.2013
comment
Похоже, изначально ползунок не работает из-за того, что _basemapGalleryLayerType не добавляется к базовой карте при запуске карты. Добавление следующего кода, кажется, помогает: if ( (lyr._basemapGalleryLayerType) || (lyr.id == "layer0") ) { - person disuse; 18.10.2013