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