OpenLayers で地図をグレースケールにしたり、乗算合成する方法です。
この記事は OpenLayers v3 時代に一度書いていましたが2019年11月にリリースされた v6 では CSS で実装可能になっていたので、メモとして残しておきます。

デモページ (Observable)
https://observablehq.com/@cieloazul310/openlayers-v6-blend-mode-and-filters

v6 の実装方法

v6 での実装は CSS で記述することができます。v5 以前のイベントによる実装に比べるととても簡単になりました。以下がサンプルコードです。

JavaScript

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import TileLayer from 'ol/layer/Tile';
import XYZSource from 'ol/source/XYZ';

// 地理院標準タイル
const layer = new TileLayer({
  className: 'hoge', // className を設定
  source: new XYZSource({
    url: 'https://cyberjapandata.gsi.go.jp/xyz/cjstd/{z}/{x}/{y}.png',
    attribution: '国土地理院',
  }),
});

CSS

1
2
3
4
.hoge {
  mix-blend-mode: multiply;
  filter: grayScale(1);
}

以上!

レイヤに className を設定し、CSS で mix-blend-modefilter を設定することで、地図の乗算合成やグレースケール化などが簡潔に実装できます。

広告

v5 以前の書き方

v5 以前はレイヤにイベントを実装し、レイヤの描写時に canvas の globalCompositeOperation 属性をいじることでレイヤの乗算合成やグレースケール化が可能でした。
この方法はイベント名を precomposeprerenderpostcomposepostrender に変更することで v6 でも利用することができます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// v5 以前は layer.on('precompose', (event) => {});
layer.on('prerender', (event) => {
  // 乗算合成
  event.context.globalCompositeOperation = 'multiply';
});

// v5 以前は layer.on('postcompose', (event) => {});
layer.on('postrender', (event) => {
  // 元に戻す
  event.context.globalCompositeOperation = 'source-over';
});

So We Won’t Forget / Khruangbin (2020)

広告