Carga del manifiesto de la tabla

Si necesitas más flexibilidad para subir tablas a Google Earth Engine (EE) que la que proporciona la IU del editor de código o el comando upload de la herramienta de línea de comandos "earthengine", puedes hacerlo describiendo una carga de tabla con un archivo JSON conocido como "manifiesto" y usando el comando upload table --manifest de la herramienta de línea de comandos.

Configuración única

  1. Las cargas de manifiestos solo funcionan con archivos ubicados en Google Cloud Storage. Para comenzar a usar Google Cloud Storage, crea un proyecto de Google Cloud, si aún no tienes uno. Ten en cuenta que la configuración requiere que especifiques una tarjeta de crédito para la facturación. En este momento, EE no le cobra a nadie, pero transferir archivos a Google Cloud Storage antes de subirlos a EE tendrá un costo pequeño. Para los tamaños de datos de carga típicos (decenas o cientos de gigabytes), el costo será bastante bajo.
  2. En tu proyecto, activa la API de Cloud Storage y crea un bucket.
  3. Instala el cliente de Python de Earth Engine. Incluye la herramienta de línea de comandos de earthengine, que usaremos para subir datos.
  4. Para las cargas automáticas, te recomendamos que uses una cuenta de servicio de Google Cloud asociada con tu proyecto. No necesitas una cuenta de servicio para realizar pruebas, pero cuando tengas un momento, comienza a familiarizarte con su uso.

IDs y nombres de los activos

Para los recursos de los proyectos de Cloud, usa projects/my_cloud_project/assets/my_asset.

En el caso de los proyectos heredados más antiguos, el nombre del activo en el manifiesto debe ser ligeramente diferente del ID del activo visible en otro lugar de Earth Engine. Para subir activos cuyos IDs comienzan con users/some_user o projects/some_project, el nombre del activo en el manifiesto debe tener la cadena projects/earthengine-legacy/assets/ al principio del ID. Por ejemplo, el ID del activo de EE users/username/my_table se debe subir con el nombre projects/earthengine-legacy/assets/users/username/my_table.

Sí, esto significa que los IDs como projects/some_projects/some_asset se convierten en nombres en los que se menciona projects dos veces: projects/earthengine-legacy/assets/projects/some_projects/some_asset. Esto es confuso, pero es necesario para cumplir con los estándares de la API de Google Cloud.

Cómo usar manifiestos

A continuación, se muestra el manifiesto más simple posible. Sube un archivo llamado small.csv desde un bucket de Google Cloud Storage llamado gs://earthengine-test.

{
  "name": "projects/some-project-id/assets/some-asset-id",
  "sources": [
    {
      "uris": [
        "gs://earthengine-test/small.csv"
      ]
    }
  ]
}

Para usarlo, guárdalo en un archivo llamado manifest.json y ejecuta lo siguiente:

earthengine upload table --manifest /path/to/manifest.json

(El archivo gs://earthengine-test/small.csv existe y es legible de forma pública; puedes usarlo para realizar pruebas).

Para las cargas de archivos Shapefile, especifica solo el archivo .shp. Los otros archivos se detectarán automáticamente.

Varias fuentes

Es posible especificar varias fuentes de CSV o Shapefile, con un archivo por fuente. En este caso, cada archivo CSV debe tener la misma estructura. Por ejemplo, tenemos dos archivos CSV, region1.csv y region2.csv:

id shape
1 {"type":"Point","coordinates":[-119,36]}
2 {"type":"Point","coordinates":[-118,37]}
3 {"type":"Point","coordinates":[-117,38]}
id shape
4 {"type":"Point","coordinates":[-112,40]}
5 {"type":"Point","coordinates":[-111,41]}
6 {"type":"Point","coordinates":[-110,42]}

Tienen la misma estructura, pero contenido diferente. Se subieron a un bucket de Cloud Storage: gs://earthengine-test/region1.csv y gs://earthengine-test/region2.csv. Para transferirlos como un recurso de Earth Engine, crea un manifiesto con dos entradas en la lista sources, como se muestra a continuación:

{
  "name": "projects/some-project-id/assets/some-asset-id",
  "sources": [
    {
      "uris": [
        "gs://earthengine-test/region1.csv"
      ]
    },
    {
      "uris": [
        "gs://earthengine-test/region2.csv"
      ]
    }
  ]
}

Hora de inicio y finalización

Todos los recursos deben especificar la hora de inicio y finalización para brindar más contexto a los datos, especialmente si se incluyen en colecciones. Estos campos no son obligatorios, pero te recomendamos que los uses siempre que sea posible.

La hora de inicio y finalización suele referirse a la hora de la observación, no a la hora en que se produjo el archivo fuente.

Para simplificar, la hora de finalización se considera un límite exclusivo. Por ejemplo, para los recursos que abarcan exactamente un día, usa la medianoche de dos días consecutivos (por ejemplo, 1980-01-31T00:00:00 y 1980-02-01T00:00:00) para la hora de inicio y finalización. Si el activo no tiene duración, establece la hora de finalización como la misma que la de inicio. Representa las horas en manifiestos como cadenas ISO 8601. Para simplificar los valores de fecha, te recomendamos que asumas que la hora de finalización es exclusiva (por ejemplo, la medianoche del día siguiente para los recursos diarios).

Ejemplo:

{
  "name": "projects/some-project-id/assets/some-asset-id",
  "sources": [
    {
      "uris": [
        "gs://bucket/table_20190612.csv"
      ]
    }
  ],
  "startTime": "1980-01-31T00:00:00Z",
  "endTime": "1980-02-01T00:00:00Z"
}

Referencia de la estructura del manifiesto

La siguiente estructura JSON incluye todos los campos posibles del manifiesto de carga de tablas. Encuentra las definiciones de los campos en la siguiente sección de definiciones de campos del manifiesto.

{
  "name": <string>,
  "sources": [
    {
      "uris": [
        <string>
      ],
      "charset": <string>,
      "maxErrorMeters": <double>,
      "maxVertices": <int32>,
      "crs": <string>,
      "geodesic": <boolean>,
      "primaryGeometryColumn": <string>,
      "xColumn": <string>,
      "yColumn": <string>,
      "dateFormat": <string>,
      "csvDelimiter": <string>,
      "csvQualifier": <string>,
    }
  ],
  "uriPrefix": <string>,
  "startTime": {
    "seconds": <integer>
  },
  "endTime": {
    "seconds": <integer>
  },
  "properties": {
    <unspecified>
  }
}

Definiciones de campos del manifiesto

nombre

string

Es el nombre del recurso que se creará. name tiene el formato "projects/*/assets/**" (por ejemplo, projects/earthengine-legacy/assets/users/USER/ASSET).

fuentes

list

Es una lista de campos que definen las propiedades de un archivo de tabla y sus archivos secundarios. Consulta los siguientes campos de elementos del diccionario sources para obtener más información.

sources[i].uris

list

Es una lista de los URIs de los datos que se transferirán. Actualmente, solo se admiten los URIs de Google Cloud Storage. Cada URI debe especificarse en el siguiente formato: gs://bucket-id/object-id. El objeto principal debe ser el primer elemento de la lista, y los Sidecars deben aparecer después. Cada URI tiene el prefijo TableManifest.uri_prefix si está configurado.

sources[i].charset

string

Es el nombre del conjunto de caracteres predeterminado que se usará para decodificar cadenas. Si está vacío, se supone que el conjunto de caracteres es “UTF-8” de forma predeterminada.

sources[i].maxErrorMeters

double

Es el error máximo permitido en metros cuando se transforma la geometría entre sistemas de coordenadas. Si está vacío, el error máximo es de 1 metro de forma predeterminada.

sources[i].maxVertices

int32

Es la cantidad máxima de vértices. Si no es cero, la geometría se subdividirá en piezas espacialmente disyuntivas, cada una dentro de este límite.

sources[i].crs

string

Es el código CRS predeterminado o la cadena WKT que especifica el sistema de referencia de coordenadas de cualquier geometría que no tenga uno especificado. Si se deja en blanco, el valor predeterminado será EPSG:4326. Solo para fuentes de CSV o TFRecord.

sources[i].geodesic

boolean

Es la estrategia predeterminada para interpretar los bordes en la geometría que no tienen uno especificado de otra manera. Si es falso, los bordes son rectos en la proyección. Si es verdadero, los bordes se curvan para seguir la ruta más corta en la superficie de la Tierra. Si se deja en blanco, se establece de forma predeterminada como "false" si el CRS es un sistema de coordenadas proyectado. Solo para fuentes de CSV o TFRecord.

sources[i].primaryGeometryColumn

string

Es la columna de geometría que se usará como geometría principal de una fila cuando haya más de una columna de geometría.

Si se deja en blanco y existe más de una columna de geometría, se usa la primera columna de geometría que se encuentre. Solo para fuentes de CSV o TFRecord.

sources[i].xColumn

string

Es el nombre de la columna numérica de la coordenada X para deducir la geometría del punto. Si también se especifica yColumn y ambas columnas contienen valores numéricos, se construirá una columna de geometría de punto con valores x,y en el sistema de coordenadas que se proporciona en el CRS. Si se deja en blanco y el CRS no especifica un sistema de coordenadas proyectado, el valor predeterminado es “longitud”. Si se deja en blanco y el CRS especifica un sistema de coordenadas proyectado, se establece de forma predeterminada en una cadena vacía y no se genera ninguna geometría de punto.

Una columna de geometría de punto generada se llamará {xColumn}_{yColumn}_N, donde se agregará N para que {xColumn}_{yColumn}_N sea única si ya existe una columna llamada {xColumn}_{yColumn}. Solo para fuentes de CSV o TFRecord.

sources[i].yColumn

string

Es el nombre de la columna de coordenadas Y numéricas para deducir la geometría del punto. Si también se especifica xColumn y ambas columnas contienen valores numéricos, se construirá una columna de geometría de punto con valores x,y en el sistema de coordenadas que se proporciona en el CRS. Si se deja en blanco y el CRS no especifica un sistema de coordenadas proyectado, el valor predeterminado es “latitud”. Si se deja en blanco y el CRS especifica un sistema de coordenadas proyectado, se establece de forma predeterminada en una cadena vacía y no se genera ninguna geometría de punto.

Una columna de geometría de punto generada se llamará {xColumn}_{yColumn}_N, donde se agregará N para que {xColumn}_{yColumn}_N sea única si ya existe una columna llamada {xColumn}_{yColumn}. Solo para fuentes de CSV o TFRecord.

sources[i].dateFormat

string

Es un formato con el que se analizan los campos que codifican fechas. El patrón de formato debe ser como se describe en la documentación de la clase DateTimeFormat de Joda-Time. Si se deja en blanco, las fechas se importarán como cadenas. Solo para fuentes de CSV o TFRecord.

sources[i].csvDelimiter

string

Cuando se transfieren archivos CSV, se usa un solo carácter como delimitador entre los valores de las columnas en una fila. Si se deja en blanco, el valor predeterminado es ','. Solo para fuentes CSV.

sources[i].csvQualifier

string

Cuando se transfieren archivos CSV, un carácter que rodea los valores de las columnas (también conocido como “carácter de comillas”) Si se deja en blanco, el valor predeterminado es ". Solo para fuentes CSV.

Si un valor de columna no está entre calificadores, se recortan los espacios en blanco iniciales y finales. Por ejemplo:

    ..., test,...            <== this value is not qualified
becomes the string value:
    "test"                   <== leading whitespace is stripped
mientras:
    ...," test",...          <== this value IS qualified with quotes
becomes the string value:
    " test"                  <== leading whitespace remains!

uriPrefix

string

Es un prefijo opcional que se agrega a todos los uris definidos en el manifiesto.

startTime

integer

La marca de tiempo asociada con el activo, si corresponde Por lo general, corresponde al momento en el que se recopilaron los datos. En el caso de los recursos que corresponden a un intervalo de tiempo, como los valores promedio durante un mes o un año, esta marca de tiempo corresponde al inicio de ese intervalo. Se especifica como segundos y, de manera opcional, nanosegundos desde la época (1970-01-01). Se supone que está en la zona horaria UTC.

endTime

integer

En el caso de los recursos que corresponden a un intervalo de tiempo, como los valores promedio durante un mes o un año, esta marca de tiempo corresponde al final de ese intervalo (exclusivo). Se especifica como segundos y, de manera opcional, nanosegundos desde la época (1970-01-01). Se supone que está en la zona horaria UTC.

properties

dictionary

Un diccionario plano arbitrario de pares clave-valor. Las claves deben ser cadenas, y los valores pueden ser números o cadenas. Aún no se admiten los valores de lista para los recursos subidos por el usuario.

columnDataTypeOverrides

dictionary

Si la detección automática de tipos no funciona correctamente, usa este campo con nombres de columna como claves y una de las siguientes constantes como valores: COLUMN_DATA_TYPE_STRING, COLUMN_DATA_TYPE_NUMERIC, COLUMN_DATA_TYPE_LONG.

Limitaciones

Tamaño del manifiesto JSON

El límite de tamaño del archivo de manifiesto JSON es de 10 MB. Si tienes muchos archivos para subir, considera maneras de reducir la cantidad de caracteres necesarios para describir el conjunto de datos. Por ejemplo, usa el campo uriPrefix para eliminar la necesidad de proporcionar la ruta de acceso del bucket de GCP para cada URI en la lista uris. Si se necesita una mayor reducción de tamaño, intenta acortar los nombres de archivo.