1 votos

Error del motor de Google Earth al descodificar JSON

var S2Collection = ee.ImageCollection('COPERNICUS/S2')
    .filterBounds(geometry)
    .filter(ee.Filter.calendarRange(10,02,'month'));

var cloudBitMask = ee.Number(2).pow(10).int();
var cirrusBitMask = ee.Number(2).pow(11).int();

function MaskS2Clouds(image) {
  var qa = image.select('QA60');
  var mask = qa.bitwiseAnd(cloudBitMask).eq(0).and(
             qa.bitwiseAnd(cirrusBitMask).eq(0));
  return image.updateMask(mask);
}

var S2CloudMasked = S2Collection.map(MaskS2Clouds);

function addNDVI(image) {
  return image.addBands(image.normalizedDifference(['B8', 'B4']).rename('NDVI'));
}

var unfNDVI = S2CloudMasked.map(addNDVI).select(['NDVI']);

function filterNDVI(image){
  var masked = image.updateMask(image.gt(0.2));
  var mean = ee.Number(masked.reduceRegion({
      geometry: geometry,
      reducer: ee.Reducer.mean(),
  }).get('NDVI'));
  return image.addBands(masked.divide(mean.getInfo()).rename('stdNDVI'));
}

var fNDVI = unfNDVI.map(filterNDVI).select(['stdNDVI']);

Mi código falla en la última función. Quiero dividir cada imagen enmascarada por su media (pixel por pixel) pero obtengo:

F Error: Falta el campo 'value' del objeto '{"type": "ArgumentRef", "value":null}' o es nulo. Objeto: {"type": "ArgumentRef", "value":null}.

¿Qué ocurre?

2voto

hibbelig Puntos 176

No sé cuál es tu objetivo, pero a mí me ha dado error. No se puede utilizar el .getInfo() que básicamente es una función del lado del cliente que envía una petición al servidor para recuperar su contenido, dentro de una función map función. Pero además, después de corregir eso, tendrás otro problema: como enmascaras muchos píxeles usando un umbral de 0,2, reduciendo sobre un geometry puede devolver un null (todos los píxeles dentro de esa geometría son nulos), por lo que cuando se intenta crear un objeto Image utilizando esa reducción ( mean en tu caso) volverá a fallar. Para superar ese error utilicé ee.Algorithms.If y creó una imagen cero en ese caso.

var S2Collection = ee.ImageCollection('COPERNICUS/S2')
    .filterBounds(geometry)
    .filter(ee.Filter.calendarRange(10,02,'month'));

var cloudBitMask = ee.Number(2).pow(10).int();
var cirrusBitMask = ee.Number(2).pow(11).int();

function MaskS2Clouds(image) {
  var qa = image.select('QA60');
  var mask = qa.bitwiseAnd(cloudBitMask).eq(0).and(
             qa.bitwiseAnd(cirrusBitMask).eq(0));
  return image.updateMask(mask);
}

var S2CloudMasked = S2Collection.map(MaskS2Clouds);

function addNDVI(image) {
  return image.addBands(image.normalizedDifference(['B8', 'B4']).rename('NDVI'));
}

var unfNDVI = S2CloudMasked.map(addNDVI).select(['NDVI']);

function filterNDVI(image){
  var masked = image.updateMask(image.gt(0.2));
  var mean = ee.Number(masked.reduceRegion({
      geometry: geometry,
      reducer: ee.Reducer.mean(),
  }).get('NDVI'));
  var result = ee.Algorithms.If(mean, 
                                image.addBands(masked.divide(mean).rename('stdNDVI')),
                                image.addBands(ee.Image(0).rename('stdNDVI')))
  return ee.Image(result)
}

var fNDVI = unfNDVI.map(filterNDVI).select(['stdNDVI']);
print(fNDVI)

enlace: https://code.earthengine.google.com/2df2ff809ab970582d3ea8cad46b728c

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X