1 votos

El resultado de la función size() no puede utilizarse en un bucle for en el motor Google Earth.

Obtengo el número de imágenes a ImageCollection utilizando el size() pero cuando utilizo ese número en un bucle for, no funciona.

Véase el último trozo de código de este script:

// study area 
var roi = ee.FeatureCollection([
    ee.Feature(    // study area.
      ee.Geometry.Rectangle(20, -5, 75, 35), {label: 'study Area'})
  ]);

// images
var now = ee.Date(Date.now())
var NDVICollection=ee.ImageCollection('MODIS/006/MOD13Q1')
    .filterDate('2019-12-01',now)
    .select('NDVI');

// masker
var masker = function(image){ 
    var mask1 = image.select('NDVI').lte(10000);
    var mask2 = image.select('NDVI').gte(2000);
    return image.updateMask(mask1).updateMask(mask2);
    };

// Create clipping function
var clipper = function(image){
    return image.clip(roi);
  };

var ndvi = NDVICollection.map(clipper);

// PREPARE DATA FOR EXPORT
// Tyler Erickson provided the stacking function
// https://gis.stackexchange.com/a/254778/67264
var stackCollection = function(collection) {
    var first = ee.Image(collection.first()).select([]);
    // Write a function that appends a band to an image.
    var appendBands = function(image, previous) {
        var dateString = ee.Date(image.get('system:time_start')).format('yyyy-MM-dd');
        return ee.Image(previous).addBands(image.rename(dateString));
    };
    return ee.Image(collection.iterate(appendBands, first));
  };
var ndvi_img = stackCollection(ndvi);
print(ndvi_img);

var visParams = {
    min: 0.0,
    max: 9000.0,
    palette: [
      'FFFFFF', 'CE7E45', 'DF923D', 'F1B555', 'FCD163', '99B718', '74A901',
      '66A000', '529400', '3E8601', '207401', '056201', '004C00', '023B01',
      '012E01', '011D01', '011301'
    ],
  };

Map.centerObject(roi,2);

var size =NDVICollection.size() ;
print(size);//4
  Map.addLayer(roi,{},'Study Area');
// it does not work!!!!!!!!!!!!!!!!!!!!!!
  for(var i = 0;i<size;i++){
    Map.addLayer(ndvi_img.select(i),visParams,'img_'+i);
  }

1voto

Philip Puntos 6

El problema es que estás mezclando variables de servidor (que viven en el servidor del motor terrestre) y funciones locales (que viven en tu navegador). El for() bucle se ejecuta en su navegador. No sabe cuál es el size variable contiene.

Al añadir el .getInfo() está forzando el envío del valor al navegador, y entonces su size se convierte en una variable local. Esto hace que el script sólo traiga datos a su navegador cuando realmente lo desee, de lo contrario se ejecuta completamente en el servidor. Esta es la razón por la que puedes hacer colecciones de imágenes, y operaciones band-math muy rápidamente, lo que le llevaría años a tu navegador.

Es un concepto con el que luché (y aún lo hago a veces). Es la razón por la que no se puede hacer lo que parecería una operación sencilla.

var serverNumberA = ee.Number(2); // 2
var serverNumberB = ee.Number(3); // 3

var badSum = serverNumberA + serverNumberB // ERROR
var goodSum = serverNumberA.add(serverNumberB); // CORRECT

Para una mejor explicación, véase el client_server Documentos

0voto

user68792 Puntos 11

La descripción de Sean del problema es correcta - necesitas transferir objetos EE del lado del servidor al cliente para realizar operaciones del lado del cliente, como bucles for, con ellos.

Sin embargo, .evaluate() es el mejor método para transferir objetos EE al cliente porque es asíncrono; es menos probable que su navegador congelarse .

Aquí está .evaluate() implementado en su script:

// Get the number of bands.
var nBands = ndvi_img.bandNames().size();

// Call evaluate on nBands to transfer it client-side for use in client for loop.
nBands.evaluate(function(nBands) {
  for(var i=0; i<nBands; i++) {
    Map.addLayer(ndvi_img.select(i), visParams,'img_'+i);
  } 
});

Editor de código completo

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