1 votos

Mapear la función sobre una colección de imágenes en Python 2.7 en Earth Engine

Estoy tratando de mapear una función sobre una colección de imágenes en Python. Puedo ejecutar el mismo proceso en JavaScript, pero en Python estoy teniendo problemas.

Aquí está el código en JavaScript, que devuelve un JSON lleno de valores:

var smap = ee.ImageCollection('NASA_USDA/HSL/SMAP_soil_moisture').filterDate('2019-04-25', '2019-05-17')

var geom = ee.Geometry.Point([-94.440367, 42.1068856])

var res = smap.map(function(image) {
  var reduced = image.reduceRegion({geometry: geom, 
                                    reducer: ee.Reducer.mean(), 
                                    crs: 'EPSG:4326', 
                                    scale: 30})
  return image.set('value', reduced);
});

var vals = res.aggregate_array('value');
print(vals);

Sin embargo, cuando ejecuto esto en python, obtengo una lista vacía:

smap = ee.ImageCollection('NASA_USDA/HSL/SMAP_soil_moisture').filterDate('2019-04-25', '2019-05-17')

geom = ee.Geometry.Point([-94.440367, 42.1068856])

def eeAlgo(image):
    reduced = image.reduceRegion(geometry=geom, reducer=ee.Reducer.mean(), crs='EPSG:4326', scale=30)
    image.set('value', reduced)

    return image

vals = smap.map(algorithm=eeAlgo)

vals.aggregate_array('value').getInfo()

> []

¿Hay alguna diferencia entre ejecutar esto en Python que me estoy perdiendo? ¿O es esto un error que debo reportar en https://github.com/google/earthengine-api? Estoy usando Python 2.7.

4voto

hibbelig Puntos 176

Hay una pequeña diferencia entre tu código JS y tu código Python, y es ahí donde tu código "falla". Este es tu código JS:

var res = smap.map(function(image) {
  var reduced = image.reduceRegion({geometry: geom, 
                                    reducer: ee.Reducer.mean(), 
                                    crs: 'EPSG:4326', 
                                    scale: 30})
  return image.set('value', reduced);
});

pero en tu código python haces una línea extra: image.set('value', reduced) y luego return image, pero image no es un objeto al que puedas establecer un valor, set es una función que devuelve una imagen, por lo que el código debería ser:

def eeAlgo(image):
    reduced = image.reduceRegion(geometry=geom, reducer=ee.Reducer.mean(), crs='EPSG:4326', scale=30)
    image = image.set('value', reduced)
    return image

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