Earth Engine supporta gli asset basati su GeoTIFF ottimizzati per il cloud (COG) archiviati in Google Cloud Storage (GCS).
Quando registri un asset basato su COG, Earth Engine indicizza i campi spaziali e dei metadati dell'immagine al momento della creazione. In questo modo, l'immagine è performante quando viene utilizzata nelle raccolte, con prestazioni paragonabili agli asset standard inseriti (vedi la panoramica di GeoTIFF ottimizzati per il cloud (COG)).
Prerequisiti e configurazione di Cloud Storage
Prima di registrare un COG, devi configurare correttamente le risorse di Google Cloud Storage.
1. Località del bucket (requisito rigoroso)
Affinché Earth Engine possa accedere al tuo bucket Cloud Storage, il bucket deve trovarsi in una delle seguenti regioni o multi-regioni del data center:
- La multi-regione
us - Qualsiasi doppia regione degli Stati Uniti che includa
us-central1 - La regione
us-central1
Se il bucket si trova in un altro data center regionale (ad esempio us-east4 o europe-west1), Earth Engine rifiuterà le richieste di registrazione e lettura.
2. Classe di archiviazione e fatturazione
- Ti consigliamo di utilizzare la classe di archiviazione Standard. Lo Standard Storage non prevede regole di durata minima dell'archiviazione, il che evita penalità di fatturazione per l'eliminazione anticipata se aggiorni o sostituisci i file temporanei.
- Sebbene i loop di calcolo di Earth Engine non comportino costi aggiuntivi per il recupero dei dati di Cloud Storage, l'accesso ai livelli di archiviazione non Standard Storage da strumenti esterni (come il software GIS desktop) comporta costi di recupero elevati.
- Per utilizzare GCS, devi aver abilitato la fatturazione nel tuo progetto Google Cloud. Per iniziare, consulta la guida rapida di Google Cloud Storage.
Passaggio 1: prepara i COG
I file TIFF devono essere ottimizzati per il cloud. Il TIFF deve essere:
- Suddiviso in riquadri, con dimensioni dei riquadri di: 256x256, 512x512, 1024x1024 o 2048x2048. Per prestazioni ottimali, consigliamo 512x512 o valori superiori.
- Organizzato in modo che tutte le directory dei file immagine (IFD) si trovino all'inizio.
- Includi le panoramiche di potenza di 2.
- Utilizza l'interleave BAND.
Puoi utilizzare GDAL per convertire le immagini.
Utilizzo del driver GDAL COG (GDAL >= 3.1 consigliato):
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
Utilizzo del driver GTiff standard:
Innanzitutto, genera panoramiche interne di potenza di 2 (utilizzando
gdal raster overview add
o gdaladdo), quindi copia
l'immagine e le panoramiche in un layout COG suddiviso in riquadri:
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
Passaggio 2: crea il manifest
Indipendentemente dal fatto che tu registri un COG utilizzando la libreria client Python di Earth Engine, lo strumento a riga di comando earthengine o l'API REST di Earth Engine, devi definire un manifest di caricamento delle immagini che specifichi la destinazione dell'asset, gli URI di Google Cloud Storage e i metadati delle bande facoltativi.
Esempio: un singolo COG che supporta tutte le bande Se il COG contiene tutte le bande (ad es. RGB), il manifest richiede un solo tileset:
{
"name": "projects/my-project/assets/my_cog_asset",
"tilesets": [
{
"id": "default_tileset",
"sources": [
{
"uris": [
"gs://google-sample-bucket/my_optimized_image.tif"
]
}
]
}
]
}
Esempio: più COG (uno per banda) Se hai file separati per bande diverse (ad es. rosso, verde, blu in file separati):
{
"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 }
]
}
Passaggio 3: invia la richiesta di registrazione
Puoi inviare il manifest a Earth Engine utilizzando la libreria client Python di Earth Engine, lo strumento a riga di comando earthengine o l'API REST di Earth Engine. Scegli il metodo più adatto al tuo flusso di lavoro.
Libreria client Python
In uno script Python o in un notebook Jupyter, utilizza la libreria client Python di Earth Engine (ee.data) dopo aver inizializzato il progetto:
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']}")
Strumento a riga di comando
Nel terminale, salva il manifest in un file denominato
manifest.json ed esegui il comando di caricamento earthengine:
# 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)
Per i flussi di lavoro automatizzati senza la libreria client, invia una richiesta autorizzata
POST direttamente all'endpoint dell'API REST di Earth Engine
projects.image.importExternal (mostrato qui utilizzando
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))
Una volta inviata, la richiesta di registrazione avvia un'operazione di indicizzazione dei metadati leggera. Poiché la registrazione COG non copia i dati dei pixel, questa operazione in genere viene completata in pochi secondi.
Limitazioni del manifest per gli asset COG
Quando crei un manifest per gli asset basati su COG, tieni presente queste limitazioni rigorose (che differiscono dai manifest di importazione standard):
- Un solo bucket: tutti gli URI nel manifest devono risiedere nello stesso bucket GCS.
- Un URI per origine: ogni
ImageSourcedeve contenere esattamente un URI. Non puoi unire più file in mosaico in un'unica origine tileset. Per unire in mosaico più scene COG, registra ogni COG come asset e combinali in unee.ImageCollectionutilizzando.mosaic(). - Nessun
mask_bands:mask_bandsdi primo livello non è supportato. UtilizzamissingDatanel manifest o assicurati che il TIFF abbia un valore nodata interno. - Nessun
data_typenel tileset: non specificaredata_typenella sezionetilesets; viene rilevato automaticamente. - Nessun
dimensionsnell'origine: non specificaredimensionsinImageSource. - Nessun
subdataset_prefix/subdataset_suffix. - Nessun
min_tile_area_ratiooskip_metadata_read.
Passaggio 4: configura le autorizzazioni (fondamentale per la condivisione)
A differenza degli asset Earth Engine standard, i dati dei pixel di un COG rimangono in GCS. Quando condividi un asset basato su COG con altri utenti, devi concedere loro l'accesso in lettura sia all'asset Earth Engine sia ai file GCS.
1. Concedi le autorizzazioni del bucket GCS
I collaboratori hanno bisogno delle autorizzazioni per leggere i file da GCS.
Autorizzazioni obbligatorie:
storage.buckets.get(per recuperare i metadati e la località del bucket)storage.objects.get(per leggere i dati dei pixel)
Puoi concedere queste autorizzazioni utilizzando i seguenti ruoli standard di Cloud Storage:
- Visualizzatore bucket Storage (fornisce
storage.buckets.getper leggere i metadati e la località del bucket) - Visualizzatore oggetti Storage (fornisce
storage.objects.getper leggere i dati dei pixel)
Passaggi per la configurazione nella console Google Cloud:
- Vai al browser Cloud Storage.
- Fai clic sul nome del bucket.
- Seleziona la scheda Autorizzazioni.
- Fai clic su CONCEDI ACCESSO.
- Aggiungi gli indirizzi email dei tuoi collaboratori (o un gruppo Google o
allUsersper l'accesso pubblico). - Assegna i ruoli Visualizzatore bucket Storage e Visualizzatore oggetti Storage.
- Fai clic su Salva.
2. Condividi l'asset Earth Engine
Condividi l'asset stesso utilizzando Earth Engine Asset Manager o CLI. Per maggiori dettagli, consulta la Guida alla gestione degli asset.
Gestire le generazioni di oggetti
Quando registri un COG, Earth Engine memorizza la generazione (versione) specifica dell'oggetto GCS. Se aggiorni il file in GCS, la sua generazione cambia.
- Per impostazione predefinita, Earth Engine non riuscirà a caricare l'asset e restituirà un errore:
Failed to load the GeoTIFF at gs://google-sample-bucket/my-object#old-generation. - Questa operazione è progettata per impedire che i metadati (come la proiezione o l'impronta) non siano sincronizzati con i pixel sottostanti.
Best practice: se devi aggiornare i dati dell'immagine sottostante, registrali come nuovo asset o esegui di nuovo il comando di caricamento con il flag
--forceanziché sovrascrivere i file in loco:earthengine --project your-project-id upload external_image --force --manifest manifest.json
Utilizzare gli asset registrati
Una volta registrato, un asset basato su COG viene accessibile negli script Earth Engine come qualsiasi asset immagine inserito standard:
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')