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
- 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.
- En tu proyecto, activa la API de Cloud Storage y crea un bucket.
- Instala el cliente de Python de Earth Engine. Incluye la herramienta de línea de comandos de
earthengine
, que usaremos para subir datos. - 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
gs://earthengine-test/region2.csv
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
...," 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.