Upload de manifesto de tabela

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

  1. 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.
  2. No projeto, ative a API Cloud Storage e crie um bucket.
  3. Instale o cliente Python do Earth Engine. Ele inclui a ferramenta de linha de comando earthengine, que será usada para fazer upload de dados.
  4. 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 e gs://earthengine-test/region2.csv. Para fazer a transferência como um recurso do Earth Engine, crie um manifesto com duas entradas na lista 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
enquanto:
    ...," 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.