O Earth Engine oferece suporte a recursos com tecnologia Cloud Optimized GeoTIFFs (COGs). Uma vantagem dos recursos com tecnologia COG é que os campos espaciais e de metadados da imagem são indexados no momento da criação do recurso, tornando a imagem mais eficiente nas coleções. O desempenho dos recursos com tecnologia COG é comparável ao dos recursos ingeridos em casos de uso típicos.
Um único recurso pode ser apoiado por vários COGs (por exemplo, pode haver um COG por banda). No entanto, não é possível usar muitos blocos de COG para uma única banda.
Como alternativa, o Earth Engine pode carregar imagens diretamente de COGs no Google Cloud
Storage (saiba
mais).
No entanto, uma imagem carregada por ee.Image.loadGeoTIFF e adicionada a uma coleção de imagens exigirá uma leitura do GeoTiff para operações de filtragem na coleção.
Para criar um recurso com tecnologia COG,
- Coloque os arquivos COG em um bucket do GCS (consulte Local para as regiões permitidas).
- Escreva um manifesto de upload de imagem
- Use o utilitário de linha de comando
earthenginepara enviar um comando de upload:
earthengine upload external_image --manifest my_manifest.json
Manifesto de imagem de amostra com um Tileset
O ImageManifest mais simples é aquele com um único Tileset. Se nenhuma banda for especificada, o recurso resultante vai conter todas as bandas do GeoTIFF com os nomes de banda codificados no GeoTIFF (nesse caso, "vis-red", "vis-green" e "vis-blue").
request = {
'imageManifest': {
'name': f'projects/{ee_project}/assets/cogdemo1',
'tilesets': [
{ 'id': '0', 'sources': [ { 'uris': [
'gs://ee-docs-demos/COG_demo.tif'] } ] }
],
'properties': {
'version': '1.1'
},
'startTime': '2016-01-01T00:00:00.000000000Z',
'endTime': '2016-12-31T15:01:23.000000000Z',
},
}
pprint(request)
Mais de um Tileset
É possível especificar um ImageManifest com mais de um Tileset, em que cada banda do recurso resultante é apoiada por uma das bandas de um Tileset usando os campos tilesetId e tilesetBandIndex. Isso é útil quando bandas diferentes têm resoluções ou tipos de dados diferentes. As bandas podem ser listadas em qualquer ordem de qualquer Tileset disponível. No exemplo a seguir:
- "b4b3b2.tif" tem uma escala de 10 m, enquanto "b5b6b7" tem uma escala de 20 m.
- A ordem das bandas do recurso resultante é mista dos COGs de entrada (por exemplo, a banda de saída 0 é do
Tileset0, enquanto a banda de saída 1 é doTileset1).
request = {
'imageManifest': {
'name': f'projects/{ee_project}/assets/cogdemo2',
'uriPrefix': 'gs://ee-docs-demos/external_image_demo/',
'tilesets': [
{ 'id': '0', 'sources': [ { 'uris': ['b4b3b2.tif'] } ] },
{ 'id': '1', 'sources': [ { 'uris': ['b5b6b7.tif'] } ] },
],
'bands': [
{ 'id': 'red', 'tilesetId': '0', 'tilesetBandIndex': 0 },
{ 'id': 'rededge3', 'tilesetId': '1', 'tilesetBandIndex': 2 },
{ 'id': 'rededge2', 'tilesetId': '1', 'tilesetBandIndex': 1 },
{ 'id': 'green', 'tilesetId': '0', 'tilesetBandIndex': 1 },
{ 'id': 'blue', 'tilesetId': '1', 'tilesetBandIndex': 0 },
{ 'id': 'rededge1', 'tilesetId': '0', 'tilesetBandIndex': 2 },
],
},
}
pprint(request)
Detalhes sobre recursos com tecnologia COG
Local
O local do bucket do Cloud Storage precisa ser um destes:
- A multirregião dos EUA
- Qualquer região birregional dos EUA que inclua US-CENTRAL1
- A região US-CENTRAL1
Classe de armazenamento
A classe de armazenamento do bucket precisa ser "Standard Storage".
Permissões de compartilhamento
As ACLs dos recursos do Earth Engine com tecnologia COG e os dados subjacentes são gerenciados separadamente. Ao compartilhar recursos com tecnologia COG com colaboradores para leitura, é responsabilidade do proprietário garantir que o acesso de leitura seja concedido ao recurso do Earth Engine e aos arquivos COG subjacentes.
1. Conceder permissões de leitura do bucket do Google Cloud Storage
Para que os colaboradores leiam recursos com tecnologia COG, eles precisam ter acesso de leitura aos arquivos COG subjacentes no bucket do Google Cloud Storage. Sem essas permissões, o Earth Engine não poderá recuperar os dados para eles. Se os dados no Google Cloud Storage não estiverem visíveis para um usuário do Earth Engine, o Earth Engine vai retornar um erro do formulário "Falha ao carregar o GeoTIFF em gs://my-bucket/my-object#123456" (em que 123456 é a geração do objeto).
Especificamente, os colaboradores precisam ter as seguintes permissões:
storage.buckets.getno bucket (para recuperar metadados e local do bucket, permitindo que o Earth Engine resolva corretamente a origem do recurso).storage.objects.getno bucket (para ler os dados reais do recurso com tecnologia COG).
Essas permissões são fornecidas pelas funções "Leitor de bucket legada do Storage" e "Leitor de objeto legada do Storage" respectivamente, entre outras.
Para atribuir essas funções aos colaboradores:
- Acesse a página de permissão do bucket:
https://console.cloud.google.com/storage/browser/{MY-BUCKET};tab=permissions - Clique em "CONCEDER ACESSO"
- Adicione todos os principais (por exemplo, usuários, grupos, contas de serviço) que devem receber acesso de leitura.
- Atribua as seguintes funções:
- "Leitor de bucket legada do Storage" (fornece
storage.buckets.gete outras permissões de leitura no nível do bucket). - "Leitor de objeto legada do Storage" (fornece
storage.objects.get). - Como alternativa, você pode criar uma nova função personalizada com apenas as permissões
storage.buckets.getestorage.objects.gete atribuir essa função.
- "Leitor de bucket legada do Storage" (fornece
- Salvar
2. Compartilhar o recurso do Earth Engine para leitura
Depois de garantir que seus colaboradores tenham as permissões necessárias no bucket e nos objetos do GCS, você também precisará compartilhar o recurso do Earth Engine. Para mais informações sobre como definir permissões de recursos do Earth Engine, consulte o guia de gerenciamento de recursos do Earth Engine.
Gerações
Quando um recurso com tecnologia COG é criado, o Earth Engine lê os metadados dos TIFFs especificados no manifesto e cria uma entrada de repositório de recursos. Cada URI associado a essa entrada pode ter uma geração. Consulte os documentos de controle de versão de objetos para mais detalhes sobre
gerações. Se uma geração for especificada, por exemplo, gs://foo/bar#123, o Earth Engine vai armazenar esse URI literalmente. Se uma geração não for especificada, o Earth Engine vai armazenar esse URI com a geração do TIFF no momento em que ImportExternalImage foi chamado.
Isso significa que, se qualquer TIFF que compreenda um recurso externo no GCS for atualizado (mudando a geração), o Earth Engine vai retornar um erro "Falha ao carregar o GeoTIFF em gs://my-bucket/my-object#123456" porque o objeto esperado não existe mais (a menos que o bucket permita várias versões de objetos).
Essa política foi projetada para manter os metadados do recurso sincronizados com os metadados do objeto.
Configuração
Em termos de como um COG deve ser configurado, o TIFF PRECISA ser:
Em blocos, em que as dimensões do bloco são:
- 256x256
- 512x512
- 1024x1024
- 2.048 x 2.048
Organizado para que todos os IFDs estejam no início.
Para melhor desempenho:
- Use dimensões de bloco de 512 x 512 ou maiores.
- Inclua visões gerais de potência de 2.
Dependendo dos casos de uso pretendidos, a "INTERLEAVE" opção de criação pode afetar o desempenho. Recomendamos o uso de intercalação de banda em todas as circunstâncias.
Consulte esta página para mais detalhes sobre uma configuração otimizada.
O comando gdal_translate a seguir vai converter um raster em um GeoTIFF otimizado para nuvem, intercalado por banda e compactado por zstd, que terá um bom desempenho no Earth Engine:
gdal_translate in.tif out.tif \
-co COPY_SRC_OVERVIEWS=YES \
-co TILED=YES \
-co BLOCKXSIZE=512 \
-co BLOCKYSIZE=512 \
-co COMPRESS=ZSTD \
-co ZSTD_LEVEL=22 \
-co INTERLEAVE=BAND \
-co NUM_THREADS=ALL_CPUS
É possível reduzir ainda mais o tamanho do arquivo de saída especificando um
preditor
(-co PREDICTOR=2 para tipos de dados inteiros e -co PREDICTOR=3 para tipos de dados de ponto
flutuante).
Para usuários com GDAL >= 3.11, o driver COG pode produzir arquivos sem precisar se preocupar em criar e preservar visões gerais.
gdal_translate in.tif out.tif \
-of COG \
-co OVERVIEWS=IGNORE_EXISTING \
-co COMPRESS=ZSTD \
-co LEVEL=22 \
-co PREDICTOR=2 \
-co INTERLEAVE=BAND \
-co NUM_THREADS=ALL_CPUS \
Como criar recursos com tecnologia Cloud GeoTiff usando a API REST
Observação:a API REST contém recursos novos e avançados que podem não ser adequados para todos os usuários. Se você é iniciante no Earth Engine, recomendamos começar com o guia do JavaScript.
Para criar um recurso com tecnologia COG usando a API REST, faça uma solicitação POST para o
endpoint ImportExternalImage
do Earth Engine.
Como mostrado abaixo, essa solicitação precisa ser autorizada para criar um recurso na pasta do usuário.
Iniciar uma sessão autorizada
Para criar um recurso do Earth Engine na pasta do usuário, você precisa se autenticar ao fazer a solicitação. É possível usar
credenciais do autenticador do Earth Engine para iniciar uma
AuthorizedSession.
Em seguida, use a AuthorizedSession para enviar solicitações ao Earth Engine.
import ee
import json
from pprint import pprint
from google.auth.transport.requests import AuthorizedSession
ee.Authenticate() # or !earthengine authenticate --auth_mode=gcloud
# Specify the cloud project you want associated with Earth Engine requests.
ee_project = 'your-project'
session = AuthorizedSession(
ee.data.get_persistent_credentials().with_quota_project(ee_project)
)
Corpo da solicitação
O corpo da solicitação é uma instância de um
ImageManifest.
É aqui que o caminho para o COG é especificado, juntamente com outras propriedades úteis.
Consulte este
guia para
detalhes sobre como configurar um ImageManifest. É possível definir um ou mais Tileset, com cada um deles apoiando uma ou mais bandas. Para ImportExternalImage, no máximo um ImageSource é compatível por Tileset.
Consulte este documento para detalhes sobre como exportar COGs.
Enviar a solicitação
Faça a solicitação POST para o endpoint
projects.images.importExternal
do Earth Engine.
url = f'https://earthengine.googleapis.com/v1alpha/projects/{ee_project}/image:importExternal'
response = session.post(
url = url,
data = json.dumps(request)
)
pprint(json.loads(response.content))
Executar no Google Colab
Ver origem no GitHub