1 votos

Exportar múltiples imágenes en una tarea - GEE Python API

Contexto : Trato un conjunto de imágenes utilizando el API Python del motor de Google Earth . Quiero aplicar el proceso sobre un conjunto de imágenes y guardar el resultado (en mi caso exportar a GEE Assets).

Lo que he hecho : Recorrer en bucle el conjunto de imágenes y exportar cada imagen una por una. Eso funciona bien.

Problema Como quiero aplicar mi proceso sobre 60k imágenes, me encuentro con la restricción del número de tareas (3000).

Traceback (última llamada más reciente):

ee.ee_exception.EEException: Ya hay demasiadas tareas en la cola (3000). Por favor, espere a que algunas de ellas se completen.

Lo que he encontrado : el geetools módulos. Sin embargo, mirando el código, también parece iterar sobre la colección de imágenes y exportar cada imagen una por una.

Pregunta : ¿Es posible exportar múltiples imágenes en un ¿tarea? ¿Cuáles son las soluciones?

Aquí el código:

col = ee.ImageCollection("COPERNICUS/S2") \
        .filterDate("2018-01-01", "2018-12-31") \
        .filterBounds(geometry)

# Get names of all image as a python list
image_names = get_name_collection(col).getInfo()
total = len(image_names)

# Create new image collection if don't existe
folder = "users/ab43536/masks_4_methods"
if folder not in [elt["id"] for elt in ee.data.getList({"id": "users/ab43536"})]:
    ee.data.createAsset({'type': "ImageCollection"}, folder)

# Apply process to all images
for i, name in enumerate(image_names):
    print("{:4d}/{} = {:05.2f}%   Image {}".format(i, total, i / total * 100, name))
    # The long process
    mask = computeCloudMasking(name)

    # Export image one by one
    export_image(mask, folder, getGeometryImage(ee.Image(name)),
                 name.split('/')[-1], num=i, total=total)

Dónde export_image es:

def export_image(image, asset_id="users/ab43536/", roi=None, name=None, num=None, total=None):
    """ Export one image to GEE Asset
    Arguments
        :param image: image to export
        :param roi=None:  specify the roi, default compute from image dimension
        :param name=None: name of the image
    """
    if roi == None: roi = getGeometryImage(image)
    if name == None: name = image.id().getInfo()
    description = "Default export"
    if num != None and total != None:
        description = "Image {} on {} equal {:05.2f} pourcent".format(num, total, num / total * 100)
    # print(description)
    assetId = asset_id + name

    # Create a task : export the result as image asset
    task = ee.batch.Export.image.toAsset(image=image.clip(roi),
                                         description=description,
                                         assetId=assetId,
                                         scale=30,
                                         region=roi.coordinates().getInfo(),
                                         )
    task.start()

0voto

Ratafia Puntos 1

Procesar esa cantidad de imágenes en una pila sería demasiado grande, pero puedes exportar varias imágenes en una sola tarea apilando las imágenes y luego exportando la pila.

Aquí está mi código para la versión Java, si sabes cómo traducir:

// Colección de pilas para la imagen de salida

var tsStack = function(image, list) {
    return ee.Image(list).addBands(image.select([bands]));
};
var stack = ee.Image(newcol.iterate(tsStack,ee.Image(0.0).toDouble())).slice(1)

Export.image.toDrive({image:stack,description:name+'_stack',folder:'yourfolder', region:roi, scale:scale, crs:crs})

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