Estadísticas de una región de imagen

reduceRegion

Para obtener estadísticas de los valores de píxeles en una región de una ee.Image, usa image.reduceRegion(). Esto reduce todos los píxeles de la región o las regiones a una estadística o a otra representación compacta de los datos de píxeles en la región (p.ej., histograma). La región se representa como una Geometry, que puede ser un polígono que contiene muchos píxeles o un solo punto, en cuyo caso solo habrá un píxel en la región. En cualquier caso, como se ilustra en la Figura 1, el resultado es una estadística derivada de los píxeles de la región.

Diagrama de reduceRegion
Figura 1: Ilustración de un ee.Reducer aplicado a una imagen y una región.

Para obtener un ejemplo de cómo obtener estadísticas de píxeles en una región de una imagen con reduceRegion(), considera encontrar los valores espectrales medios de un compuesto de Landsat de 5 años dentro de los límites del bosque de coníferas de Sierra Nevada (ilustrado en la Figura 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);

Para forzar el cálculo, basta con imprimir el resultado, que el Editor de código mostrará como un Dictionary en la consola. El resultado debería verse de la siguiente manera:

B1: 25.406029716816853
B2: 23.971497014238988
B3: 22.91059593763103
B4: 54.83164133293403
B5: 38.07655472573677
B6_VCID_2: 198.93216428012906
B7: 24.063261634961563
Diagrama de reduceRegion
Figura 2: Compuesto de color falso de los datos de imágenes de Landsat para California y Nevada La región sobre la que se reducirá se muestra en blanco

Ten en cuenta que, en este ejemplo, la reducción se especifica proporcionando el reducer (ee.Reducer.mean()), el geometry (region.geometry()), la scale (30 metros) y maxPixels para la cantidad máxima de píxeles que se ingresarán en el reductor. Siempre se debe especificar una escala en las llamadas reduceRegion(). Esto se debe a que, en los flujos de procesamiento complejos, que pueden incluir datos de diferentes fuentes con diferentes escalas, la escala del resultado no se determinará de forma inequívoca a partir de las entradas. En ese caso, la escala se establece de forma predeterminada a 1 grado, lo que generalmente produce resultados insatisfactorios. Consulta esta página para obtener más información sobre cómo Earth Engine controla la escala.

Hay dos maneras de establecer la escala: especificando el parámetro scale o especificando un CRS y una transformación de CRS. (Consulta el glosario para obtener más información sobre los CRS y las transformaciones de CRS). Por ejemplo, la meanDictionary reducción (anterior) es equivalente a lo siguiente:

// 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
}));

En general, especificar la escala es suficiente y genera un código más legible. Earth Engine determina qué píxeles ingresar en el reductor mediante la rasterización de la región. Si se especifica una escala sin un CRS, la región se rasteriza en la proyección nativa de la imagen ajustada a la resolución especificada. Si se especifican un CRS y una escala, la región se rasteriza en función de ellos.

Píxeles en la región

Se determina que los píxeles están en la región (y se ponderan) según las siguientes reglas, aplicadas en la escala y la proyección especificadas:

  • Reductores sin ponderar (p.ej., ee.Reducer.count() o ee.Reducer.mean().unweighted()): Los píxeles se incluyen si su centroide está en la región y la máscara de la imagen no es cero.
  • Reductores ponderados (p.ej., ee.Reducer.mean()): Los píxeles se incluyen si al menos (aproximadamente) 1/256 (~0.4%) del píxel está en la región y la máscara de la imagen no es cero; su peso es el mínimo de la máscara de la imagen y la fracción (aproximada) del píxel que cubre la región. Los pesos de intersección de píxeles se representan internamente como números enteros de 8 bits (de 0 a 255), lo que cuantifica la cobertura fraccionaria en 256 niveles discretos.

Se necesita el parámetro maxPixels para que el cálculo se realice correctamente. Si este parámetro se omite del ejemplo, se muestra un error que se ve de la siguiente manera:

Existen varias opciones para superar estos errores: aumentar maxPixels, como en el ejemplo, aumentar la scale o establecer bestEffort en true, lo que calcula automáticamente una escala nueva (más grande) de modo que no se exceda maxPixels. Si no especificas maxPixels, se usa el valor predeterminado.