スケール

Earth Engine で得られた科学的な結果を解釈するには、Earth Engine がスケールをどのように処理するかを理解することが重要です。ここで、スケールとはピクセル解像度を意味します。他の GIS や画像処理プラットフォームとは異なり、分析のスケールは入力ではなく出力から決定されます。具体的には、結果、表示する画像、統計情報などをリクエストするときに、分析にデータを入力するスケールを指定します。このコンセプトを図 1 に示します。

ピラミッド
図 1. Earth Engine の画像データセットのグラフィック表現。点線は、4 ピクセルの 2×2 ブロックを集約するピラミッド化ポリシーを表しています。Earth Engine は、出力で指定されたスケールを使用して、入力として使用する画像ピラミッドの最適なレベルを決定します。

画像ピラミッド

Earth Engine の画像アセットは、画像ピラミッド内の複数のスケールで存在します。ピラミッド化ポリシー(図 1 の破線で示されています)は、ピラミッド内の特定のレベルの各ピクセルが、その下のレベルの 2x2 ピクセル ブロックの集計からどのように計算されるかを決定します。連続値の画像の場合、ピラミッドの上位レベルのピクセル値は、次の下位レベルのピクセルの平均値です。離散値画像の場合、ピラミッドの上位レベルのピクセル値は、次の下位レベルのピクセルのサンプル(通常は左上のピクセル)です。

画像ピラミッドの最下位レベルは、Earth Engine に取り込まれた画像データのネイティブ解像度を表します。取り込み時に、データは(ピラミッド化ポリシーに従って)集約され、より高いピラミッド レベルが作成されます。画像全体が 256x256 ピクセルタイルに収まるまで、データが集約されます。コードで画像を使用する場合、Earth Engine は分析で指定されたスケール以下に最も近いスケールのピラミッド レベルを選択し、必要に応じて(デフォルトでは最近傍探索を使用して)再サンプリングします。

分析の規模

Earth Engine での分析のスケールは「pull」ベースで決まります。計算への入力をリクエストするスケールは、出力から決定されます。たとえば、Code Editor または geemap マップ要素に画像を追加する場合、画像ピラミッドから入力がリクエストされるスケールは、地図のズームレベルによって決まります。他の計算の場合は、引数として scale を指定します。たとえば、30 メートルのネイティブ解像度を持つ Landsat 画像の NIR バンドを使用します。

コードエディタ(JavaScript)

var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318').select('B4');

var printAtScale = function(scale) {
  print('Pixel value at '+scale+' meters scale',
    image.reduceRegion({
      reducer: ee.Reducer.first(),
      geometry: image.geometry().centroid(),
      // The scale determines the pyramid level from which to pull the input
      scale: scale
  }).get('B4'));
};

printAtScale(10); // 0.10394100844860077
printAtScale(30); // 0.10394100844860077
printAtScale(50); // 0.09130698442459106
printAtScale(70); // 0.1150854229927063
printAtScale(200); // 0.102478988468647
printAtScale(500); // 0.09072770178318024

Python の設定

Python API とインタラクティブな開発で geemap を使用する方法については、 Python 環境のページをご覧ください。

import ee
import geemap.core as geemap

Colab(Python)

image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318').select('B4')


def print_at_scale(scale):
  display(
      f'Pixel value at {scale} meters scale',
      image.reduceRegion(
          reducer=ee.Reducer.first(),
          geometry=image.geometry().centroid(),
          # The scale determines the pyramid level from which to pull the input
          scale=scale,
      ).get('B4'),
  )


print_at_scale(10)  # 0.10394100844860077
print_at_scale(30)  # 0.10394100844860077
print_at_scale(50)  # 0.09130698442459106
print_at_scale(70)  # 0.1150854229927063
print_at_scale(200)  # 0.102478988468647
print_at_scale(500)  # 0.09072770178318024

この例では、一定の位置(画像の重心)のピクセル値はスケールによって異なることに注意してください。これは、スケールごとに異なるピラミッド レベルが選択されるためです。スケールが類似している場合、最近傍再サンプリングでは同じピクセル値が返されます。重要なポイントは、スケールを変更することで、異なる画像入力がリクエストされることです。

画像を地図に追加して可視化すると、Earth Engine はズームレベルからスケールを決定します。Landsat 画像を単純に表示する次の簡単な例について考えてみましょう。

コードエディタ(JavaScript)

var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318');
Map.centerObject(image, 17);
Map.addLayer(image, {bands: ['B4', 'B3', 'B2'], max: 0.35}, 'image');

Python の設定

Python API とインタラクティブな開発で geemap を使用する方法については、 Python 環境のページをご覧ください。

import ee
import geemap.core as geemap

Colab(Python)

image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318')
m = geemap.Map()
m.center_object(image, 17)
m.add_layer(image, {'bands': ['B4', 'B3', 'B2'], 'max': 0.35}, 'image')
m

地図は、ネイティブ解像度のピクセルがはっきり見えるように、最初は最大限にズームインされます。十分にズームアウトすると、同じピクセルは表示されず、画像ピラミッドの上位レベルが表示されます。また、Code Editor と geemap の地図は 地図メルカトル(EPSG:3857)図法を使用するため、表示する前に適切なレベルの画像ピラミッドも再投影する必要があります。Earth Engine で投影を処理する方法について詳しくは、投影のドキュメントをご覧ください。