reduceRegion
ee.Image の領域内のピクセル値の統計情報を取得するには、image.reduceRegion() を使用します。これにより、リージョン内のすべてのピクセルが、リージョン内のピクセルデータの統計情報またはその他のコンパクトな表現(ヒストグラムなど)に縮小されます。リージョンは Geometry として表されます。これは、多くのピクセルを含むポリゴンである場合もあれば、単一の点である場合もあります。単一の点である場合、リージョン内のピクセルは 1 つだけになります。いずれの場合も、図 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);
計算を強制するには、結果を出力するだけで十分です。コードエディタは、コンソールに Dictionary として結果を表示します。出力は次のようになります。
B1: 25.406029716816853 B2: 23.971497014238988 B3: 22.91059593763103 B4: 54.83164133293403 B5: 38.07655472573677 B6_VCID_2: 198.93216428012906 B7: 24.063261634961563
この例では、reducer(ee.Reducer.mean())、geometry(region.geometry())、scale(30 メートル)、リデューサーに入力する最大ピクセル数の maxPixels を指定して、削減を指定しています。スケールは常に reduceRegion() 呼び出しで指定する必要があります。これは、さまざまなスケールのさまざまなソースのデータが関係する複雑な処理フローでは、出力のスケールが入力から一意に決定されないためです。その場合、スケールはデフォルトで 1 度に設定されますが、通常は満足のいく結果が得られません。Earth Engine でのスケールの処理方法の詳細については、こちらのページをご覧ください。
スケールを設定するには、scale パラメータを指定する方法と、CRS と CRS 変換を指定する方法の 2 つがあります。(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()など): ピクセルの少なくとも 1/256(約 0.4%)がリージョン内にあり、画像のマスクがゼロ以外の場合、ピクセルが含められます。重みは、画像のマスクとリージョンで覆われているピクセルの(おおよその)割合の最小値です。ピクセルの交差の重みは、内部的には 8 ビット整数(0 ~ 255)として表され、小数部分の範囲が 256 個の離散レベルに量子化されます。
計算を成功させるには、maxPixels パラメータが必要です。このパラメータを例から省略すると、次のようなエラーが返されます。
これらのエラーを回避するには、複数の方法があります。たとえば、例のように maxPixels を増やす、scale を増やす、bestEffort を true に設定する(maxPixels を超えないように新しい(より大きな)スケールが自動的に計算されます)などです。maxPixels を指定しない場合は、デフォルト値が使用されます。