1 votos

Cálculo del valor NDVI por píxel mediante GEE y extracción a CSV

Soy nuevo en GEE.

Me gustaría calcular el valor NDVI por píxel para un conjunto de imágenes S2_SR y extraer los valores a un archivo CSV.

Pseudocode:
1. import S2_SR image collection(start date X, end date Y).
2. clip every image to a specific polygon that I have previously imported.
3. calculate NDVI value for every pixel in the clipped image.
4. output the calculated NDVI values to a CSV file.

(Digamos que la imagen recortada tiene un tamaño de 100x100m, lo que significa que tenemos 10x10 píxeles. Así que el archivo CSV debe ser píxeles 1-100 y sus valores).

Mi código hasta ahora está construido así:

//IMPORT SEN2 IMAGE
var S2 = ee.ImageCollection('COPERNICUS/S2_SR') 
  .filterDate('2019-09-01','2019-09-30')
  .filterBounds(poly)

// Define an index function (return only NDVI).
var NDVI = function(image) {
  return image.expression(
    '(NIR - RED) / (NIR + RED)', 
    {
      'NIR': image.select('B8'), 
      'RED': image.select('B4'), 
    }).rename('NDVI').copyProperties(image, image.propertyNames());
};

// Calculate NDVI for each image
var NDVIS2 = S2.map(NDVI)

// Empty Collection to fill
var ft = ee.FeatureCollection(ee.List([]))

var fill = function(img, ini) {
  // type cast
  var inift = ee.FeatureCollection(ini)

  // gets the values for the points in the current img
  var ft2 = img.reduceRegions(poly, ee.Reducer.first(),30)

  // gets the date of the img
  var date = img.date().format()

  // writes the date in each feature
  var ft3 = ft2.map(function(f){return f.set("date", date)})

  // merges the FeatureCollections
  return inift.merge(ft3)
}

// Iterates over the ImageCollection
var newft = ee.FeatureCollection(NDVIS2.iterate(fill, ft))

// Export
Export.table.toDrive(newft,
"anyDescription",
"anyFolder",
"anyNameYouWant")

Pero el resultado que obtengo es un valor por cada imagen tomada, Como se puede ver aquí: CSV OUTPUT (He seleccionado sólo uno de mis campos en la salida CSV mostrada, pero es el mismo para todos.

¿Alguna sugerencia?

3voto

Daniel Puntos 9

Podrías llamar a ee.Image.reduceRegion() en su imagen NDVI con un ee.Reducer.toList() reductor.

var region = ee.Geometry(Map.getBounds(true))
  .centroid(1).buffer(50).bounds(1)

var ndvi = ee.ImageCollection('COPERNICUS/S2_SR')
  .filterDate('2019-01-01', '2019-02-01')
  .map(function (image) {
    return image
      .normalizedDifference(['B8', 'B4'])
      .updateMask(image.select('QA60').not())
  })
  .median()
  .rename('ndvi')

var ndviFeatures = ee.FeatureCollection(ee.List(ndvi
  .reduceRegion({
    reducer: ee.Reducer.toList(),
    geometry: region,
    scale: 10
  })
  .get('ndvi'))
  .map(function (ndvi) {
    return ee.Feature(null, {ndvi: ndvi})
  })
)

print(ndviFeatures.aggregate_array('ndvi'))
Map.addLayer(ndvi, {min: 0, max: 1, palette: 'red,orange,yellow,green'}, 'ndvi')
Map.addLayer(region, {}, 'region')
Export.table.toDrive({
  collection: ndviFeatures,
  description: 'ndvi',
  selectors: ['ndvi']
})

https://code.earthengine.google.com/1a8225792714b648a346ef43a5feefb7

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