Ejecución diferida

En el documento Cliente frente a servidor, se describe cómo los objetos a los que se hace referencia en tu secuencia de comandos pueden estar del lado del cliente o del servidor. La secuencia de comandos completa contiene no solo los objetos que deseas usar, sino también un conjunto de instrucciones que le indican a Earth Engine qué hacer con ellos. En este documento, se describe cómo se envían esas instrucciones a Google para su procesamiento y cómo se devuelven los resultados al cliente para su visualización.

Cuando escribes una secuencia de comandos en Earth Engine (ya sea en JavaScript o Python), ese código NO se ejecuta directamente en los servidores de Earth Engine en Google. En su lugar, la biblioteca cliente codifica la secuencia de comandos en un conjunto de objetos JSON, los envía a Google y espera una respuesta. Cada objeto representa un conjunto de operaciones necesarias para obtener un resultado en particular, por ejemplo, una imagen para mostrar en el cliente. Considera el siguiente código:

var image = ee.Image('CGIAR/SRTM90_V4');
var operation = image.add(10);
print(operation.toString());
print(operation);

Consulta la página Entorno de Python para obtener información sobre la API de Python y el uso de geemap para el desarrollo interactivo.

import ee
import geemap.core as geemap
image = ee.Image('CGIAR/SRTM90_V4')
operation = image.add(10)
print(operation)
print(operation.getInfo())

La primera sentencia de impresión mostrará la estructura JSON que la biblioteca cliente usa para describir esa imagen al servidor de Google:

ee.Image({
  "type": "Invocation",
  "arguments": {
    "image1": {
      "type": "Invocation",
      "arguments": {
        "id": "CGIAR/SRTM90_V4"
      },
      "functionName": "Image.load"
    },
    "image2": {
      "type": "Invocation",
      "arguments": {
        "value": 10
      },
      "functionName": "Image.constant"
    }
  },
  "functionName": "Image.add"
})
    

La segunda sentencia print enviará la solicitud a Google y mostrará la respuesta POST de los servidores de Google. Para ver la respuesta en todo su esplendor JSON, haz clic en el vínculo JSON en el lado derecho de la consola, junto al objeto impreso:

{
  "type": "Image",
  "bands": [
    {
      "id": "elevation",
      "data_type": {
        "type": "PixelType",
        "precision": "int",
        "min": -32758,
        "max": 32777
      },
      "crs": "EPSG:4326",
      "crs_transform": [
        0.0008333333535119891,
        0,
        -180,
        0,
        -0.0008333333535119891,
        60
      ]
    }
  ]
}
    

No se envía nada a Google para su procesamiento hasta que se recibe una solicitud. En este ejemplo, imprimir el resultado de una llamada a getInfo() en un objeto de servidor activa una solicitud. No se realiza ningún procesamiento en el servidor hasta que se solicita ese resultado de forma explícita. Ten en cuenta que print() en el editor de código de JavaScript es una función especial del cliente que une una llamada getInfo() asíncrona. En Python, la llamamos directamente.

Otro ejemplo de solicitar algo es mostrarlo en el editor de código o en el elemento del mapa de geemap. Cuando se envía esta solicitud a Google, solo se muestran las tarjetas necesarias para mostrar el resultado en el Editor de código o en el elemento del mapa de geemap. Específicamente, la posición del mapa y el nivel de zoom determinan qué datos se procesan y se convierten en imágenes que se pueden mostrar en el mapa. Si haces un barrido panorámico o zoom, ten en cuenta que las otras tarjetas se calculan de forma diferida. Este sistema on demand permite la paralelización y un procesamiento eficiente, pero también significa que la imagen que se muestra en el mapa se produce a partir de diferentes entradas según el nivel de zoom y la ubicación de los límites del mapa. Obtén más información sobre cómo se determinan las entradas de un procesamiento a partir de la solicitud en el documento Scale.