画像を使用した計算

画像を読み込んで表示する方法を理解したので、次は画像に計算を適用します。たとえば、SRTM 標高画像を ee.Terrain パッケージの slope メソッドに渡すことで、地形の傾斜を計算できます。

コードエディタ(JavaScript)

// Load the SRTM image.
var srtm = ee.Image('CGIAR/SRTM90_V4');

// Apply an algorithm to an image.
var slope = ee.Terrain.slope(srtm);

// Display the result.
Map.setCenter(-112.8598, 36.2841, 9); // Center on the Grand Canyon.
Map.addLayer(slope, {min: 0, max :60}, 'slope');

コード ee.Terrain.slope(srtm) では、srtm 画像が傾斜アルゴリズムの引数として提供されています。結果は図 3 のようになります。

Tutorial_api_03_slope.png
図 3. スロープの画像。

画像演算

ee.Image クラスには、画像オブジェクトで呼び出すことができるメソッドもあります。たとえば、画像バンドを使用して数学演算を行う場合(バンド演算やマップ代数とも呼ばれます)。たとえば、傾斜面画像に対する三角関数演算に関心がある場合があります。そのためには、まずアスペクト比の画像をラジアンに変換してから、その画像に対して sin() を呼び出します。srtm イメージを再利用します。

コードエディタ(JavaScript)

// Get the aspect (in degrees).
var aspect = ee.Terrain.aspect(srtm);

// Convert to radians, compute the sin of the aspect.
var sinImage = aspect.divide(180).multiply(Math.PI).sin();

// Display the result.
Map.addLayer(sinImage, {min: -1, max: 1}, 'sin');

結果は図 4 のようになります。aspect.divide(180).multiply(Math.PI).sin() コードを詳しく見てみましょう。このように複数のメソッドをチェーンすることで、「アスペクトを 180 で割り、その結果に π を掛け、最後に sin を取る」というコードになります。このようにメソッドを組み合わせることで、画像に対して複雑な数学演算を実行できます。数学演算、add()subtract()multiply() などの完全なリストについては、Image ドキュメントをご覧ください。

Tutorial_api_04_sin.png
図 4. 地形の向きの正弦。

画像の統計情報

画像に対するもう 1 つの有用なオペレーション クラスは、画像領域またはラスター ベクター オーバーレイでのピクセル統計の計算です。Earth Engine で統計情報を計算するには、ee.Reducer パッケージのクラスで表されるリデューサーを使用します。たとえば、特定の地域の標高の平均に関心があるとします。リージョンは、ジオメトリ描画ツールを使用してポリゴンを描画することで定義できます。リージョンをインタラクティブに描画するには、ポリゴン描画ツール()を取得し、対象領域にポリゴンをデジタイズして、完了したら [終了] をクリックします。結果の ee.Geometry オブジェクトには自動的に geometry という名前が付けられ、スクリプトの先頭にインポートとして追加されます。インポートの変数名をクリックして新しい名前を入力し、その変数の名前を「polygon」に変更します。

次に、次のコードを使用して、ポリゴンの平均ピクセル値を取得します。

コードエディタ(JavaScript)

// Compute the mean elevation in the polygon.
var meanDict = srtm.reduceRegion({
  reducer: ee.Reducer.mean(),
  geometry: polygon,
  scale: 90
});

// Get the mean from the dictionary and print it.
var mean = meanDict.get('elevation');
print('Mean elevation', mean);

ここで注意すべき点がいくつかあります。まず、reduceRegion()Image オブジェクトで使用できるメソッドであることに注意してください(リージョンの削減の詳細はこちら)。2 つ目は、メソッド引数が JavaScript オブジェクトで提供され、単一の引数として渡されることです。(具体的には、オブジェクトのキーはメソッド パラメータの名前です。値はメソッドの引数です。3 つ目は、reducer パラメータで計算する統計情報のタイプを指定し、geometry パラメータで統計情報を計算するリージョンを指定します。scale パラメータは、使用するピクセルサイズ(メートル単位)です。あいまいさを避けるため、縮小を行う場合は常にスケールを指定する必要があります。Earth Engine は入力から適切なスケールを自動的に決定できない場合があります。(Earth Engine のスケールについて)。

最後に、reduceRegion() の戻り値は、キーがバンド名で値がバンドのピクセル統計情報である辞書です。辞書の get() メソッドは、引数として指定されたキーに対応する値を返します。この場合、srtm 画像には「標高」という 1 つのバンドがあるため、サンプルコードは辞書からその統計情報を取得して出力します。

このコードを実行したときに、次のようなエラーが表示された場合:

ご安心ください。このエラーを解決するには、次の方法をお試しください。reduceRegion() メソッドには、計算にそれほど多くのピクセルを含める必要があるかどうかを検討するためのチェックがあります。これは、世界中の 1 メートルのピクセルの平均を計算しようとするような、ばかげたことを誤って行わないようにするためのものです(そのようなことはしないでください)。このエラーを解決するには、bestEffort パラメータを true に設定するか(パラメータの辞書に bestEffort: true を追加)、maxPixels パラメータをデフォルトの 1,000 万ピクセルより大きい値に設定します。または、両方を設定します。bestEffort が true の場合、Earth Engine は maxPixels を超えないようにスケールを自動的に再計算します。

補足: Earth Engine のスケール

前の例では、scale は SRTM 画像のネイティブ解像度に近い値に設定されています。画像のネイティブ解像度は、次の方法で確認できます。

コードエディタ(JavaScript)

var scale = srtm.projection().nominalScale();
print('SRTM scale in meters', scale);

ネイティブ解像度よりも小さいスケールを指定すると、Earth Engine は最近傍法を使用して入力画像をリサンプリングし、それらの小さいピクセルをすべて計算に含めます。スケールを大きく設定すると、Earth Engine は入力の集約バージョンから入力ピクセルを使用します(つまり、画像ピラミッドの上位レベルからピクセルを取得します)。Earth Engine でのスケールの処理方法については、こちらのドキュメントをご覧ください。

これまでは、単一のバンドを持つ単一の画像を扱ってきました。次のページでは、マルチバンド画像と画像コレクションについて説明します。