Earth Engine è progettato in modo che tu debba preoccuparti raramente delle proiezioni delle mappe quando effettui i calcoli. Come per la scala, la proiezione in cui vengono eseguiti i calcoli è
determinata in base a un approccio "pull". Nello specifico, gli input vengono richiesti nella proiezione
dell'output. L'output può essere determinato da un parametro di funzione (ad es. crs
),
dagli oggetti mappa di Code Editor e geemap (che hanno una proiezione maps Mercatore (EPSG:3857)) o con una chiamata reproject()
. Quando visualizzate le immagini in Code Editor o geemap, gli input vengono richiesti in proiezione Mercatore. Considera la
seguente semplice operazione su un'immagine MODIS, che ha una proiezione
sinusoidale:
// The input image has a SR-ORG:6974 (sinusoidal) projection. var image = ee.Image('MODIS/061/MOD13A1/2014_05_09').select(0); // Normalize the image and add it to the map. var rescaled = image.unitScale(-2000, 10000); var visParams = {min: 0.15, max: 0.7}; Map.addLayer(rescaled, visParams, 'Rescaled');
import ee import geemap.core as geemap
# The input image has a SR-ORG:6974 (sinusoidal) projection. image = ee.Image('MODIS/061/MOD13A1/2014_05_09').select(0) # Normalize the image and add it to the map. rescaled = image.unitScale(-2000, 10000) vis_params = {'min': 0.15, 'max': 0.7} m = geemap.Map() m.add_layer(rescaled, vis_params, 'Rescaled') m
L'ordine delle operazioni per questo esempio di codice è riportato nel diagramma della Figura 1. Tieni conto che la proiezione dell'input è determinata dall'output, in particolare dalla proiezione mercatore delle mappe della visualizzazione della mappa nell'Editor di codice. Questa proiezione si propaga nuovamente attraverso la sequenza di operazioni in modo che gli input vengano richiesti nelle mappe Mercator, a una scala determinata dal livello di zoom della mappa.

In Earth Engine, le proiezioni sono specificate da un sistema di riferimento dei corpi celesti (CRS o
il parametro crs
di molti metodi). Puoi controllare la proiezione di un'immagine chiamando projection()
:
var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318').select(0); print('Projection, crs, and crs_transform:', image.projection()); print('Scale in meters:', image.projection().nominalScale());
import ee import geemap.core as geemap
image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318').select(0) display('Projection, crs, and crs_transform:', image.projection()) display('Scale in meters:', image.projection().nominalScale())
Tieni presente che chiamando nominalScale()
sul ee.Projection
restituito
da projection()
, puoi determinare la risoluzione nativa dell'immagine. La
risoluzione nativa è la scala dei pixel nominale in metri del livello più basso della
piramide di immagini. Poiché ogni banda di un'immagine può avere una scala e/o una proiezione diversa, se chiami projection()
su un'immagine con almeno una banda che non ha la stessa proiezione delle altre, potresti visualizzare un errore come:
La proiezione predefinita
A meno che tu non debba eseguire il calcolo in una proiezione specifica, in genere non è necessario specificare una proiezione. Solo per l'output ambiguo, Earth Engine richiede di specificare una proiezione e/o una scala. L'ambiguità può derivare dalla riduzione di un ImageCollection
contenente immagini con proiezioni diverse (ad es. creando un'immagine composita). Un'immagine composita o un mosaico di immagini di input con proiezioni diverse avrà la proiezione predefinita, ovvero WGS84 con scala di 1 grado.
Ad esempio:
var collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA'); var mosaic = collection.filterDate('2018-01-01', '2019-01-01').mosaic(); print(mosaic.projection());
import ee import geemap.core as geemap
collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA') mosaic = collection.filterDate('2018-01-01', '2019-01-01').mosaic() display(mosaic.projection())
Se provi a utilizzare un'immagine come questa in un calcolo, potresti visualizzare un errore simile al seguente:
In genere, un'aggregazione su una scala di 1 grado non è auspicata o prevista, pertanto Earth Engine fornisce questo promemoria per fornire una specifica completa dell'output.
Spesso gli utenti trovano questo comportamento confuso e si preoccupano delle informazioni sulla proiezione "persa", ma i pixel non vengono effettivamente calcolati finché non sono necessari (scopri di più). A quel punto, c'è sempre una proiezione di output che accompagna la richiesta che specifica come calcolare il composito.
Nella maggior parte dei casi d'uso, l'assenza di proiezione non è un problema ed è in realtà un'ottimizzazione preziosa, in quanto consente di visualizzare l'anteprima dei risultati a qualsiasi livello di zoom senza dover attendere il completamento del calcolo della risoluzione completa. Ciò significa che l'output può essere visualizzato in modo diverso a diversi livelli di zoom.
Se l'immagine di visualizzazione ottimizzata non è sufficiente, il calcolo in una proiezione specifica può essere forzato ritraducendo l'output come descritto nella sezione seguente.
Riproiezione
Puoi forzare l'esecuzione delle operazioni in una proiezione specifica con il metodo
reproject()
. L'utilizzo di reproject()
comporta la richiesta degli input
nella proiezione specificata nella chiamata reproject()
.
I calcoli nel codice prima della chiamata reproject()
verranno eseguiti
nella proiezione specificata. Ad esempio, per forzare la produzione di un composito in una proiezione specifica:
// Some projection that is suitable for your area of interest. var proj = ee.Projection(...); var output = collection.reduce(...).reproject(proj);
import ee import geemap.core as geemap
# Some projection that is suitable for your area of interest. proj = ee.Projection(...) output = collection.reduce(...).reproject(proj)
Ecco alcuni casi che richiedono una proiezione fissa:
- Calcolo dei gradienti (ad es.
ee.Terrain.gradient
oee.Terrain.slope
). reduceResolution
, per quando vuoi aggregare pixel di risoluzione più elevata in una risoluzione più bassa. Scopri di più sulla riduzione della risoluzione.
Esistono diversi motivi per cui dovresti evitare di utilizzare reproject()
, a meno che non sia assolutamente necessario. Supponiamo, ad esempio, che tu riprojeti qualcosa e lo aggiunga alla mappa. Se la scala specificata nella chiamata reproject()
è molto più piccola
rispetto al livello di zoom della mappa, Earth Engine richiederà tutti gli input su scala molto ridotta
su un'estensione spaziale molto ampia. Ciò può comportare la richiesta di troppi dati contemporaneamente e causare un errore.
Se l'eventuale output è in una proiezione diversa da quella specificata nella chiamatareproject()
, verrà eseguita un'altra riproiezione. Questo è un altro motivo per usare reproject()
con cautela nel codice. Prendi in considerazione
il seguente esempio, che forza la re-proiezione dell'immagine MODIS prima su
WGS84 e poi su
proiezione Mercatore per la visualizzazione nella mappa dell'editor di codice:
// The input image has a SR-ORG:6974 (sinusoidal) projection. var image = ee.Image('MODIS/061/MOD13A1/2014_05_09').select(0); // Operations *before* the reproject call will be done in the projection // specified by reproject(). The output results in another reprojection. var reprojected = image .unitScale(-2000, 10000) .reproject('EPSG:4326', null, 500); Map.addLayer(reprojected, {min: 0.15, max: 0.7}, 'Reprojected');
import ee import geemap.core as geemap
# The input image has a SR-ORG:6974 (sinusoidal) projection. image = ee.Image('MODIS/061/MOD13A1/2014_05_09').select(0) # Operations *before* the reproject call will be done in the projection # specified by reproject(). The output results in another reprojection. reprojected = image.unitScale(-2000, 10000).reproject('EPSG:4326', None, 500) m = geemap.Map() m.add_layer(reprojected, {'min': 0.15, 'max': 0.7}, 'Reprojected') m
La Figura 2 mostra il flusso di operazioni corrispondente a questo semplice
esempio di riproiezione. Tieni presente che la prima riproiezione è esplicita, come specificato nella chiamata
reproject()
. La seconda riproiezione è implicita, eseguita automaticamente da Earth Engine per visualizzare il risultato sulla mappa. Inoltre, tieni presente che le informazioni sulla proiezione da utilizzare si propagano dalla richiesta all'input.
