O Earth Engine oferece suporte a recursos com o suporte de GeoTIFFs otimizados para nuvem (COGs, na sigla em inglês) armazenados no Google Cloud Storage (GCS).
Ao registrar um recurso com o suporte de COG, o Earth Engine indexa os campos espaciais e de metadados da imagem no momento da criação. Isso torna a imagem eficiente quando usada em coleções, com desempenho comparável aos recursos ingeridos padrão (consulte a visão geral do GeoTIFF otimizado para nuvem (COG)).
Pré-requisitos e configuração do Cloud Storage
Antes de registrar um COG, configure corretamente os recursos do Google Cloud Storage.
1. Local do bucket (requisito estrito)
Para que o Earth Engine acesse seu bucket do Cloud Storage, ele precisa estar localizado em uma das seguintes regiões ou multirregiões do data center:
- A multirregião
us - Qualquer birregional dos EUA que inclua
us-central1 - A região
us-central1
Se o bucket estiver em qualquer outro data center regional (como us-east4 ou europe-west1), o Earth Engine vai rejeitar solicitações de registro e leitura.
2. Classe de armazenamento e faturamento
- Recomendamos o uso da classe de armazenamento Standard. O Standard Storage não tem regras de duração mínima, evitando penalidades de faturamento por exclusão antecipada se você atualizar ou substituir arquivos temporários.
- Embora os loops de computação do Earth Engine não gerem sobretaxas de recuperação de dados do Cloud Storage, o acesso a níveis de armazenamento não Standard Storage de ferramentas externas (como software SIG para computador) gera taxas de recuperação caras.
- É necessário ativar o faturamento no projeto do Google Cloud para usar o GCS. Consulte o Guia de início rápido do Google Cloud Storage para começar.
Etapa 1: preparar os COGs
Os arquivos TIFF precisam ser otimizados para a nuvem. O TIFF precisa ser:
- Em blocos, com dimensões de bloco de 256 x 256, 512 x 512, 1024 x 1024 ou 2048 x 2048. Recomendamos 512 x 512 ou mais para melhor desempenho.
- Organizado para que todos os diretórios de arquivos de imagem (IFDs) estejam no início.
- Inclua visões gerais de potência de 2.
- Use o intercalamento BAND.
Você pode usar o GDAL para converter suas imagens.
Como usar o driver GDAL COG (GDAL >= 3.1 recomendado) :
gdal_translate in.tif out.tif \
-of COG \
-co BIGTIFF=YES \
-co OVERVIEWS=IGNORE_EXISTING \
-co COMPRESS=ZSTD \
-co LEVEL=16 \
-co BLOCKSIZE=512 \
-co INTERLEAVE=BAND \
-co NUM_THREADS=ALL_CPUS \
-co PREDICTOR=2 # 2 for integers, 3 for floating point
Como usar o driver GTiff padrão :
Primeiro, gere visões gerais internas de potência de 2 (usando
gdal raster overview add
ou gdaladdo), depois copie
a imagem e as visões gerais em um layout de COG em blocos:
gdaladdo -r nearest in.tif 2 4 8 16 32 # or -r cubic for continuous/float data
gdal_translate in.tif out.tif \
-co BIGTIFF=YES \
-co COPY_SRC_OVERVIEWS=YES \
-co TILED=YES \
-co BLOCKXSIZE=512 \
-co BLOCKYSIZE=512 \
-co COMPRESS=ZSTD \
-co ZSTD_LEVEL=16 \
-co INTERLEAVE=BAND \
-co NUM_THREADS=ALL_CPUS \
-co PREDICTOR=2 # 2 for integers, 3 for floating point
Etapa 2: criar o manifesto
Se você registrar um COG usando a biblioteca de cliente Python do Earth Engine, a ferramenta de linha de comando earthengine ou a API REST do Earth Engine, defina um manifesto de upload de imagem especificando o destino do recurso, os URIs do Google Cloud Storage e os metadados de banda opcionais.
Exemplo: COG único com suporte a todas as bandas Se o COG contiver todas as bandas (por exemplo, RGB), o manifesto exigirá apenas um conjunto de blocos:
{
"name": "projects/my-project/assets/my_cog_asset",
"tilesets": [
{
"id": "default_tileset",
"sources": [
{
"uris": [
"gs://google-sample-bucket/my_optimized_image.tif"
]
}
]
}
]
}
Exemplo: vários COGs (um por banda) Se você tiver arquivos separados para diferentes bandas (por exemplo, vermelho, verde, azul em arquivos separados):
{
"name": "projects/my-project/assets/my_multi_band_cog",
"tilesets": [
{
"id": "red_tileset",
"sources": [ { "uris": [ "gs://google-sample-bucket/band_red.tif" ] } ]
},
{
"id": "green_tileset",
"sources": [ { "uris": [ "gs://google-sample-bucket/band_green.tif" ] } ]
}
],
"bands": [
{ "id": "R", "tilesetId": "red_tileset", "tilesetBandIndex": 0 },
{ "id": "G", "tilesetId": "green_tileset", "tilesetBandIndex": 0 }
]
}
Etapa 3: enviar a solicitação de registro
Você pode enviar o manifesto ao Earth Engine usando a biblioteca de cliente Python do Earth Engine, a ferramenta de linha de comando earthengine ou a API REST do Earth Engine. Escolha o método que melhor se adapta ao seu fluxo de trabalho.
Biblioteca de cliente do Python
Em um script Python ou notebook Jupyter, use a biblioteca de cliente Python do Earth Engine (ee.data) depois de inicializar o projeto:
import ee # 1. Authenticate and initialize ee.Authenticate() ee.Initialize(project='your-project-id') # 2. Define the manifest as a Python dictionary manifest = { "name": "projects/your-project-id/assets/my_cog_asset", "tilesets": [ { "id": "default_tileset", "sources": [ { "uris": [ "gs://google-sample-bucket/my_optimized_image.tif" ] } ] } ] } # 3. Start the ingestion task (allow_overwrite=True corresponds to --force) result = ee.data.startExternalImageIngestion(manifest, allow_overwrite=True) print(f"Asset registered: {result['name']}")
Ferramenta de linha de comando
No terminal, salve o manifesto em um arquivo chamado
manifest.json e execute o earthengine upload
comando:
# 1. Verify your environment is authenticated earthengine authenticate # 2. Submit the external image upload task earthengine --project your-project-id \ upload external_image \ --manifest manifest.json
API REST (Python)
Para fluxos de trabalho automatizados sem a biblioteca de cliente, envie uma solicitação autorizada
POST diretamente para o endpoint de API REST do Earth Engine
projects.image.importExternal (demonstrado aqui usando
Python):
import json from pprint import pprint import ee from google.auth.transport.requests import AuthorizedSession # 1. Authenticate and start an authorized HTTP session ee.Authenticate() ee_project = 'your-project-id' session = AuthorizedSession( ee.data.get_persistent_credentials().with_quota_project(ee_project) ) # 2. Define the REST request body wrapping the manifest request = { 'imageManifest': { 'name': f'projects/{ee_project}/assets/my_cog_asset', 'tilesets': [ { 'id': 'default_tileset', 'sources': [ { 'uris': [ 'gs://google-sample-bucket/my_optimized_image.tif' ] } ] } ] } } # 3. Send the POST request url = ( 'https://earthengine.googleapis.com/v1alpha/' f'projects/{ee_project}/image:importExternal' ) response = session.post(url=url, data=json.dumps(request)) pprint(json.loads(response.content))
Depois de enviado, o pedido de registro inicia uma operação de indexação de metadados leve. Como o registro de COG não copia dados de pixel, essa operação normalmente é concluída em segundos.
Restrições de manifesto para recursos de COG
Ao criar um manifesto para recursos com o suporte de COG, observe estas restrições estritas (que são diferentes dos manifestos de ingestão padrão):
- Bucket único:todos os URIs no manifesto precisam estar no mesmo bucket do GCS.
- Um URI por origem:cada
ImageSourceprecisa conter exatamente um URI. Não é possível mesclar vários arquivos em uma única origem de conjunto de blocos. Para mesclar várias cenas de COG, registre cada COG como um recurso e combine-os em umaee.ImageCollectionusando.mosaic(). - Sem
mask_bands:mask_bandsde nível superior não é compatível. UsemissingDatano manifesto ou verifique se o TIFF tem um valor nodata interno. - Sem
data_typeno conjunto de blocos:não especifiquedata_typena seçãotilesets. Ele é detectado automaticamente. - Sem
dimensionsna origem: não especifiquedimensionsnoImageSource. - Sem
subdataset_prefix/subdataset_suffix. - Sem
min_tile_area_ratioouskip_metadata_read.
Etapa 4: configurar permissões (essencial para compartilhamento)
Ao contrário dos recursos padrão do Earth Engine, os dados de pixel de um COG permanecem no GCS. Ao compartilhar um recurso com o suporte de COG com outras pessoas, é necessário conceder acesso de leitura ao recurso do Earth Engine e aos arquivos do GCS.
1. Conceder permissões de bucket do GCS
Os colaboradores precisam de permissões para ler os arquivos do GCS.
Permissões necessárias:
storage.buckets.get(para recuperar metadados e local do bucket)storage.objects.get(para ler os dados de pixel)
Você pode conceder essas permissões usando os seguintes papéis padrão do Cloud Storage:
- Leitor de buckets do Storage (fornece
storage.buckets.getpara ler metadados e local do bucket) - Leitor de objetos do Storage (fornece
storage.objects.getpara ler dados de pixel)
Etapas para configurar no console do Google Cloud :
- Acesse o navegador do Cloud Storage.
- Clique no nome do bucket.
- Selecione a guia Permissões.
- Clique em PERMITIR ACESSO.
- Adicione os endereços de e-mail dos colaboradores (ou um grupo do Google ou
allUserspara acesso público). - Atribua os papéis Leitor de buckets do Storage e Leitor de objetos do Storage.
- Clique em Salvar.
2. Compartilhar o recurso do Earth Engine
Compartilhe o recurso usando o gerenciador de recursos do Earth Engine ou a CLI. Consulte o Guia de gerenciamento de recursos para mais detalhes.
Como gerenciar gerações de objetos
Ao registrar um COG, o Earth Engine armazena a geração (versão) específica do objeto do GCS. Se você atualizar o arquivo no GCS, a geração dele vai mudar.
- Por padrão, o Earth Engine não vai carregar o recurso e retornará um erro:
Failed to load the GeoTIFF at gs://google-sample-bucket/my-object#old-generation. - Isso foi projetado para evitar que os metadados (como projeção ou área de cobertura) fiquem dessincronizados com os pixels subjacentes.
Prática recomendada:se você precisar atualizar os dados de imagem subjacentes, registre-os como um novo recurso ou execute novamente o comando de upload com a flag
--forceem vez de substituir arquivos no local:earthengine --project your-project-id upload external_image --force --manifest manifest.json
Como usar recursos registrados
Depois de registrado, um recurso com o suporte de COG é acessado em scripts do Earth Engine como qualquer recurso de imagem ingerido padrão:
JavaScript
var image = ee.Image('projects/your-project-id/assets/my_cog_asset');
Python
image = ee.Image('projects/your-project-id/assets/my_cog_asset')