Occurrence d'eau (1984-2015)

L'ensemble de données GSW contient de nombreuses couches de données qui présentent les données sur les eaux de surface de différentes manières. Nous allons commencer par visualiser la couche d'occurrence de l'eau, qui fournit un récapitulatif des lieux et de la fréquence d'apparition de l'eau de surface au cours de la période allant de mars 1984 à octobre 2015.

Cette section du tutoriel vous permettra de :

  1. ajouter un calque de carte pour visualiser la présence d'eaux de surface ;
  2. montrer comment interroger les valeurs du calque de carte ;
  3. ajouter un style personnalisé pour améliorer la visualisation ;
  4. créer un calque de masque d'eau binaire à l'aide d'une valeur seuil ;
  5. centrer la carte sur des régions intéressantes du monde ;
  6. montrer comment refactoriser le script pour le rendre plus lisible et plus facile à gérer.

Créer une visualisation de base

Commencez par copier les instructions suivantes dans l'éditeur de code :

Éditeur de code (JavaScript)

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

La première instruction fait référence à l'objet Image Earth Engine pour l'ensemble de données GSW et le stocke dans une variable nommée gsw. La deuxième instruction sélectionne une seule couche de l'ensemble de données GSW et la stocke dans une variable appelée occurrence. La troisième instruction ajoute l'image de l'occurrence à la carte interactive de l'éditeur de code.

Cliquez sur le bouton "Exécuter " de l'éditeur de code. Au bout de quelques secondes, vous devriez voir une carte avec des zones grises le long des côtes, comme sur la figure 1.

visualisation par défaut
Figure 1. Visualisation par défaut de la couche de données sur la présence d'eau de surface à l'échelle mondiale.

Dans la plupart des zones, l'ensemble de données GSW apparaît transparent, car les emplacements où des images Landsat n'ont pas été collectées (c'est-à-dire les zones océaniques) ou où de l'eau n'a été détectée par aucune observation au cours des 32 ans sont masqués.

Inspecter les valeurs

Pour explorer les valeurs du calque d'occurrence de l'eau, nous allons utiliser l'onglet "Inspecteur" de l'éditeur de code. Cliquez d'abord sur l'onglet "Inspecteur", puis sur la carte pour sélectionner un lieu. L'onglet "Inspecteur" affiche des informations sur chacune des couches présentes à l'endroit où vous avez cliqué.

onglet "Inspecteur"
Figure 2. Exemple de résultat de l'onglet "Inspector" (Inspecteur).

Dans l'exemple ci-dessus, la valeur du calque nommé value est 98. Les unités sont des points de pourcentage. Ainsi, environ 98 % du temps, l'emplacement a été classé comme recouvert d'eau. La valeur correspond à la moyenne de chacune des valeurs mensuelles d'occurrence de l'eau de surface, qui est normalisée par rapport à la variation saisonnière, comme décrit dans le Guide de l'utilisateur des données (v2) .

Refactoriser pour améliorer votre code

Notre script ne contient que deux instructions, mais nous avons déjà la possibilité de refactoriser le code afin que notre script final soit plus facile à lire et à gérer au fil du temps. Actuellement, l'instruction Map.addLayer() transmet un seul argument occurrence, qui est l'objet image Earth Engine que nous souhaitons afficher sur la carte. Toutefois, la méthode Map.addLayer() permet également de lui transmettre des arguments supplémentaires. Pour voir rapidement les arguments disponibles, placez votre curseur après la parenthèse ouvrante et appuyez sur le raccourci clavier "Afficher les suggestions de code" pour afficher le document d'aide de la méthode addLayer. (Pour afficher les raccourcis clavier, sélectionnez le menu Aide > Raccourcis.)

Arguments de Map.addLayer
Figure 3. Capture d'écran montrant les arguments de la méthode addLayer.

Les raccourcis clavier indiquent que cinq arguments peuvent être transmis à Map.addLayer : eeObject, visParams, name, shown et opacity. Dans notre script actuel, nous transmettons une seule variable occurrence qui est interprétée comme le premier argument, eeObject. Pour transmettre à la fois l'objet variable et un argument supplémentaire qui nomme le calque, nous pouvons refactoriser le code pour utiliser des "arguments nommés" (eeObject et name) qui sont transmis à la méthode à partir d'une structure de données JSON , comme indiqué ci-dessous :

Éditeur de code (JavaScript)

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

Exécutez à nouveau le code pour vous assurer qu'il fonctionne toujours après les modifications de refactoring. La carte obtenue ne doit pas changer.

Ajouter des paramètres de visualisation

Ensuite, nous allons améliorer les paramètres de visualisation par défaut, qui font apparaître l'eau en gris. Ajoutez une instruction qui crée une variable VIS_OCCURRENCE et transmettez-la en tant qu'argument supplémentaire à la méthode addLayer.

Éditeur de code (JavaScript)

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

Éditeur de code (JavaScript)

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

Les paramètres de visualisation stockés dans la structure JSON VIS_OCCURRENCE indiquent que le rouge doit être utilisé pour une valeur minimale de 0 % et le bleu pour une valeur maximale de 100 %. L'ajout de .updateMask(occurrence.divide(100)) permet de définir l'opacité/la transparence des pixels en fonction de la valeur d'occurrence.

Exécutez à nouveau le script et affichez les résultats modifiés suite à nos changements de style.

Présence d'eau en surface
Figure 4. Capture d'écran de l'occurrence de l'eau dans le delta du Paraná, près de Buenos Aires, avec une couleur rouge transparente pour le point de terminaison de la valeur minimale de 0 % et une couleur bleue unie pour le point de terminaison de la valeur maximale.

Les zones d'eau sont désormais bleues. Progression !

Créer une couche de seuil

L'image de présence d'eau contient des informations sur la fréquence à laquelle l'eau est attendue, à l'aide d'une plage de valeurs allant de 0 à 100 %. Toutefois, il est souvent utile de définir une couche d'eau binaire (c'est-à-dire "eau" ou "non-eau") en fonction d'un certain pourcentage d'occurrence (c'est-à-dire une valeur seuil). Nous utiliserons cette simple couche binaire comme couche d'arrière-plan propre sur laquelle d'autres couches GSW pourront être placées. Vous pouvez créer cette couche de seuil à l'aide des instructions suivantes, qui utilisent une valeur de seuil de 90 % pour séparer l'eau et les autres éléments.

Nous allons d'abord définir une nouvelle variable de visualisation VIS_WATER_MASK pour contenir les informations de style du masque d'eau :

Éditeur de code (JavaScript)

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

Nous calculons ensuite un calque de masque d'eau à l'aide de l'opérateur de comparaison "supérieur à" .gt(90), puis nous définissons les zones masquées précédemment sur zéro à l'aide de la méthode .unmask() :

Éditeur de code (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);

Enfin, ajoutez le calque à la carte. Pour que cette couche soit affichée sous toutes les autres, placez l'instruction suivante avant toute autre instruction Map.addLayer.

Éditeur de code (JavaScript)

Map.addLayer({
  eeObject: water_mask,
  visParams: VIS_WATER_MASK,
  name: '90% occurrence water mask'
});
Masque d'eau à 90 %
Figure 5. Capture d'écran d'un masque d'eau à 90 % pour le delta du Paraná, près de Buenos Aires.

Aller dans des endroits intéressants du monde

Il est amusant d'explorer le monde en effectuant des panoramiques et des zooms, mais le monde est vaste et il est parfois utile de passer directement à un lieu particulier. Voici une série d'énoncés qui fournissent un petit échantillon de lieux intéressants en termes d'eaux de surface. Il vous suffit de décommenter une instruction à la fois pour que votre script accède à cet emplacement lors de son exécution.

Éditeur de code (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

Il ne s'agit que d'un petit échantillon de lieux intéressants. N'hésitez pas à ajouter la vôtre !

Encore une refactorisation…

Avant de passer à la couche suivante de l'ensemble de données GSW, nous allons effectuer un peu plus de refactoring de code. Plus précisément, nous allons regrouper nos instructions similaires et ajouter des commentaires qui diviseront notre code en sections pour les éléments, les constantes, les calculs, le centrage de la carte et l'ajout de calques de carte.

Voici le script refactorisé final :

Éditeur de code (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
});

Dans la section suivante, vous allez découvrir comment l'occurrence de l'eau a évolué au fil du temps.