Se você precisar de mais flexibilidade ao fazer upload de tabelas no Google Earth Engine (EE) do que a interface do editor de código ou o comando upload
da ferramenta de linha de comando "earthengine", faça o upload de uma tabela usando um arquivo JSON conhecido como "manifesto" e o comando upload table --manifest
da ferramenta de linha de comando.
Configuração única
- Os uploads de manifestos só funcionam com arquivos localizados no Google Cloud Storage. Para começar a usar o Google Cloud Storage, crie um projeto do Google Cloud, se você ainda não tiver um. A configuração exige a especificação de um cartão de crédito para faturamento. A EE não está cobrando ninguém no momento, mas transferir arquivos para o Google Cloud Storage antes de fazer upload deles para a EE vai ter um pequeno custo. Para tamanhos de dados de upload típicos (dezenas ou centenas de gigabytes), o custo será bastante baixo.
- No projeto, ative a API Cloud Storage e crie um bucket.
- Instale o cliente Python do Earth Engine. Ele inclui a ferramenta de linha de comando
earthengine
, que será usada para fazer upload de dados. - Para uploads automatizados, use uma conta de serviço do Google Cloud associada ao seu projeto. Você não precisa de uma conta de serviço para testar, mas quando tiver um momento, comece a se familiarizar com o uso delas.
IDs e nomes dos recursos
Para recursos em projetos do Cloud, use
projects/my_cloud_project/assets/my_asset
.
Para projetos legados mais antigos, o nome do recurso no manifesto precisa ser um pouco diferente do ID do recurso visível em outros lugares no Earth Engine. Para fazer upload de recursos com IDs que começam com
users/some_user
ou projects/some_project
, o nome do recurso no
manifesto precisa ter a string projects/earthengine-legacy/assets/
adicionada ao
início do ID. Por exemplo, o ID do recurso EE users/username/my_table
precisa ser enviado
usando o nome projects/earthengine-legacy/assets/users/username/my_table
.
Sim, isso significa que IDs como projects/some_projects/some_asset
são
convertidos em nomes em que projects
é mencionado duas vezes:
projects/earthengine-legacy/assets/projects/some_projects/some_asset
.
Isso é confuso, mas necessário para se conformar aos padrões da API Google Cloud.
Como usar manifestos
Confira abaixo o manifesto mais simples possível. Ele faz upload de um arquivo chamado small.csv
de um bucket do Google Cloud Storage chamado gs://earthengine-test
.
{ "name": "projects/some-project-id/assets/some-asset-id", "sources": [ { "uris": [ "gs://earthengine-test/small.csv" ] } ] }
Para usá-lo, salve-o em um arquivo chamado manifest.json
e execute:
earthengine upload table --manifest /path/to/manifest.json
O arquivo gs://earthengine-test/small.csv
existe e é
legível publicamente. Você pode usá-lo para testes.
Para uploads de shapefile, especifique apenas o arquivo .shp. Os outros arquivos serão detectados automaticamente.
Múltiplas fontes
É possível especificar várias origens de CSV ou shapefile, com um arquivo por origem. Nesse caso, cada arquivo CSV precisa ter a mesma estrutura. Por exemplo, temos dois arquivos CSV, region1.csv
e region2.csv
:
id | forma |
---|---|
1 | {"type":"Point","coordinates":[-119,36]} |
2 | {"type":"Point","coordinates":[-118,37]} |
3 | {"type":"Point","coordinates":[-117,38]} |
id | forma |
---|---|
4 | {"type":"Point","coordinates":[-112,40]} |
5 | {"type":"Point","coordinates":[-111,41]} |
6 | {"type":"Point","coordinates":[-110,42]} |
Eles têm a mesma estrutura, mas conteúdos diferentes. Eles foram enviados para um bucket do Cloud Storage: gs://earthengine-test/region1.csv
gs://earthengine-test/region2.csv
sources
, como este:
{ "name": "projects/some-project-id/assets/some-asset-id", "sources": [ { "uris": [ "gs://earthengine-test/region1.csv" ] }, { "uris": [ "gs://earthengine-test/region2.csv" ] } ] }
Horário de início e término
Todos os recursos precisam especificar o horário de início e de término para dar mais contexto aos dados, especialmente se eles forem incluídos em coleções. Esses campos não são obrigatórios, mas recomendamos usá-los sempre que possível.
O horário de início e término geralmente significa o horário da observação, não o horário em que o arquivo de origem foi produzido.
O horário de término é tratado como um limite exclusivo para simplificar. Por exemplo, para recursos que abrangem exatamente um dia, use a meia-noite de dois dias consecutivos (por exemplo, 1980-01-31T00:00:00 e 1980-02-01T00:00:00) para a hora de início e término. Se o recurso não tiver duração, defina o horário de término como o mesmo que o de início. Representar horários em manifestos como strings ISO 8601. Recomendamos que você suponha que o horário de término seja exclusivo (por exemplo, meia-noite do dia seguinte para recursos diários) para simplificar os valores de data.
Exemplo:
{ "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" }
Referência da estrutura do manifesto
A estrutura JSON a seguir inclui todos os campos possíveis do manifesto de upload de tabelas. Encontre definições de campos na seção Definições de campos do manifesto.
{ "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> } }
Definições de campos do manifesto
nome
string
O nome do recurso a ser criado.
name
tem o formato "projects/*/assets/**",
por exemplo, projects/earthengine-legacy/assets/users/USER/ASSET
.
origens
list
Uma lista de campos que definem as propriedades de um arquivo de tabela e
os sidecars. Consulte os campos de elemento do dicionário sources
a seguir
para mais informações.
sources[i].uris
list
Uma lista dos URIs dos dados a serem transferidos. Atualmente, apenas URIs do Google Cloud Storage
são aceitos. Cada URI precisa ser especificado no seguinte formato:
gs://bucket-id/object-id
.
O objeto principal precisa ser o primeiro elemento da lista, e os sidecars
precisam ser listados depois. Cada URI é prefixado com
TableManifest.uri_prefix
, se definido.
sources[i].charset
string
O nome do charset padrão a ser usado para decodificar strings. Se estiver vazio, o padrão será o conjunto de caracteres "UTF-8".
sources[i].maxErrorMeters
double
O erro máximo permitido em metros ao transformar a geometria entre sistemas de coordenadas. Se estiver vazio, o erro máximo será de 1 metro por padrão.
sources[i].maxVertices
int32
O número máximo de vértices. Se não for zero, a geometria será subdividida em partes espacialmente separadas, cada uma abaixo desse limite.
sources[i].crs
string
A string WKT ou o código CRS padrão que especifica o sistema de referência de coordenadas de qualquer geometria que não tenha um especificado. Se for deixado em branco, o padrão será EPSG:4326. Somente para origens CSV/TFRecord.
sources[i].geodesic
boolean
A estratégia padrão para interpretar arestas na geometria que não têm uma especificada. Se for falso, as bordas serão retas na projeção. Se verdadeiro, as arestas são curvas para seguir o caminho mais curto na superfície da Terra. Se estiver em branco, o padrão será "false" se o CRS for um sistema de coordenadas projetado. Somente para origens CSV/TFRecord.
sources[i].primaryGeometryColumn
string
A coluna de geometria a ser usada como geometria principal de uma linha quando houver mais de uma coluna de geometria.
Se ficar em branco e houver mais de uma coluna de geometria, a primeira coluna de geometria encontrada será usada. Somente para origens CSV/TFRecord.
sources[i].xColumn
string
O nome da coluna numérica de coordenadas x para deduzir a geometria do ponto. Se
yColumn
também for especificado e ambas as colunas contiverem valores numéricos,
uma coluna de geometria de ponto será construída com valores x,y no
sistema de coordenadas fornecido no CRS. Se deixado em branco e o CRS não especificar um sistema de coordenadas projetado, o padrão será "longitude". Se deixado em branco e o CRS especificar um sistema de coordenadas projetado, o padrão será uma string vazia e nenhuma geometria de ponto será gerada.
Uma coluna de geometria de ponto gerada vai ser nomeada como {xColumn}_{yColumn}_N
, em que N é anexado para que {xColumn}_{yColumn}_N
seja exclusivo se uma coluna com o nome {xColumn}_{yColumn}
já existir. Somente para origens CSV/TFRecord.
sources[i].yColumn
string
O nome da coluna de coordenada y numérica para deduzir a geometria do ponto. Se
xColumn
também for especificado e ambas as colunas contiverem valores numéricos,
uma coluna de geometria de ponto será construída com valores x,y no
sistema de coordenadas fornecido no CRS. Se deixado em branco e o CRS não especificar um sistema de coordenadas projetado, o padrão será "latitude". Se deixado em branco e o CRS especificar um sistema de coordenadas projetado, o padrão será uma string vazia e nenhuma geometria de ponto será gerada.
Uma coluna de geometria de ponto gerada vai ser nomeada como {xColumn}_{yColumn}_N
, em que N é anexado para que {xColumn}_{yColumn}_N
seja exclusivo se uma coluna com o nome {xColumn}_{yColumn}
já existir. Somente para origens CSV/TFRecord.
sources[i].dateFormat
string
Um formato para analisar campos de codificação de datas. O padrão de formato precisa ser conforme descrito na documentação da classe DateTimeFormat do Joda-Time. Se for deixado em branco, as datas serão importadas como strings. Somente para fontes CSV/TFRecord.
sources[i].csvDelimiter
string
Ao transferir arquivos CSV, um único caractere é usado como delimitador entre os valores de coluna em uma linha. Se for deixado em branco, o padrão será ','
.
Somente para origens CSV.
sources[i].csvQualifier
string
Ao transferir arquivos CSV, um caractere que envolve os valores das colunas (também conhecido como "caractere de aspas"). Se for deixado em branco, o padrão será "
.
Somente para origens CSV.
Se um valor de coluna não estiver entre parênteses, os espaços em branco iniciais e finais serão removidos. Exemplo:
..., 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
Um prefixo opcional adicionado a todas as uris
definidas no manifesto.
startTime
integer
O carimbo de data/hora associado ao recurso, se houver. Isso geralmente corresponde ao momento em que os dados foram coletados. Para recursos que correspondem a um intervalo de tempo, como valores médios em um mês ou ano, esse carimbo de data/hora corresponde ao início desse intervalo. Especificado como segundos e (opcionalmente) nanossegundos desde o início da época (1970-01-01). Supõe-se que esteja no fuso horário UTC.
endTime
integer
Para recursos que correspondem a um intervalo de tempo, como valores médios ao longo de um mês ou ano, esse carimbo de data/hora corresponde ao fim desse intervalo (exclusivo). Especificado como segundos e (opcionalmente) nanossegundos desde o início da época (1970-01-01). Supõe-se que esteja no fuso horário UTC.
properties
dictionary
Um dicionário plano arbitrário de pares de chave-valor. As chaves precisam ser strings, e os valores podem ser números ou strings. Os valores de lista ainda não são compatíveis com recursos enviados pelo usuário.
columnDataTypeOverrides
dictionary
Se a detecção automática de tipo não estiver funcionando corretamente, use esse campo com nomes de coluna como chaves e uma das seguintes constantes como valores: COLUMN_DATA_TYPE_STRING, COLUMN_DATA_TYPE_NUMERIC, COLUMN_DATA_TYPE_LONG.
Limitações
Tamanho do manifesto JSON
O limite de tamanho do arquivo de manifesto JSON é de 10 MB. Se você tiver muitos arquivos para fazer upload,
considere maneiras de reduzir o número de caracteres necessários para descrever o conjunto de dados. Por exemplo,
use o campo uriPrefix
para eliminar
a necessidade de fornecer o caminho do bucket do GCP para cada URI na
uris
lista. Se for necessário reduzir ainda mais o tamanho, tente encurtar os nomes dos arquivos.