1 votos

Motor Google Earth: error "Parameter 'index' is required" al asignar a una colección de imágenes

Estoy intentando aplicar una función de distancia a una colección de imágenes enmascaradas, pero recibo un error "Se requiere el parámetro 'index'". He encontrado respuestas para otros errores del tipo "El parámetro 'xyz' es necesario/falta", pero nada para 'index'.

La función funciona cuando introduzco años independientes (por ejemplo, '7' o '12'), pero no cuando se aplica sobre la lista de años. Parece que hay algún problema para indexar cada imagen después de aplicar la función, pero no estoy seguro de por qué. He probado a configurar el índice del sistema ( set("system:index", y) ) dentro de la función, pero sigue sin haber suerte. Incluso he intentado anidar funciones en lugar de tener dos argumentos dentro de una función, pero aparece el mismo error. No soy en absoluto un experto en GGE, así que por favor, ¡dime si me estoy perdiendo algo fácil!

Aquí está el código de la función no anidada modificado a un 'ImageCollection' para la generalizabilidad:

// List of last two digits of years 2000-2016 to call from a list of 17 tree cover images (1 from each
// year)

var years = ee.List.sequence(0,16);

// function to calculate distance (for each image in an Image Collection) from each masked pixel to 
// nearest unmasked pixel

function distance(coll, y) {
  var list = coll.toList(years.size()); // converting to list to call by indexed number
  var non_tc = ee.Image(list.get(Math.round(y))).lte(0);   // using 'round' to convert floats to integers
  var tc = ee.Image(list.get(Math.round(y))).gt(0);
  var dist = non_tc.cumulativeCost({
                      source: tc,
                      maxDistance: 10000
    });
  return dist
    .set('year', y);
}

// When applied to one year, it works fine:
var test12 = distance(ImageCollection, 12);

// When I try to apply it to all years, I get the error:
var dist_coll = distance(ImageCollection, years);
print('dist_coll', dist_coll);

Aquí hay otra versión de la función utilizando "map", que devuelve el mismo error:

function distance1(coll) {
  var list = coll.toList(years.size());
  var non_tc = ee.Image(list.get(Math.round(yeears))).lte(0);
  var tc = ee.Image(list.get(Math.round(years))).gt(0);
  var dist = non_tc.cumulativeCost({
                      source: tc,
                      maxDistance: 10000
    });
  return dist
    .set('year', y);
}

var dist_coll1 = years.map(distance1(ImageCollection));
print('dist_coll1', dist_coll1);

E intentando anidar funciones, con el mismo resultado:

var distance2 = function(coll) {
  var dist = function(y) {
       var list = coll.toList(years.size());
       var non_tc = ee.Image(list.get(Math.round(y))).lte(0);
       var tc = ee.Image(list.get(Math.round(y))).gt(0);
       var cost = non_tc.cumulativeCost({
                        source: tc,
                        maxDistance: 10000});
          return cost
            .set('year', y);
      };
   return coll.map(dist);
};

var dist_coll2 = years.map(distance2(ImageCollection));
print('dist coll2', dist_coll2);

0voto

Linh Lam Puntos 3

No se puede utilizar Math.round en un valor calculado. Math.round es una función del navegador que ocurre inmediatamente; la lista (y los valores en ella) ni siquiera existen hasta que todo llega al servidor.

Sin embargo, ni siquiera necesita Math.round. La secuencia sólo contiene números enteros.

0voto

Yada Puntos 9489

Creo que has malinterpretado el uso de la función en estas líneas:

// When applied to one year, it works fine:
var test12 = distance(ImageCollection, 12);

Significa que está calculando el coste acumulado para una imagen con id igual a 12; no para un grupo de ellas equivalente a un año. Por tanto, la variable año es el número total de imágenes de la lista completa (no un año concreto). Por lo tanto, supuse que MODIS/006/MOD09GA como ColecciónDeImágenes variable en su código (donde se seleccionó arbitrariamente la banda 'sur_refl_b01' para estimar el coste) y el siguiente intervalo de fechas '2019-06-01', '2019-06-30' (29 imágenes en esta Colección de imágenes). El código completo (con varias modificaciones; incluyendo la sugerencia de Gorelick) tiene el siguiente aspecto:

var ImageCollection = ee.ImageCollection('MODIS/006/MOD09GA')
        .select('sur_refl_b01')
        .filterDate('2019-06-01', '2019-06-30');

print(ImageCollection);

// List of last two digits of years 2000-2016 to call from a list of 17 tree cover images (1 from each
// year)

var imageNumbers = ee.List.sequence(0, ImageCollection.size().subtract(1));

print("Image Number", imageNumbers);

// function to calculate distance (for each image in an Image Collection) from each masked pixel to 
// nearest unmasked pixel

function distance(coll, y) {
  var list = coll.toList(imageNumbers.size()); // converting to list to call by indexed number
  var non_tc = ee.Image(list.get(y)).lte(0);   // using 'round' to convert floats to integers
  var tc = ee.Image(list.get(y)).gt(0);
  var dist = non_tc.cumulativeCost({
                      source: tc,
                      maxDistance: 10000
    });

  return dist
    .set('id_number', y);
}

// Mapping now imageNumbers list (not years), it works fine:
var cumCostImages = imageNumbers.map(function(ele){

  return distance(ImageCollection, ele);

});

print("Cumulative Cost Images", cumCostImages);

Despues de ejecutar el codigo anterior en el editor de codigo GEE, obtuve el resultado de la siguiente imagen (sin ningun error "Parameter 'index' is required"). Se puede observar coste_acumulado número por defecto para la banda de la primera imagen y número_id como propiedad.

enter image description here

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