2 votos

Comparación de la imagen actual de la colección con la anterior mediante el motor de Google Earth

Quiero restar una trama binaria de otra, para todas las imágenes de una colección. Por ejemplo, si tengo diez imágenes, quiero restar la imagen 2 de la imagen 1, la imagen 3 de la imagen 2, la imagen 4 de la imagen 3... la imagen 10 de la imagen 9, para crear una nueva trama binaria para cada una de estas restas, mostrando el cambio entre las dos imágenes.

He incluido mi código a continuación, que aplica las máscaras y crea las tramas binarias en la primera mitad, y luego intenta esta sustracción de tramas en la última mitad. Obtengo el error "No se puede utilizar el operador 'in' para buscar 'nombre' en undefined", que entiendo pero no puedo averiguar otra manera.

/* Computes collection IDs and then clips images, applies cloud and water masks, NDSI and then displays all images */
var computedIds = clip.reduceColumns(ee.Reducer.toList(), ['system:index'])
                          .get('list');
computedIds.evaluate(function(ids) {
  for (var i=0; i<ids.length; i++)
    //Mask each layer and display
    var image = ee.Image("LANDSAT/LC08/C01/T1_TOA/"+ids[i]);
    var clipped = image.clip(ee.FeatureCollection("users/rgi60_all"));
    var snow = masked(clipped)
    // Add all layers to map
    Map.addLayer(snow, {bands:'NDSI'}, ids[i], false);
    // Create for loop which subtracts image binary raster from previous image binary raster !!!!!!!!!!!! NOT WORKING !!!!!!!!!!!!!
    for (var i1=0; i<ids.length; i++) {
     if (i1===0){ // do nothing
      }
      else { // selects the 'snow' binary band from each image and subtracts to give new raster named 'change'
        var change = ids[i1-1].select('snow').subtract(ids[i1].select('snow')).selfMask()}}}
      Map.addLayer(change, {}, ids[i], false);
});

1voto

hibbelig Puntos 176

Su enfoque no es común. Estás utilizando mucho código del lado del cliente que no es recomendable (ver aquí ). Además, no proporcionaste suficiente información, así que hice algunas suposiciones y me inventé un sitio para mis pruebas.

Las imágenes de la colección resultante tendrán valores de -1 si el cambio es positivo (nieve nueva) y 1 si es negativo (nieve perdida), según su planteamiento:

var change = ids[i1-1].select('snow').subtract(ids[i1].select('snow'))

He pintado de azul la nieve nueva y de rojo la que se ha ido.

Código aquí: https://code.earthengine.google.com/4dd5841ecb4be094ac0d04b256fadd9b

var site = ee.Geometry.Point([-71.6494781770138, -42.97085867205123])

var collection = ee.ImageCollection('LANDSAT/LC08/C01/T1_TOA')
                   .filterBounds(site)
                   .filter(ee.Filter.dayOfYear(180, 270)) // Snow time
                   //.limit(10)  // limit for testing purposes

var ndsi = function(img) {
  var index = img.normalizedDifference(['B3', 'B6'])
  var mask = index.gt(0).rename('snow')
  return mask
}

var masked = collection.map(ndsi)
var masked_list = masked.toList(masked.size())

var ini = masked_list.slice(0,1) // list with first image
var rest = masked_list.slice(1) // rest of the list

var change_list = ee.List(
  rest.iterate(function(img, ini) {
    ini = ee.List(ini)  // cast variable
    var last_image = ee.Image(ini.get(-1)) // get last image
    var actual_image = ee.Image(img)
    var diff = last_image.subtract(actual_image)

    // keep changes only
    var change = diff.neq(0)

    return ini.add(diff.updateMask(change))
}, ini))

var change = ee.ImageCollection.fromImages(change_list.slice(1))

var last = ee.Image(change.sort('system:time_start', false).first())

Map.addLayer(last, {palette:['blue', 'red']}, 'last image of the collection')

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