La couche de transition de l'eau capture les changements entre trois classes d'occurrence de l'eau (pas d'eau, eau saisonnière et eau permanente), ainsi que deux classes supplémentaires pour l'eau éphémère (éphémère permanent et éphémère saisonnier).
Cette section du tutoriel vous permettra de :
- ajouter un calque de carte pour visualiser la transition de l'eau ;
- créer un réducteur groupé pour additionner la superficie de chaque classe de transition dans une région d'intérêt spécifiée ;
- créer un graphique qui récapitule la superficie par classe de transition.
Visualisation de base
Dans la section "Liste des éléments" du script, ajoutez l'instruction suivante qui crée un objet image à bande unique appelé transition
:
Éditeur de code (JavaScript)
var transition = gsw.select('transition');
Les images GSW contiennent des métadonnées sur les numéros et les noms des classes de transition, ainsi qu'une palette par défaut pour styliser les classes de transition. Lorsque le calque de transition est ajouté à la carte, ces paramètres de visualisation sont utilisés automatiquement.
En bas de la section "Calques de carte" de votre script, ajoutez l'instruction suivante, qui ajoute un calque de carte affichant les classes de transition :
Éditeur de code (JavaScript)
Map.setCenter(105.26, 11.2134, 9); // Mekong River Basin, SouthEast Asia Map.addLayer({ eeObject: transition, name: 'Transition classes (1984-2015)', });
Lorsque vous exécutez le script, la couche de transition s'affiche.

La clé de mappage pour les classes de transition est la suivante :
Valeur | Symbole | Libellé |
---|---|---|
0 | Pas de l'eau | |
1 | Permanente | |
2 | Nouveau permanent | |
3 | Perte définitive | |
4 | Saisonnier | |
5 | Nouveaux contenus saisonniers | |
6 | Saisonnalité perdue | |
7 | Passer d'un contenu saisonnier à un contenu permanent | |
8 | Passer d'un forfait permanent à un forfait saisonnier | |
9 | Éphémère permanent | |
10 | Éphémère saisonnier |
Résumer la zone par classe de transition
Dans cette section, nous allons à nouveau utiliser l'outil de polygone géométrique pour définir une région d'intérêt. Si vous souhaitez analyser un nouvel emplacement, vous devez d'abord sélectionner et supprimer le polygone d'origine que vous avez dessiné afin de ne pas obtenir de résultats provenant des zones combinées. Pour savoir comment modifier les géométries, consultez la section Outils de géométrie de la documentation de l'éditeur de code.
Pour cet exemple, nous allons dessiner un polygone dans le delta du Mékong.

Pour calculer la superficie couverte par les parties d'une image, nous allons ajouter une bande supplémentaire à l'objet d'image de transition qui identifie la taille de chaque pixel en mètres carrés à l'aide de la méthode ee.Image.pixelArea.
Éditeur de code (JavaScript)
var area_image_with_transition_class = ee.Image.pixelArea().addBands(transition);
L'objet image résultant (area_image_with_transition_class
) est une image à deux bandes dont la première contient les informations sur la zone en mètres carrés (produites par la méthode
ee.Image.pixelArea
code>
) et la seconde contient les informations sur la classe de transition.
Nous résumons ensuite les transitions de classe dans une région d'intérêt (roi
) à l'aide de la méthode
ee.Image.reduceRegion
et d'un
réducteur groupé
qui sert à additionner la superficie de chaque classe de transition :
Éditeur de code (JavaScript)
var reduction_results = area_image_with_transition_class.reduceRegion({ reducer: ee.Reducer.sum().group({ groupField: 1, groupName: 'transition_class_value', }), geometry: roi, scale: 30, bestEffort: true, }); print('reduction_results', reduction_results);
Le résultat de l'onglet "Console" affiche désormais reduction_results
. Notez que vous devrez développer l'arborescence sur plusieurs niveaux pour afficher les données récapitulatives sur les zones.

Bien que l'objet reduction_results
contienne des informations sur la zone couverte par chaque classe de transition, il n'est pas particulièrement facile à lire. Dans la section suivante, nous allons faciliter l'affichage des résultats.
Créer un graphique récapitulatif
Dans cette section, nous allons créer un graphique pour mieux résumer les résultats. Pour commencer, nous allons extraire la liste des classes de transition avec les zones comme suit :
Éditeur de code (JavaScript)
var roi_stats = ee.List(reduction_results.get('groups'));
Le résultat du réducteur groupé (reduction_results
) est un dictionnaire contenant une liste de dictionnaires.
La liste contient un dictionnaire pour chaque classe de transition.
Ces instructions utilisent la méthode
ee.Dictionary.get
pour extraire les résultats du réducteur groupé de ce dictionnaire et les convertir en type de données ee.List, afin que nous puissions accéder aux dictionnaires individuels.
Pour utiliser les fonctions de création de graphiques de l'éditeur de code, nous allons créer une FeatureCollection contenant les informations nécessaires. Pour ce faire, nous allons d'abord créer deux dictionnaires de recherche et deux fonctions d'assistance. Le code qui crée les dictionnaires de recherche peut être placé en haut de la section "Calculs", comme suit :
Éditeur de code (JavaScript)
////////////////////////////////////////////////////////////// // Calculations ////////////////////////////////////////////////////////////// // Create a dictionary for looking up names of transition classes. var lookup_names = ee.Dictionary.fromLists( ee.List(gsw.get('transition_class_values')).map(numToString), gsw.get('transition_class_names') ); // Create a dictionary for looking up colors of transition classes. var lookup_palette = ee.Dictionary.fromLists( ee.List(gsw.get('transition_class_values')).map(numToString), gsw.get('transition_class_palette') );
Le dictionnaire lookup_names
associe les valeurs de classe de transition à leurs noms, tandis que le dictionnaire lookup_palette
associe les valeurs de classe de transition à des définitions de couleur.
Les deux fonctions d'assistance peuvent être placées dans une nouvelle section de code appelée "Fonctions d'assistance".
Éditeur de code (JavaScript)
////////////////////////////////////////////////////////////// // Helper functions ////////////////////////////////////////////////////////////// // Create a feature for a transition class that includes the area covered. function createFeature(transition_class_stats) { transition_class_stats = ee.Dictionary(transition_class_stats); var class_number = transition_class_stats.get('transition_class_value'); var result = { transition_class_number: class_number, transition_class_name: lookup_names.get(class_number), transition_class_palette: lookup_palette.get(class_number), area_m2: transition_class_stats.get('sum') }; return ee.Feature(null, result); // Creates a feature without a geometry. } // Create a JSON dictionary that defines piechart colors based on the // transition class palette. // https://developers.google.com/chart/interactive/docs/gallery/piechart function createPieChartSliceDictionary(fc) { return ee.List(fc.aggregate_array("transition_class_palette")) .map(function(p) { return {'color': p}; }).getInfo(); } // Convert a number to a string. Used for constructing dictionary key lists // from computed number objects. function numToString(num) { return ee.Number(num).format(); }
La fonction createFeature
prend un dictionnaire (contenant la zone et la classe de transition de l'eau) et renvoie une caractéristique adaptée à la création de graphiques.
La fonction createPieChartSliceDictionary
crée une liste de couleurs qui correspondent aux classes de transition, en utilisant le format attendu par le graphique à secteurs.
Ensuite, nous appliquerons la fonction createFeature
à chaque dictionnaire de la liste (roi_stats
), en utilisant ee.List.map pour appliquer la fonction d'assistance à chaque élément de la liste.
Éditeur de code (JavaScript)
var transition_fc = ee.FeatureCollection(roi_stats.map(createFeature)); print('transition_fc', transition_fc);
Maintenant que nous disposons d'une FeatureCollection contenant les attributs que nous souhaitons afficher dans le graphique, nous pouvons créer un objet graphique et l'imprimer dans la console.
Éditeur de code (JavaScript)
// Add a summary chart. var transition_summary_chart = ui.Chart.feature.byFeature({ features: transition_fc, xProperty: 'transition_class_name', yProperties: ['area_m2', 'transition_class_number'] }) .setChartType('PieChart') .setOptions({ title: 'Summary of transition class areas', slices: createPieChartSliceDictionary(transition_fc), sliceVisibilityThreshold: 0 // Don't group small slices. }); print(transition_summary_chart);
L'option slices
colore les secteurs du graphique en camembert de sorte qu'ils utilisent la palette par défaut définie pour les classes de transition (indiquée précédemment dans le tableau de la légende de la carte).
L'option sliceVisibilityThreshold
empêche le regroupement des petits secteurs dans une catégorie "Autres".
Le graphique obtenu doit être semblable à celui illustré dans la figure 13.

Script final
Le script complet de cette section est le suivant :
Éditeur de code (JavaScript)
////////////////////////////////////////////////////////////// // Asset List ////////////////////////////////////////////////////////////// var gsw = ee.Image('JRC/GSW1_0/GlobalSurfaceWater'); var occurrence = gsw.select('occurrence'); var change = gsw.select("change_abs"); var transition = gsw.select('transition'); var roi = ee.Geometry.Polygon( [[[105.531921, 10.412183], [105.652770, 10.285193], [105.949401, 10.520218], [105.809326, 10.666006]]]); ////////////////////////////////////////////////////////////// // Constants ////////////////////////////////////////////////////////////// var VIS_OCCURRENCE = { min: 0, max: 100, palette: ['red', 'blue'] }; var VIS_CHANGE = { min: -50, max: 50, palette: ['red', 'black', 'limegreen'] }; var VIS_WATER_MASK = { palette: ['white', 'black'] }; ////////////////////////////////////////////////////////////// // Helper functions ////////////////////////////////////////////////////////////// // Create a feature for a transition class that includes the area covered. function createFeature(transition_class_stats) { transition_class_stats = ee.Dictionary(transition_class_stats); var class_number = transition_class_stats.get('transition_class_value'); var result = { transition_class_number: class_number, transition_class_name: lookup_names.get(class_number), transition_class_palette: lookup_palette.get(class_number), area_m2: transition_class_stats.get('sum') }; return ee.Feature(null, result); // Creates a feature without a geometry. } // Create a JSON dictionary that defines piechart colors based on the // transition class palette. // https://developers.google.com/chart/interactive/docs/gallery/piechart function createPieChartSliceDictionary(fc) { return ee.List(fc.aggregate_array("transition_class_palette")) .map(function(p) { return {'color': p}; }).getInfo(); } // Convert a number to a string. Used for constructing dictionary key lists // from computed number objects. function numToString(num) { return ee.Number(num).format(); } ////////////////////////////////////////////////////////////// // Calculations ////////////////////////////////////////////////////////////// // Create a dictionary for looking up names of transition classes. var lookup_names = ee.Dictionary.fromLists( ee.List(gsw.get('transition_class_values')).map(numToString), gsw.get('transition_class_names') ); // Create a dictionary for looking up colors of transition classes. var lookup_palette = ee.Dictionary.fromLists( ee.List(gsw.get('transition_class_values')).map(numToString), gsw.get('transition_class_palette') ); // Create a water mask layer, and set the image mask so that non-water areas // are transparent. var water_mask = occurrence.gt(90).mask(1); // Generate a histogram object and print it to the console tab. var histogram = ui.Chart.image.histogram({ image: change, region: roi, scale: 30, minBucketWidth: 10 }); histogram.setOptions({ title: 'Histogram of surface water change intensity.' }); print(histogram); // Summarize transition classes in a region of interest. var area_image_with_transition_class = ee.Image.pixelArea().addBands(transition); var reduction_results = area_image_with_transition_class.reduceRegion({ reducer: ee.Reducer.sum().group({ groupField: 1, groupName: 'transition_class_value', }), geometry: roi, scale: 30, bestEffort: true, }); print('reduction_results', reduction_results); var roi_stats = ee.List(reduction_results.get('groups')); var transition_fc = ee.FeatureCollection(roi_stats.map(createFeature)); print('transition_fc', transition_fc); // Add a summary chart. var transition_summary_chart = ui.Chart.feature.byFeature({ features: transition_fc, xProperty: 'transition_class_name', yProperties: ['area_m2', 'transition_class_number'] }) .setChartType('PieChart') .setOptions({ title: 'Summary of transition class areas', slices: createPieChartSliceDictionary(transition_fc), sliceVisibilityThreshold: 0 // Don't group small slices. }); print(transition_summary_chart); ////////////////////////////////////////////////////////////// // Initialize Map Location ////////////////////////////////////////////////////////////// // Uncomment one of the following statements to center the map on // a particular location. // 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, shown: false }); Map.addLayer({ eeObject: change, visParams: VIS_CHANGE, name: 'occurrence change intensity', shown: false }); Map.addLayer({ eeObject: transition, name: 'Transition classes (1984-2015)', });
Ce tutoriel sur l'ensemble de données Global Surface Water est terminé. Notez que ce tutoriel vous a montré comment utiliser seulement trois des couches de données (occurrence, intensité du changement et transition) disponibles dans l'ensemble de données Global Surface Water. Pour en savoir plus sur les autres couches de données disponibles, consultez le Guide de l'utilisateur des données (v2).
Bonne analyse !