洪水発生(1984 ~ 2015 年)

GSW データセットには、さまざまな方法で地表水データを表す多くのデータレイヤが含まれています。まず、1984 年 3 月から 2015 年 10 月までの全期間にわたって、地表水がどこでどの程度の頻度で発生したかの概要を示す、水発生レイヤを可視化します。

このセクションでは、次の操作を行います。

  1. 地表水の発生を可視化する地図のレイヤを追加し、
  2. 地図のレイヤの値をクエリする方法、
  3. カスタム スタイルを追加してビジュアリゼーションを改善する
  4. しきい値を使用してバイナリ水マスクレイヤを作成する
  5. 地図の中心を世界の興味深い場所に移動したり、
  6. スクリプトをリファクタリングして、可読性と保守性を高める方法を示します。

基本的なビジュアリゼーションの作成

まず、次のステートメントをコードエディタにコピーします。

コードエディタ(JavaScript)

var gsw = ee.Image('JRC/GSW1_0/GlobalSurfaceWater');
var occurrence = gsw.select('occurrence');
Map.addLayer(occurrence);

最初のステートメントは、GSW データセットの Earth Engine Image オブジェクトを参照し、gsw という名前の変数に格納します。2 番目のステートメントは、GSW データセットの単一レイヤを選択し、occurrence という変数に格納します。3 番目のステートメントは、出現画像(occurrence image)をコードエディタのインタラクティブな地図に追加します。

コードエディタの [Run] ボタンをクリックすると、数秒後に図 1 のように海岸線に沿って灰色で色付けされた地図が表示されます。

デフォルトのビジュアリゼーション
図 1. 世界の地表水の発生データレイヤのデフォルトの可視化。

ほとんどの地域では、GSW データセットは透明に見えます。これは、Landsat 画像が収集されなかった場所(海洋地域など)や、32 年間の観測で水が検出されなかった場所が マスクアウトされているためです。

値の検査

水域発生レイヤの値を確認するには、コードエディタのインスペクタ タブを使用します。まず、インスペクタ タブをクリックし、次に地図をクリックして場所を選択します。インスペクタ タブには、クリックした場所に存在する各レイヤに関する情報が表示されます。

[インスペクタ] タブ
図 2. [Inspector] タブの出力例。

上記の例では、value という名前のレイヤの値は 98 です。単位はパーセント ポイントです。つまり、この場所は、約 98% の期間、水に覆われていると分類されました。この値は、 Data Users Guide(v2) に記載されているように、季節変動に対して正規化された、毎月の地表水発生値の平均です。

リファクタリングによるコードの改善

このスクリプトには 2 つのステートメントしかありませんが、コードをリファクタリングして、最終的なスクリプトを読みやすく、メンテナンスしやすくする機会がすでにあります。現在、Map.addLayer() ステートメントは、地図に表示する Earth Engine 画像オブジェクトである occurrence という単一の引数を渡します。ただし、Map.addLayer() メソッドには追加の引数を渡すこともできます。使用可能な引数をすばやく確認するには、開きかっこの後にカーソルを置き、「コード候補を表示」のキーボード ショートカットを押して、addLayer メソッドのヘルプ ドキュメントを表示します。(キーボード ショートカットは、メニューの [ヘルプ] -> [ショートカット] を選択すると表示されます)。

Map.addLayer の引数
図 3. addLayer メソッドの引数を示すスクリーンショット。

キーボード ショートカットは、Map.addLayer に渡すことができる 5 つの引数(eeObject、visParams、name、shown、opacity)を示しています。現在のスクリプトでは、最初の引数 eeObject として解釈される単一の変数 occurrence を渡しています。変数オブジェクトと、レイヤに名前を付ける追加の引数の両方を渡すには、コードをリファクタリングして「名前付き引数」(eeObject と name)を使用します。これらの引数は、以下に示すように、 JSON データ構造 内からメソッドに渡されます。

コードエディタ(JavaScript)

Map.addLayer({eeObject: occurrence, name: 'Water Occurrence (1984-2015)'});

コードを再度実行し、リファクタリングの変更後も引き続き動作することを確認します。 結果のマップは変更されません。

ビジュアリゼーション パラメータの追加

次に、デフォルトの可視化パラメータを改善します。デフォルトのパラメータでは、水が灰色で表示されます。変数 VIS_OCCURRENCE を作成する新しいステートメントを追加し、addLayer メソッドに追加の引数として渡します。

コードエディタ(JavaScript)

var VIS_OCCURRENCE = {
  min: 0,
  max: 100,
  palette: ['red', 'blue']
};

コードエディタ(JavaScript)

Map.addLayer({
  eeObject: occurrence.updateMask(occurrence.divide(100)),
  name: 'Water Occurrence (1984-2015)',
  visParams: VIS_OCCURRENCE
});

JSON 構造 VIS_OCCURRENCE に格納されている可視化パラメータは、最小値 0% に赤、最大値 100% に青を使用することを示しています。.updateMask(occurrence.divide(100)) を追加すると、ピクセルの不透明度 / 透明度が、出現値に基づいて設定されます。

スクリプトを再度実行し、スタイル変更による修正結果を確認します。

地表水の発生
図 4. ブエノスアイレス近郊のパラナデルタの水発生のスクリーンショット。0% の最小値エンドポイントには透明な赤色、最大値エンドポイントには単色の青色を使用しています。

水域が青色になりました。地図がずいぶん仕上がってきました。

しきい値レイヤの作成

水発生画像には、0 ~ 100% の範囲の値を使用して、水が予想される頻度に関する情報が含まれています。ただし、バイナリの水レイヤ(「水」と「水以外」)に分類します。この単純なバイナリレイヤを、他の GSW レイヤを配置できるクリーンな背景レイヤとして使用します。このしきい値レイヤを作成するには、次のステートメントを使用します。このステートメントでは、90% のしきい値を使用して水と水以外を分離します。

まず、ウォーターマスクのスタイル情報を保持する新しい可視化変数 VIS_WATER_MASK を定義します。

コードエディタ(JavaScript)

var VIS_WATER_MASK = {
  palette: ['white', 'black']
};

次に、比較演算子 .gt(90) を使用して水マスクレイヤを計算し、.unmask() メソッドを使用して、以前にマスクされた領域をゼロに設定します。

コードエディタ(JavaScript)

// Create a water mask layer, and set the image mask so that non-water areas
// are opaque.
var water_mask = occurrence.gt(90).unmask(0);

最後に、レイヤを地図に追加します。このレイヤを他のすべてのレイヤの下にレンダリングするには、他の Map.addLayer ステートメントの前に次のステートメントを配置します。

コードエディタ(JavaScript)

Map.addLayer({
  eeObject: water_mask,
  visParams: VIS_WATER_MASK,
  name: '90% occurrence water mask'
});
90% の水マスク
図 5. ブエノスアイレス近郊のパラナ デルタの 90% 水マスクのスクリーンショット。

世界の興味深い場所に行く

パンやズームで世界中を探索するのは楽しいものですが、世界は広大なので、特定の場所に直接ジャンプできると便利です。以下の一連のステートメントは、地表水に関して興味深い場所の小さなサンプルを提供します。 一度に 1 つのステートメントのコメント化を解除すると、スクリプトの実行時にその場所に移動します。

コードエディタ(JavaScript)

// Uncomment one of the following statements to center the map.
// Map.setCenter(-90.162, 29.8597, 10);   // New Orleans, USA
// Map.setCenter(-114.9774, 31.9254, 10); // Mouth of the Colorado River, Mexico
// Map.setCenter(-111.1871, 37.0963, 11); // Lake Powell, USA
// Map.setCenter(149.412, -35.0789, 11);  // Lake George, Australia
// Map.setCenter(105.26, 11.2134, 9);     // Mekong River Basin, SouthEast Asia
// Map.setCenter(90.6743, 22.7382, 10);   // Meghna River, Bangladesh
// Map.setCenter(81.2714, 16.5079, 11);   // Godavari River Basin Irrigation Project, India
// Map.setCenter(14.7035, 52.0985, 12);   // River Oder, Germany & Poland
// Map.setCenter(-59.1696, -33.8111, 9);  // Buenos Aires, Argentina
Map.setCenter(-74.4557, -8.4289, 11);  // Ucayali River, Peru

これは、興味深い場所のほんの一例です。独自の質問を追加することもできます。

リファクタリング、再び...

GSW データセットの次のレイヤに進む前に、コードのリファクタリングをもう少し行います。具体的には、類似したステートメントをグループ化し、コードをアセット、定数、計算、地図の中央揃え、地図のレイヤの追加のセクションに分割するコメントを追加します。

リファクタリングされた最終的なスクリプトは次のとおりです。

コードエディタ(JavaScript)

//////////////////////////////////////////////////////////////
// Asset List
//////////////////////////////////////////////////////////////

var gsw = ee.Image('JRC/GSW1_0/GlobalSurfaceWater');
var occurrence = gsw.select('occurrence');

//////////////////////////////////////////////////////////////
// Constants
//////////////////////////////////////////////////////////////

var VIS_OCCURRENCE = {
  min: 0,
  max: 100,
  palette: ['red', 'blue']
};
var VIS_WATER_MASK = {
  palette: ['white', 'black']
};

//////////////////////////////////////////////////////////////
// Calculations
//////////////////////////////////////////////////////////////

// Create a water mask layer, and set the image mask so that non-water areas
// are opaque.
var water_mask = occurrence.gt(90).unmask(0);

//////////////////////////////////////////////////////////////
// Initialize Map Location
//////////////////////////////////////////////////////////////

// Uncomment one of the following statements to center the map.
// Map.setCenter(-90.162, 29.8597, 10);   // New Orleans, USA
// Map.setCenter(-114.9774, 31.9254, 10); // Mouth of the Colorado River, Mexico
// Map.setCenter(-111.1871, 37.0963, 11); // Lake Powell, USA
// Map.setCenter(149.412, -35.0789, 11);  // Lake George, Australia
// Map.setCenter(105.26, 11.2134, 9);     // Mekong River Basin, SouthEast Asia
// Map.setCenter(90.6743, 22.7382, 10);   // Meghna River, Bangladesh
// Map.setCenter(81.2714, 16.5079, 11);   // Godavari River Basin Irrigation Project, India
// Map.setCenter(14.7035, 52.0985, 12);   // River Oder, Germany & Poland
// Map.setCenter(-59.1696, -33.8111, 9);  // Buenos Aires, Argentina
Map.setCenter(-74.4557, -8.4289, 11);  // Ucayali River, Peru

//////////////////////////////////////////////////////////////
// Map Layers
//////////////////////////////////////////////////////////////

Map.addLayer({
  eeObject: water_mask,
  visParams: VIS_WATER_MASK,
  name: '90% occurrence water mask',
  shown: false
});
Map.addLayer({
  eeObject: occurrence.updateMask(occurrence.divide(100)),
  name: 'Water Occurrence (1984-2015)',
  visParams: VIS_OCCURRENCE
});

次のセクションでは、水の発生が時間の経過とともにどのように変化したかを調べます。