画像領域の統計情報

reduceRegion

ee.Image の領域内のピクセル値の統計情報を取得するには、image.reduceRegion() を使用します。これにより、リージョン内のすべてのピクセルが、リージョン内のピクセルデータの統計情報やその他のコンパクトな表現(ヒストグラムなど)に圧縮されます。リージョンは Geometry として表されます。これは、多くのピクセルが含まれるポリゴンである場合もあれば、単一の点である場合もあります。この場合、リージョンには 1 つのピクセルのみが含まれます。いずれの場合も、図 1 に示すように、出力はリージョン内のピクセルから導出された統計情報です。

reduceRegion の図
図 1. 画像と領域に適用された ee.Reducer のイラスト。

reduceRegion() を使用して画像の領域のピクセル統計情報を取得する例として、シエラネバダ針葉樹林の境界内の 5 年間の Landsat 合成画像の平均スペクトル値を求めてみましょう(図 2 を参照)。

// Load input imagery: Landsat 7 5-year composite.
var image = ee.Image('LANDSAT/LE7_TOA_5YEAR/2008_2012');

// Load an input region: Sierra Nevada.
var region = ee.Feature(ee.FeatureCollection('EPA/Ecoregions/2013/L3')
  .filter(ee.Filter.eq('us_l3name', 'Sierra Nevada'))
  .first());

// Reduce the region. The region parameter is the Feature geometry.
var meanDictionary = image.reduceRegion({
  reducer: ee.Reducer.mean(),
  geometry: region.geometry(),
  scale: 30,
  maxPixels: 1e9
});

// The result is a Dictionary.  Print it.
print(meanDictionary);

計算を強制するには、結果を出力するだけで十分です。Code Editor は、コンソールに Dictionary として結果を表示します。出力は次のようになります。

B1: 25.406029716816853
B2: 23.971497014238988
B3: 22.91059593763103
B4: 54.83164133293403
B5: 38.07655472573677
B6_VCID_2: 198.93216428012906
B7: 24.063261634961563
reduceRegion の図
図 2. カリフォルニア州とネバダ州の Landsat 画像データの疑似カラー合成。縮小する領域は白色で表示されます。

この例では、reduceree.Reducer.mean())、geometryregion.geometry())、scale(30 メートル)、maxPixels(リデューサーに入力するピクセル数の上限)を指定して、縮小を指定しています。reduceRegion() 呼び出しでは常にスケールを指定する必要があります。これは、異なるスケールの異なるソースのデータが含まれる複雑な処理フローでは、出力のスケールが入力から明確に決定されないためです。その場合、スケールはデフォルトで 1 度になりますが、通常は満足できる結果が得られません。Earth Engine がスケールを処理する方法の詳細については、こちらのページをご覧ください。

スケールを設定する方法は 2 つあります。scale パラメータを指定するか、CRS と CRS 変換を指定します。(CRS と CRS 変換の詳細については、用語集をご覧ください)。たとえば、上記の meanDictionary の削減は次のようになります。

// As an alternative to specifying scale, specify a CRS and a CRS transform.
// Make this array by constructing a 4326 projection at 30 meters,
// then copying the bounds of the composite, from composite.projection().
var affine = [0.00026949458523585647, 0, -180, 0, -0.00026949458523585647, 86.0000269494563];

// Perform the reduction, print the result.
print(image.reduceRegion({
  reducer: ee.Reducer.mean(),
  geometry: region.geometry(),
  crs: 'EPSG:4326',
  crsTransform: affine,
  maxPixels: 1e9
}));

一般的に、スケールを指定するだけで十分であり、コードの読みやすさが向上します。Earth Engine は、まず対象領域をラスター化して、どのピクセルをレジューダに入力するかを決定します。CRS なしでスケールが指定されている場合、リージョンは指定された解像度にスケーリングされた画像のネイティブ プロジェクションでラスター化されます。CRS とスケールの両方が指定されている場合、リージョンはこれらに基づいてラスター化されます。

地域内のピクセル

ピクセルが対象地域内にあるかどうか(および重み付け)は、指定されたスケールと投影で適用される次のルールに基づいて決定されます。

  • 重み付けなしの集約関数ee.Reducer.count()ee.Reducer.mean().unweighted() など): ピクセルの重心が対象領域内にあり、画像のマスクがゼロでない場合、ピクセルは対象になります。
  • 重み付きリデューサー(例: ee.Reducer.mean()): ピクセルの少なくとも(約)0.5% が領域内にあり、画像のマスクがゼロでない場合、ピクセルは含まれます。重みは、画像のマスクと、領域で覆われているピクセルの(近似)小数分の最小値です。

計算を成功させるには、maxPixels パラメータが必要です。このパラメータを例から省略すると、次のようなエラーが返されます。

これらのエラーを回避するには、複数の方法があります。maxPixels を増やす、例のように scale を増やす、bestEffort を true に設定する(これにより、maxPixels が超過しないように新しい(大きい)スケールが自動的に計算されます)。maxPixels を指定しないと、デフォルト値が使用されます。