洪水発生(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 番目のステートメントは、発生画像がコードエディタのインタラクティブ マップに追加されます。

コードエディタの [実行] ボタンをクリックします。数秒後、図 1 のように、海岸線に沿って灰色で塗りつぶされた地図が表示されます。

デフォルトの可視化
図 1. 地球上の地表水の発生状況のデータレイヤのデフォルトの可視化。

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

値の検査

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

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

上記の例では、value という名前のレイヤの値は 98 です。単位はパーセンテージ ポイントです。つまり、約 98% の時間で、その場所は水で覆われていると分類されました。値は、月ごとの地表水発生値の平均値です。これは、 データ ユーザー ガイド(v2) で説明されているように、季節変動に対して正規化されています。

コードを改善するためのリファクタリング

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

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

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

コードエディタ(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 ~ 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
});

次のセクションでは、水域の発生頻度が経時的にどのように変化したかを確認します。