Proiezioni

Earth Engine è progettato in modo che raramente tu debba preoccuparti delle proiezioni cartografiche quando esegui i calcoli. Come per la scala, la proiezione in cui vengono eseguiti i calcoli viene determinata in base a un meccanismo di "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 dell'editor di codice e di geemap (che hanno una proiezione maps mercator (EPSG:3857)) o con una chiamata reproject(). Quando visualizzi le immagini nell'editor di codice o in geemap, gli input vengono richiesti in proiezione di Mercatore. Considera la seguente operazione su un'immagine MODIS, che ha una proiezione sinusoidale:

Editor di codice (JavaScript)

// 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');

Configurazione di Python

Consulta la pagina Ambiente Python per informazioni sull'API Python e sull'utilizzo di geemap per lo sviluppo interattivo.

import ee
import geemap.core as geemap

Colab (Python)

# 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 codice campione è illustrato nella Figura 1. Tieni presente che la proiezione dell'input è determinata dall'output, in particolare dalla proiezione Mercatore di Maps della visualizzazione della mappa nell'editor di codice. Questa proiezione si propaga a ritroso nella sequenza di operazioni in modo che gli input vengano richiesti in Mercatore, a una scala determinata dal livello di zoom della mappa.

proiezione
Figura 1. Diagramma di flusso delle operazioni corrispondenti alla visualizzazione di un'immagine MODIS nella mappa dell'editor di codice. Le proiezioni (lato sinistro del diagramma di flusso) di ogni operazione sono determinate dall'output. Le linee curve indicano il flusso di informazioni verso la riproiezione: in particolare, la proiezione e la scala di output.

In Earth Engine, le proiezioni sono specificate da un sistema di riferimento delle coordinate (CRS o parametro crs di molti metodi). Puoi controllare la proiezione di un'immagine chiamando projection():

Editor di codice (JavaScript)

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());

Configurazione di Python

Consulta la pagina Ambiente Python per informazioni sull'API Python e sull'utilizzo di geemap per lo sviluppo interattivo.

import ee
import geemap.core as geemap

Colab (Python)

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() su ee.Projection restituito da projection(), puoi determinare la risoluzione nativa dell'immagine. La risoluzione nativa è la scala nominale dei pixel in metri del livello più basso della piramide di immagini. Poiché ogni banda di un'immagine può avere una scala e/o 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 non sia necessario che il calcolo avvenga 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. creazione di un composito). Un'immagine che è un composito o mosaico di immagini di input con proiezioni diverse avrà la proiezione predefinita, ovvero WGS84 con scala di 1 grado. Ad esempio:

Editor di codice (JavaScript)

var collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA');
var mosaic = collection.filterDate('2018-01-01', '2019-01-01').mosaic();
print(mosaic.projection());

Configurazione di Python

Consulta la pagina Ambiente Python per informazioni sull'API Python e sull'utilizzo di geemap per lo sviluppo interattivo.

import ee
import geemap.core as geemap

Colab (Python)

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 come:

In genere, un'aggregazione su una scala di 1 grado non è desiderata o prevista, quindi Earth Engine fornisce questo promemoria per fornire una specifica completa per l'output.

Gli utenti spesso trovano questo comportamento sconcertante e si preoccupano delle informazioni di proiezione "perse", ma i pixel non vengono effettivamente calcolati finché non sono necessari (scopri di più) e, a quel punto, c'è sempre una proiezione di output che accompagna la richiesta che specifica come calcolare il composito.

Nella stragrande maggioranza dei casi d'uso, la mancanza di una 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. Tuttavia, l'output può apparire diverso a diversi livelli di zoom.

Se l'immagine visualizzata ottimizzata non è sufficiente, il calcolo in una proiezione specifica può essere forzato riproiettando 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:

Editor di codice (JavaScript)

// Some projection that is suitable for your area of interest.
var proj = ee.Projection(...);
var output = collection.reduce(...).reproject(proj);

Configurazione di Python

Consulta la pagina Ambiente Python per informazioni sull'API Python e sull'utilizzo di geemap per lo sviluppo interattivo.

import ee
import geemap.core as geemap

Colab (Python)

# Some projection that is suitable for your area of interest.
proj = ee.Projection(...)
output = collection.reduce(...).reproject(proj)

Alcuni casi che richiedono una proiezione fissa includono:

Esistono diversi motivi per cui dovresti evitare di utilizzare reproject() a meno che non sia assolutamente necessario. Supponiamo, ad esempio, di riproiettare qualcosa e di aggiungerlo alla mappa. Se la scala specificata nella chiamata reproject() è molto più piccola del livello di zoom della mappa, Earth Engine richiederà tutti gli input a una scala molto piccola, su un'estensione spaziale molto ampia. Ciò può comportare la richiesta di troppi dati contemporaneamente e generare un errore.

Se l'output finale è in una proiezione diversa da quella specificata nella chiamata reproject(), verrà eseguita un'altra riproiezione. Questo è un altro motivo per cui è consigliabile usare reproject() con cautela nel codice. Considera l'esempio seguente, che forza la riproiezione dell'immagine MODIS prima su WGS84 e poi su maps mercator per la visualizzazione nella mappa dell'editor di codice:

Editor di codice (JavaScript)

// 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');

Configurazione di Python

Consulta la pagina Ambiente Python per informazioni sull'API Python e sull'utilizzo di geemap per lo sviluppo interattivo.

import ee
import geemap.core as geemap

Colab (Python)

# 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 da Earth Engine automaticamente per visualizzare il risultato sulla mappa. Tieni inoltre presente che le informazioni sulla proiezione da utilizzare vengono propagate dalla richiesta all'input.

riproiezione
Figura 2. Diagramma di flusso delle operazioni corrispondenti alla riproiezione di un'immagine MODIS nella mappa di Code Editor. Le linee curve indicano il flusso di informazioni verso le riproiezioni: in particolare, la proiezione e la scala di output.