3 votos

Cómo calcular series temporales de NDVI Landsat 5 para múltiples polígonos y exportar una hoja de cálculo con Google Earth Engine-GEE

Estoy intentando calcular el NDVI medio de cada polígono existente dentro de mi shapefile.

  • He generado un código que calcula el NDVI para cada fecha disponible para la imagen Landsat 5.

  • Después, este código calcula la media de los píxeles de cada polígono existente dentro de mi shapefile.

  • Por último, genera una hoja de cálculo CSV y exporta.

Mi problema es que genera la hoja de cálculo, pero la columna con la media se quedó con valores vacíos.

roi = https://drive.google.com/file/d/10PPDluM81cppJtJhqKXH-f1H0Jg192oi/view?usp=sharing

//Study area
//the area has three divisions according to the "nome_imo" column: fazenda_1, fazenda_2 and fazenda_3
//I want to calculate the NDVI mean of each of the divisions over time
//and generate a spreadsheet with 
//the image date, division name and ndvi mean value

var roi = ee.FeatureCollection('users/wesleysc352/area_fazenda')
  .filter(ee.Filter.or(ee.Filter.eq('nome_imo', 'fazenda_1'),
                       ee.Filter.eq('nome_imo', 'fazenda_2'),
                       ee.Filter.eq('nome_imo', 'fazenda_3')));

//image collection
var L5 = ee.ImageCollection('LANDSAT/LT05/C01/T1_TOA')
 .filterMetadata('CLOUD_COVER', 'less_than', 1)
 .filterDate('2011-01-01','2011-12-31')

//Calculate NDVI
var addNDVI = function(image) {
  var ndvi = image.normalizedDifference(['B3', 'B4']);
  return image.addBands(ndvi);
};

//aplly ndvi for collection
var L5_ndvi = L5.map(addNDVI)

//create fuction for change date for system yyyy-MM-dd
function date_edit (image) { 
     return image.set({date_edit:image.date().format('yyyy-MM-dd')})}

//aplly date_edit for collection
var NDVI_data = L5_ndvi.map(date_edit);

//create spreadsheet
var feats = NDVI_data.map(function(image){

  var stats = image.clip(roi).reduceRegions({
    collection: roi,
    reducer:ee.Reducer.mean(),
    scale:30
})

stats = stats.map(function(f) { return f.set({date_edit: image.get('date_edit')})})
return stats.copyProperties(image, ['system:time_start'])
})

//generating the columns
var NDVI_mean = feats.flatten()
.select(['date_edit', 'nome_imo','mean']);

//map center
Map.centerObject(roi, 11)

//Export data
Export.table.toDrive({
collection: NDVI_mean,
description: 'CSV_Export',
folder: 'GEE_teste',
fileNamePrefix: 'NDVI_mean',//name file
fileFormat: 'CSV',
selectors: ['nome_imo','date_edit', 'mean']
});

archivo csv de salida sin la columna "media".

enter image description here

3voto

Yada Puntos 9489

Tu código tiene varios problemas. El principal era la definición de NDVI a partir de datos L5. Las bandas B3 y B4 fueron invertidas para la determinación del NDVI produciendo valores negativos sin sentido. Usted puede corroborar que en este enlace . Por lo tanto, he modificado su código de la siguiente manera y, después de ejecutarlo en GEE Code Editor, los valores (nome_imo, date_edit y mean) se exportaron a Google Drive como CSV esperado. He comentado .filterMetadata línea para obtener más valores de NDVI. CLOUD_COVER less_than 1 es una restricción muy drástica y sólo produce tres valores por característica en el rango de datos considerado.

//Study area
//the area has three divisions according to the "nome_imo" column: fazenda_1, fazenda_2 and fazenda_3
//I want to calculate the NDVI mean of each of the divisions over time
//and generate a spreadsheet with 
//the image date, division name and ndvi mean value

var roi = ee.FeatureCollection('users/joseguerreroa/area_fazenda')
  .filter(ee.Filter.or(ee.Filter.eq('nome_imo', 'fazenda_1'),
                       ee.Filter.eq('nome_imo', 'fazenda_2'),
                       ee.Filter.eq('nome_imo', 'fazenda_3')));

//print(roi);

//image collection
var L5 = ee.ImageCollection('LANDSAT/LT05/C01/T1_TOA')
  //.filterMetadata('CLOUD_COVER', 'less_than', 1)
  .filterDate('2011-01-01','2011-12-31')
  .filterBounds(roi);

//Calculate NDVI
var addNDVI = function(image) {
  var ndvi = image.normalizedDifference(['B4', 'B3'])
                  .rename('ndvi');
  return image.addBands(ndvi);
};

//aplly ndvi for collection
var L5_ndvi = L5.map(addNDVI);

print("count", L5_ndvi.size());

var L5_ndvi_list = L5_ndvi.toList(L5_ndvi.size());

var L5_ndvi = L5_ndvi.select(['ndvi']);

//print("L5_ndvi", L5_ndvi);

var L5_ndviVis = {
  min: 0.15348,
  max: 0.76315,
};

Map.addLayer(L5_ndvi, L5_ndviVis, 'L5_ndvi');
Map.addLayer(roi);
Map.centerObject(roi, 12);

var feats_list = roi.toList(roi.size());

var ndvi_values = feats_list.map(function (feat) {

  var ndvi_val = L5_ndvi_list.map(function (image) {

  var stats = ee.Image(image).reduceRegion(
    {reducer: ee.Reducer.mean(),
     geometry: ee.Feature(feat).geometry()});

    return [ee.Feature(feat).get('nome_imo'), ee.Date(ee.Image(image).get('system:time_start')).format('yyyy-MM-dd'), stats.get('ndvi')];

  });

  return ndvi_val;

}).flatten();

//print("ndvi_values", ndvi_values);

var len = ndvi_values.size();

var list = ee.List.sequence(0, len.subtract(1), 3);

var new_ndvi_values = list.map(function(ele){

  var start = ee.Number(ele).int(); 
  var end = ee.Number(ele).add(3).int(); 

  var new_list = ee.List([]);
  var element = ee.List(ndvi_values.slice(start, end));

  new_list = new_list.add(element);

  return new_list.get(0);

});

//print (new_ndvi_values);

var myFeatures = ee.FeatureCollection(new_ndvi_values.map(function(el){
  el = ee.List(el); // cast every element of the list

  return ee.Feature(null, {
    'nome_imo': el.get(0),
    'date_edit': el.get(1),
    'mean': el.get(2)
  });
}));

//print(myFeatures);

// Export features, specifying corresponding names.
Export.table.toDrive(myFeatures,
"CSV_Export", //my task
"GEE_teste", //my export folder
"NDVI_mean",  //file name
"CSV");

Después de ejecutar el código anterior, la imagen ráster NDVI general y el área roi se cargaron en Map Canvas de GEE; como se puede observar en la siguiente imagen.

enter image description here

El archivo CSV producido se puede observar de la siguiente manera abierto en LibreOffice Calc. Se puede editar para eliminar los campos no deseados y para expresar un orden diferente campos.

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