В новой версии OpenLayers (OL3) я обнаружил, что показывать плитки OpenStreetMap (OSM) в оттенках серого нетривиально.

Это может быть полезно, если вы не хотите, чтобы цвета фона мешали информации о цвете переднего плана.

Способ решения этой проблемы OpenLayers 2 больше не действует в OL3. Мое решение в основном основано на этом другом примере.

Решение

Часть 1: преобразование каждого пикселя в серый

Прокрутите все пиксели плитки, получите его RGB, вычислите яркость пикселя и установите его обратно как новый RGB:

// function applies greyscale to every pixel in canvas
function greyscale(context) {
var canvas = context.canvas;
 var width = canvas.width;
 var height = canvas.height;
var imageData = context.getImageData(0, 0, width, height);
 var data = imageData.data;
for(i=0; i<data.length; i += 4){
  var r = data[i];
  var g = data[i + 1];
  var b = data[i + 2];
  // CIE luminance for the RGB
  var v = 0.2126 * r + 0.7152 * g + 0.0722 * b;
  // Show white color instead of black color while loading new tiles:
  if(v === 0.0)
   v=255.0;  
  data[i+0] = v; // Red
  data[i+1] = v; // Green
  data[i+2] = v; // Blue
  data[i+3] = 255; // Alpha
 }
context.putImageData(imageData,0,0);
 
}

Часть 2: свяжите эту функцию с событием «отложить»

var grayOsmLayer = new ol.layer.Tile({
 source: new ol.source.OSM()
});
grayOsmLayer.on('postcompose', function(event) {
 greyscale(event.context);
});

Обратная связь

Есть ли у вас какие-либо отзывы? Пожалуйста, оставьте комментарий или отправьте мне сообщение.

Если вы нашли эту статью полезной, пожалуйста не забудьте 👏🏻. Спасибо!! :)