Occorrenze di inondazione (1984-2015)

Il set di dati GSW contiene molti livelli di dati che presentano i dati sulle acque di superficie in modi diversi. Inizieremo visualizzando il livello di presenza di acqua, che fornisce un riepilogo di dove e con quale frequenza si è verificata la presenza di acqua di superficie nell'intero periodo di tempo compreso tra marzo 1984 e ottobre 2015.

Questa sezione del tutorial:

  1. aggiungere un livello della mappa per visualizzare la presenza di acque superficiali,
  2. mostra come eseguire query sui valori del livello della mappa,
  3. aggiungere uno stile personalizzato per migliorare la visualizzazione,
  4. creare un livello di maschera dell'acqua binaria utilizzando un valore di soglia,
  5. centrare la mappa su parti interessanti del mondo e
  6. mostra come eseguire il refactoring dello script per renderlo più leggibile e gestibile.

Creazione di una visualizzazione di base

Inizia copiando le seguenti istruzioni nell'editor di codice:

Editor di codice (JavaScript)

var gsw = ee.Image('JRC/GSW1_0/GlobalSurfaceWater');
var occurrence = gsw.select('occurrence');
Map.addLayer(occurrence);

La prima istruzione fa riferimento all'oggetto immagine di Earth Engine per il set di dati GSW e lo memorizza in una variabile denominata gsw. La seconda istruzione seleziona un singolo livello del set di dati GSW e lo archivia in una variabile denominata occurrence. La terza istruzione aggiunge l'immagine dell'occorrenza alla mappa interattiva dell'editor di codice.

Fai clic sul pulsante "Esegui " dell'editor di codice e dopo alcuni secondi dovresti vedere una mappa con colorazione grigia lungo le coste, simile alla Figura 1.

visualizzazione predefinita
Figura 1. Visualizzazione predefinita del livello di dati sull'occorrenza di acqua di superficie globale.

Nella maggior parte delle aree, il set di dati GSW appare trasparente, perché le località in cui non sono state raccolte immagini Landsat (ad es. aree oceaniche) o in cui l'acqua non è stata rilevata da nessuna osservazione nei 32 anni sono mascherate.

Ispezione dei valori

Per esplorare i valori del livello di presenza di acqua, utilizzeremo la scheda Inspector dell'editor di codice. Innanzitutto, fai clic sulla scheda dell'ispettore, poi sulla mappa per selezionare una località. La scheda dell'inspector mostrerà le informazioni su ciascuno dei livelli presenti nel punto in cui hai fatto clic.

scheda Strumento di controllo
Figura 2. Output di esempio della scheda Inspector.

Nell'esempio precedente, il valore del livello denominato value è 98. Le unità sono punti percentuali, quindi per circa il 98% del tempo la posizione è stata classificata come coperta d'acqua. Il valore è la media di ciascuno dei valori mensili di presenza di acqua di superficie, che viene normalizzata in base alla variazione stagionale, come descritto nella Guida per gli utenti dei dati (v2) .

Refactoring per migliorare il codice

Il nostro script contiene solo due istruzioni, ma abbiamo già l'opportunità di eseguire il refactoring del codice in modo che lo script finale sia più facile da leggere e gestire nel tempo. Attualmente, l'istruzione Map.addLayer() passa un singolo argomento occurrence, ovvero l'oggetto immagine Earth Engine che vogliamo visualizzare sulla mappa. Tuttavia, il metodo Map.addLayer() consente anche di passare argomenti aggiuntivi. Per vedere rapidamente quali argomenti sono disponibili, posiziona il cursore dopo la parentesi di apertura e premi la scorciatoia da tastiera per "Mostra suggerimenti di codice" per visualizzare il documento di aiuto per il metodo addLayer. (Le scorciatoie da tastiera possono essere visualizzate selezionando il menu Guida -> Scorciatoie.)

Argomenti di Map.addLayer
Figura 3. Screenshot che mostra gli argomenti del metodo addLayer.

Le scorciatoie da tastiera mostrano che è possibile passare cinque argomenti a Map.addLayer: eeObject, visParams, name, shown e opacity. Nello script attuale stiamo passando una singola variabile occurrence che viene interpretata come il primo argomento, eeObject. Per passare sia l'oggetto variabile sia un argomento aggiuntivo che denomina il livello, possiamo refactoring del codice per utilizzare "argomenti denominati" (eeObject e name) che vengono passati al metodo da una struttura di dati JSON come mostrato di seguito:

Editor di codice (JavaScript)

Map.addLayer({eeObject: occurrence, name: 'Water Occurrence (1984-2015)'});

Esegui di nuovo il codice per assicurarti che funzioni ancora dopo le modifiche di refactoring. La mappa risultante deve rimanere invariata.

Aggiungere parametri di visualizzazione

Successivamente, lavoreremo per migliorare i parametri di visualizzazione predefiniti, che rendono l'acqua di colore grigio. Aggiungi una nuova istruzione che crea una variabile VIS_OCCURRENCE e passala come argomento aggiuntivo al metodo addLayer.

Editor di codice (JavaScript)

var VIS_OCCURRENCE = {
  min: 0,
  max: 100,
  palette: ['red', 'blue']
};

Editor di codice (JavaScript)

Map.addLayer({
  eeObject: occurrence.updateMask(occurrence.divide(100)),
  name: 'Water Occurrence (1984-2015)',
  visParams: VIS_OCCURRENCE
});

I parametri di visualizzazione memorizzati nella struttura JSON VIS_OCCURRENCE indicano che il rosso deve essere utilizzato per un valore minimo dello 0% e il blu per un valore massimo del 100%. L'aggiunta di .updateMask(occurrence.divide(100)) fa sì che l'opacità/trasparenza dei pixel venga impostata in base al valore di occorrenza.

Esegui di nuovo lo script e visualizza i risultati rivisti dopo le modifiche allo stile.

Occorrenza di acqua di superficie
Figura 4. Screenshot della presenza di acqua nel delta del Paraná vicino a Buenos Aires, con un colore rosso trasparente per l'endpoint del valore minimo 0% e un colore blu pieno per l'endpoint del valore massimo.

Le aree acquatiche ora sono blu. Avanzamento.

Creazione di un livello di soglia

L'immagine dell'occorrenza di acqua contiene informazioni sulla frequenza prevista dell'acqua utilizzando un intervallo di valori compreso tra 0 e 100%. Tuttavia, spesso è utile definire un livello idrico binario (ovvero "acqua" e "non acqua") in base a una determinata percentuale di occorrenze (ovvero un valore di soglia). Utilizzeremo questo semplice livello binario come livello di sfondo pulito su cui possono essere posizionati altri livelli GSW. La creazione di questo livello di soglia può essere eseguita utilizzando le seguenti istruzioni, che utilizzano un valore di soglia del 90% per separare l'acqua e non l'acqua.

Innanzitutto, definiamo una nuova variabile di visualizzazione VIS_WATER_MASK per contenere le informazioni di stile per la maschera dell'acqua:

Editor di codice (JavaScript)

var VIS_WATER_MASK = {
  palette: ['white', 'black']
};

Quindi calcoliamo un livello di maschera dell'acqua utilizzando l'operatore di confronto maggiore di .gt(90) e poi impostiamo le aree precedentemente mascherate su zero utilizzando il metodo .unmask():

Editor di codice (JavaScript)

// Create a water mask layer, and set the image mask so that non-water areas
// are opaque.
var water_mask = occurrence.gt(90).unmask(0);

Infine, aggiungi il livello alla mappa. Per visualizzare questo livello sotto tutti gli altri livelli, inserisci la seguente istruzione prima di qualsiasi altra istruzione Map.addLayer.

Editor di codice (JavaScript)

Map.addLayer({
  eeObject: water_mask,
  visParams: VIS_WATER_MASK,
  name: '90% occurrence water mask'
});
90% maschera acqua
Figura 5. Screenshot di una maschera dell'acqua al 90% per il delta del Paraná vicino a Buenos Aires.

Visitare luoghi interessanti del mondo

È divertente esplorare il mondo spostandosi e ingrandendo le mappe, ma il mondo è grande e a volte è utile passare direttamente a una posizione specifica. Ecco una serie di affermazioni che forniscono un piccolo campione di località interessanti, in termini di acque superficiali. Decommenta una sola istruzione alla volta e lo script andrà in quella posizione quando viene eseguito.

Editor di codice (JavaScript)

// Uncomment one of the following statements to center the map.
// Map.setCenter(-90.162, 29.8597, 10);   // New Orleans, USA
// Map.setCenter(-114.9774, 31.9254, 10); // Mouth of the Colorado River, Mexico
// Map.setCenter(-111.1871, 37.0963, 11); // Lake Powell, USA
// Map.setCenter(149.412, -35.0789, 11);  // Lake George, Australia
// Map.setCenter(105.26, 11.2134, 9);     // Mekong River Basin, SouthEast Asia
// Map.setCenter(90.6743, 22.7382, 10);   // Meghna River, Bangladesh
// Map.setCenter(81.2714, 16.5079, 11);   // Godavari River Basin Irrigation Project, India
// Map.setCenter(14.7035, 52.0985, 12);   // River Oder, Germany & Poland
// Map.setCenter(-59.1696, -33.8111, 9);  // Buenos Aires, Argentina
Map.setCenter(-74.4557, -8.4289, 11);  // Ucayali River, Peru

Questo è solo un piccolo campione di luoghi interessanti. Non esitare ad aggiungerne altri.

Refactoring, di nuovo…

Prima di passare al livello successivo del set di dati GSW, eseguiamo un'altra rifattorizzazione del codice. Nello specifico, raggrupperemo le istruzioni simili e aggiungeremo alcuni commenti che suddivideranno il codice in sezioni per asset, costanti, calcoli, centraggio della mappa e aggiunta di livelli della mappa.

Ecco lo script sottoposto a refactoring finale:

Editor di codice (JavaScript)

//////////////////////////////////////////////////////////////
// Asset List
//////////////////////////////////////////////////////////////

var gsw = ee.Image('JRC/GSW1_0/GlobalSurfaceWater');
var occurrence = gsw.select('occurrence');

//////////////////////////////////////////////////////////////
// Constants
//////////////////////////////////////////////////////////////

var VIS_OCCURRENCE = {
  min: 0,
  max: 100,
  palette: ['red', 'blue']
};
var VIS_WATER_MASK = {
  palette: ['white', 'black']
};

//////////////////////////////////////////////////////////////
// Calculations
//////////////////////////////////////////////////////////////

// Create a water mask layer, and set the image mask so that non-water areas
// are opaque.
var water_mask = occurrence.gt(90).unmask(0);

//////////////////////////////////////////////////////////////
// Initialize Map Location
//////////////////////////////////////////////////////////////

// Uncomment one of the following statements to center the map.
// Map.setCenter(-90.162, 29.8597, 10);   // New Orleans, USA
// Map.setCenter(-114.9774, 31.9254, 10); // Mouth of the Colorado River, Mexico
// Map.setCenter(-111.1871, 37.0963, 11); // Lake Powell, USA
// Map.setCenter(149.412, -35.0789, 11);  // Lake George, Australia
// Map.setCenter(105.26, 11.2134, 9);     // Mekong River Basin, SouthEast Asia
// Map.setCenter(90.6743, 22.7382, 10);   // Meghna River, Bangladesh
// Map.setCenter(81.2714, 16.5079, 11);   // Godavari River Basin Irrigation Project, India
// Map.setCenter(14.7035, 52.0985, 12);   // River Oder, Germany & Poland
// Map.setCenter(-59.1696, -33.8111, 9);  // Buenos Aires, Argentina
Map.setCenter(-74.4557, -8.4289, 11);  // Ucayali River, Peru

//////////////////////////////////////////////////////////////
// Map Layers
//////////////////////////////////////////////////////////////

Map.addLayer({
  eeObject: water_mask,
  visParams: VIS_WATER_MASK,
  name: '90% occurrence water mask',
  shown: false
});
Map.addLayer({
  eeObject: occurrence.updateMask(occurrence.divide(100)),
  name: 'Water Occurrence (1984-2015)',
  visParams: VIS_OCCURRENCE
});

Nella sezione successiva, esplorerai come è cambiata la presenza di acqua nel tempo.