Il set di dati GSW contiene molti livelli di dati che presentano i dati sulle acque superficiali in modi diversi. Inizieremo visualizzando il livello di presenza dell'acqua, che fornisce un riepilogo di dove e con quale frequenza si sono verificate le acque superficiali nell'intero periodo di tempo compreso tra marzo 1984 e ottobre 2015.
In questa sezione del tutorial:
- aggiungere un livello della mappa per visualizzare la presenza di acque superficiali,
- mostrano come eseguire query sui valori del livello della mappa,
- aggiungere uno stile personalizzato per migliorare la visualizzazione,
- creare un livello di maschera d'acqua binaria utilizzando un valore di soglia,
- centrare la mappa su parti interessanti del mondo e
- mostra come rifattorizzare lo 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 Image di Earth Engine per il set di dati GSW e lo archivia in una variabile denominata gsw.
La seconda istruzione seleziona un singolo strato del set di dati GSW e lo archivia in una variabile denominata occurrence.
La terza istruzione aggiunge l'immagine delle occorrenze alla mappa interattiva dell'editor di codice.
Fai clic sul pulsante "Esegui " dell'editor di codice e, dopo alcuni secondi, dovresti visualizzare una mappa con una colorazione grigia lungo le coste, simile alla Figura 1.
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 non è stata rilevata acqua da alcuna osservazione nei 32 anni sono mascherate.
Ispezione dei valori
Per esplorare i valori del livello di presenza dell'acqua, utilizzeremo la scheda Inspector dell'editor di codice. Fai clic sulla scheda Inspector, quindi sulla mappa per selezionare una località. La scheda Inspector mostrerà le informazioni su ciascuno dei livelli presenti nel punto in cui hai fatto clic.
Nell'esempio precedente, il valore del livello denominato value è 98. Le unità sono
punti percentuali, quindi circa il 98% delle volte la località è stata classificata come coperta d'acqua.
Il valore è la media di ciascuno dei valori mensili di presenza di acque superficiali, che viene normalizzato rispetto 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 rifattorizzare il codice in modo che lo script finale sia più facile da leggere e gestire nel tempo.
Al momento, l'istruzione Map.addLayer() passa un singolo argomento occurrence, ovvero l'oggetto immagine di 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 per il codice" per visualizzare il documento di aiuto per il metodo addLayer. (Le scorciatoie da tastiera possono essere visualizzate selezionando il menu Guida -> Scorciatoie).
Le scorciatoie da tastiera mostrano che esistono cinque argomenti che possono essere passati a
Map.addLayer:
eeObject, visParams, name, shown e
opacity.
Nel nostro script attuale, passiamo una singola variabile occurrence che viene interpretata come il primo argomento, eeObject.
Per passare sia l'oggetto variabile sia un argomento aggiuntivo che assegna un nome al livello, possiamo rifattorizzare il codice in modo da utilizzare "argomenti denominati" (eeObject e name) che vengono passati al metodo dall'interno di 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 dovrebbe rimanere invariata.
Aggiunta di parametri di visualizzazione
Successivamente, lavoreremo per migliorare i parametri di visualizzazione predefiniti, che fanno apparire l'acqua grigia. 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 archiviati 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 in base alle modifiche allo stile.
Le aree d'acqua ora sono blu. Progressi
Creazione di un livello di soglia
L'immagine della presenza di acqua contiene informazioni sulla frequenza con cui è prevista l'acqua utilizzando un intervallo di valori compreso tra 0 e 100%. Tuttavia, spesso è utile definire uno strato d'acqua binario (ovvero, "acqua" o "non acqua") in base a una determinata percentuale di occorrenza (ovvero un valore di soglia). Utilizzeremo questo semplice livello binario come livello di sfondo pulito su cui posizionare 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 dalla non 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'] };
Poi calcoliamo un livello di maschera dell'acqua utilizzando l'operatore di confronto maggiore di .gt(90) e 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 eseguire il rendering di 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' });
Andare in luoghi interessanti del mondo
È divertente esplorare il mondo con la panoramica e lo zoom, ma il mondo è grande e a volte è utile passare direttamente a una determinata località. Ecco una serie di istruzioni che forniscono un piccolo esempio di località interessanti in termini di acque superficiali. Rimuovi il commento da 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 esempio di località interessanti. Tocca a te!
Rifattorizzazione, di nuovo…
Prima di passare al livello successivo del set di dati GSW, eseguiremo un'altra piccola rifattorizzazione del codice. Nello specifico, raggrupperemo le istruzioni simili e aggiungeremo alcuni commenti che suddivideranno il codice in sezioni per asset, costanti, calcoli, centratura della mappa e aggiunta di livelli della mappa.
Ecco lo script finale rifattorizzato:
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.