2018/06/06

文系のための「Map Linker」

Google Earth Engine(GEE)を使っていると、
複数の解析画像を同時に並べて表示したいことがある。
実は、GEECode Editor ではそういったことも可能になる。

とにかく、こんな感じのことをやってみたい。できれば、連動してもらいたい。



ということで、まずは、Landsat 8 の画像を取得することにする。
時期の範囲は2016年1月1日〜2016年12月31日とし、
場所は奈良の平城旧跡が入る範囲とする。

もちろん、Langsat 8ImageCollectionから選ぶのは雲が最も少ない画像

//   Landsat 8 の画像から一枚の画像を取得する
var beginning = '2016-01-01';
var ending = '2016-12-31';
var heijou = ee.Geometry.Point(135.791605, 34.6881882);

var ln8_2016 = ee.Image(landsat8
                .filterDate(beginning, ending)
                .filterBounds(heijou)
                .sort("CLOUD_COVER")
                .first()
);

次に、可視化する際の可視化パラメータを変数として定義しておく。

// トゥルーカラーパレットを定義する。
var trueColorParam = {
  bands: ['B4', 'B3', 'B2'],
  gamma: 1,
  max: 12000,
  min: 5000
};

// フォールスカラーパレットを定義する。

var falseColorParam = {
  bands: ['B5', 'B4', 'B3'],
  gamma: 1,
  max: 12000,
  min: 5000
}

// ナチュラルカラーパレットを定義する。
var naturalColorParam = {
  bands: ['B4', 'B5', 'B3'],
  gamma: 1,
  max: 12000,
  min: 5000
}

最初にするべきことはMapオブジェクトを作ること。
今回の場合、トゥルーカラー、フォールスカラー、ナチュラルカラーに対応するように、
それぞれの画像に対応した、三つのMapオブジェクトを準備しておく必要がある。

// Mapオブジェクトをインスタンス化する
var map_true = ui.Map();        // トゥルーカラー用の Map
var map_false = ui.Map();       // フォールスカラー用の Map
var map_natural = ui.Map();     // ナチュラルカラー用の Map

そして、それぞれのMapオブジェクトに対応する画像を追加していく。
よく見ると、これまでに使ってきた「Map.addLayer()」と全く同じ。
既定の「Map」インスタンスではなく、新しく作ったMapオブジェクトに追加する。

// それぞれのレイヤにそれぞれの画像を追加する。
map_true.addLayer(ln8_2016, trueColorParam, 'True Color');
map_false.addLayer(ln8_2016, falseColorParam, 'False Color');
map_natural.addLayer(ln8_2016, naturalColorParam, 'Natural Color');

単に表示させるだけであれば、飛ばしても良いのであるが、
少しでも見栄えがよくなるように、
タイトル・ラベルとレイヤー・マネージャーも追加しておく。

まずは、タイトル・ラベル。各々のレイヤに追加していく。

// それぞれのMapにタイトルラベルを追加する。
map_true.add(ui.Label('True Color'));
map_false.add(ui.Label('False Color'));
map_natural.add(ui.Label('Natural Color'));

次に、レイヤー・マネージャーも追加しておく。

// それぞれのMapにレイヤー・マネージャーを追加する。
map_true.setControlVisibility(true);
map_false.setControlVisibility(true);
map_natural.setControlVisibility(true);

複数のマップの同時表示には複数のマップを格納するための「器」が必要となる。
ここでは「maps」という名前を定義し、初期値として「空の配列」をセットする。
そして、これまでに使ってきたMapオブジェクトを配列に放り込む

// 複数のマップオブジェクトを格納するための空の配列を定義する。
var maps = [];

// それぞれのMapを配列に追加する。
maps.push(map_true);
maps.push(map_false);
maps.push(map_natural);

以上で準備完了。あとは、それぞれのマップ・オブジェクトを連動させる。
このときに用いるのがLinkerオブジェクトである。
複数のマップが格納された配列「maps」をそのまま入れてインスタンス化する。

そして、最後の仕上げとしてUIをリセットして完了!

// マップ・リンカーオブジェクトを作って、複数のマップを連動させる
var linker = ui.Map.Linker(maps);

// UIをリセットする。
ui.root.widgets().reset(maps);

これで、今回作成した三つのマップは横三つに並び、
表示位置も連動してくれるはず。
試しに、三つのマップの中でひとつ目のMapの中心を指定してみる。

// 地図の中心をひとつ目のマップのオブジェクトの衛星画像に設定する。
maps[0].centerObject(ln8_2016, 9);


これで三つのマップが連動して動けば完了。 Creative Commons License
This work is licensed under a Creative Commons Attribution 4.0 International License.

0 件のコメント:

コメントを投稿