1 votos

Encontrar el valor medio de NDVI para subdistritos dentro de la característica de shapefile entre 1994 y 2011

Quiero exportar como un CSV los valores medios de NDVI para los subdistritos contenidos dentro de la característica NAME_3 de mi shapefile. Actualmente tengo el siguiente código, pero no estoy pudiendo exportarlo con una columna por año (entre 1994 y 2011):

var shp4 = ee.FeatureCollection('users/dermont/GADMVGrassSimplify');

Map.addLayer(shp4, {}, 'Mi Polígono');
var districts = shp4.filter(filter);
var districtsindo = shp4.select('NAME_3');

var startYear = 1994
var endYear = 2011

var means = ee.Image(
  ee.List.sequence(startYear, endYear)
  .iterate(
    function(year, acc) {
      return ee.Image(acc).addBands(
        yearlyMeans(ee.Number(year))
      )
    },
    ee.Image([])
  )
)

var ndviPerdistrict = means.reduceRegions({
  collection: districtsindo,
  reducer: ee.Reducer.mean().forEachBand(means),
  scale: 30
})

function removegeo(feature) {
  feature = feature.setGeometry(null);
  return feature
}

 var ndvi_district = ndviPerdistrict.map(removegeo);   

var columns = ['distrito'].concat(sequence(startYear, endYear))

Export.table.toDrive({
  collection: ndvi_district, 
  description: 'ndviPorParroquia',
  selectors: columns
})

function yearlyMeans(year) {
  var startDate = ee.Date.fromYMD(year, 1, 1)
  var endDate = startDate.advance(1, 'year')

  var landsat = ee.ImageCollection(ee.ImageCollection("LANDSAT/LT05/C02/T2_TOA"))
    .filterBounds(districtsindo)
    .filterDate(startDate, endDate)

  var addNDVI = function(image) {
    return image
      .normalizedDifference(['B4', 'B3'])
      .rename(year.format('%d')) // Renombrar banda de NDVI al año actual
  }

  return landsat.map(addNDVI).mean()
}

// Crear secuencia del lado del cliente
function sequence(from, to) {
  return Array.apply(null, {length: to - from + 1})
    .map(function (_, i) {
      return i + from
    })
}

1voto

Yada Puntos 9489

No estás compartiendo tu activo, así que tuve que crear una variable arbitraria shp4 como se especifica en mi código completo. Un extracto de él, con ligeras modificaciones en comparación con tu código, se ve así:

var feat1 = ee.Feature(geometry).set('NAME_3', 'distrito1');
var feat2 = ee.Feature(geometry2).set('NAME_3', 'distrito2');
var feat3 = ee.Feature(geometry3).set('NAME_3', 'distrito3');

//var shp4 = ee.FeatureCollection('users/dermont/GADMVGrassSimplify');

var shp4 = ee.FeatureCollection([feat1, feat2, feat3]);

Map.addLayer(shp4, {}, 'Mi Polígono');
//var districts = shp4.filter(filter);
var distritosindo = shp4.select('NOMBRE_3');

print(distritosindo);

var añoInicio = 1994
var añoFin = 2011

var medias = ee.Image(
  ee.List.sequence(añoInicio, añoFin)
  .iterate(
    function(año, acc) {
      return ee.Image(acc).addBands(
        mediasAnuales(ee.Number(año))
      )
    },
    ee.Image([])
  )
)

var ndviPerdistrito = medias.reduceRegions({
  collection: distritosindo,
  reducer: ee.Reducer.mean().forEachBand(medias),
  scale: 30
})

function removergeo(feature) {
  feature = feature.setGeometry(null);
  return feature
}

var ndvi_distrito = ndviPerdistrito.map(removergeo);   

var columnas = ['distrito'].concat(secuencia(añoInicio, añoFin))

Export.table.toDrive({
  collection: ndvi_distrito, 
  description: 'ndviPorParroquia',
  //selectors: columnas
})

function mediasAnuales(año) {
  var fechaInicio = ee.Date.fromYMD(año, 1, 1)
  var fechaFin = fechaInicio.advance(1, 'year')

  var landsat = ee.ImageCollection(ee.ImageCollection("LANDSAT/LT05/C02/T2_TOA"))
    .filterBounds(distritosindo)
    .filterDate(fechaInicio, fechaFin)

  var agregarNDVI = function(imagen) {
    return imagen
      .normalizedDifference(['B4', 'B3'])
      .rename(año.format('%d')) // Renombrar banda NDVI al año actual
  }

  return landsat.map(agregarNDVI).mean()
}

// Crear secuencia en el lado del cliente
function secuencia(desde, hasta) {
  return Array.apply(null, {length: hasta - desde + 1})
    .map(function (_, i) {
      return i + desde
    })
}

Después de ejecutar el código anterior en el editor de código de GEE, obtuve el siguiente archivo CSV.

enter image description here

Se puede observar "una columna por año (entre 1994 y 2011)", tal como esperas.

Si en tu caso no puedes exportar el CSV, probablemente hay uno o más distritos sin información y deberías corregirlo.

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