OpenLayers - фильтр изображений для разных слоев - PullRequest
0 голосов
/ 20 ноября 2018

на основе этого урока: https://openlayers.org/en/latest/examples/image-filter.html Я хочу применить фильтр к моим различным слоям.Для достижения этой цели у меня есть массив группы.var groupsMap = []; Мои группы:

  • OSM
  • Here WeGo Map
  • Stamen Map
  • Bing Map

Например, для карты Bing у меня есть:

function bingMaps() {
  var layers = [];
  var i;
  for (i = 0; i < bingStyles.length; ++i) {
    layers.push(new ol.layer.Tile({
      visible: false,
      preload: Infinity,
      source: new ol.source.BingMaps({
        key: KEY_BING, //'Your Bing Maps Key from http://www.bingmapsportal.com/ here',
        imagerySet: bingStyles[i]
        // use maxZoom 19 to see stretched tiles instead of the BingMaps
        // "no photos at this zoom level" tiles
        // maxZoom: 19
      })
    }));
  }

  var bingLayers = new ol.layer.Group({
    title: "Bing",
    layers: layers
  });

  // return bingLayers;
  groupsMap.push(bingLayers);
}

Каждый слой доступен на боковой панели следующим образом:

for (var i = 0; i < layers.length; ++i) {
      if (groupSelected.values_.title === "Bing") {
        layers[i].setVisible(bingStyles[i] === layerSelected);
      }
...
}

В конце я установил свои фильтры:

var selectedKernel = normalize(kernels["sharpen"]);
$('.selected-filter').on("click",function () {
    var filterSelected = $(this).attr("value");
    console.log(filterSelected);
    selectedKernel = normalize(kernels[filterSelected]);
    map.render();
 });

Для настройки фильтров для ВСЕХ моих слоев единственное решение, которое, кажется, работает, это:

var layers = groupsMap[0].values_.layers.array_;
  // var layers = groupsMap.getLayers().array_;
  for (var i = 0; i < layers.length; i++) {
    layers[i].on('postcompose', function (event) {
      convolve(event.context, selectedKernel);
    });
  }

  var layers = groupsMap[1].values_.layers.array_;
  // var layers = groupsMap.getLayers().array_;
  for (var i = 0; i < layers.length; i++) {
    layers[i].on('postcompose', function (event) {
      convolve(event.context, selectedKernel);
    });
  }

  var layers = groupsMap[2].values_.layers.array_;
  // var layers = groupsMap.getLayers().array_;
  for (var i = 0; i < layers.length; i++) {
    layers[i].on('postcompose', function (event) {
      convolve(event.context, selectedKernel);
    });
  }

  var layers = groupsMap[3].values_.layers.array_;
  // var layers = groupsMap.getLayers().array_;
  for (var i = 0; i < layers.length; i++) {
    layers[i].on('postcompose', function (event) {
      convolve(event.context, selectedKernel);
    });
  }

Фактически, если я пытаюсь использовать цикл:

for(var i = 0; i < groupsMap.length; i++){ 
    var layers = groupsMap[i].values_.layers.array_;
    // var layers = groupsMap.getLayers().array_;
    for (var i = 0; i < layers.length; i++) {
        layers[i].on('postcompose', function (event) {
          convolve(event.context, selectedKernel);
        });
    }
  }

или:

for(var i = 0; i < groupsMap.length; i++){ 
    var layers = groupsMap[i].values_.layers.array_;
    applyFilter(map.getLayers().array_,selectedKernel);
  }

не работает .в частности не работает map.render(), метод, определенный до.Зачем ?Может кто-нибудь помочь мне понять, почему это не работает?Мое первое решение работает, но оно действительно плохое ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...