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ésumé de l'emplacement et de la fréquence d'apparition des eaux de surface sur l'ensemble de la période comprise entre mars 1984 et octobre 2015.

Dans cette section du tutoriel, vous allez :

  1. ajouter un calque de carte pour visualiser la présence d'eau de surface ;
  2. montrent comment interroger les valeurs du calque de carte,
  3. ajouter un style personnalisé pour améliorer la visualisation ;
  4. créer une couche de masque d'eau binaire à l'aide d'une valeur de seuil ;
  5. centrer la carte sur des parties intéressantes du monde, et
  6. et nous verrons 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 d'occurrence à la carte interactive de l'éditeur de code.

Cliquez sur le bouton "Run" (Exécuter) de l'éditeur de code. Après quelques secondes, une carte avec une coloration grise le long des côtes devrait s'afficher, comme dans la figure 1.

visualisation par défaut
Figure 1. Visualisation par défaut du calque 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ù les images Landsat n'ont pas été collectées (par exemple, les zones océaniques) ou où l'eau n'a pas été détectée par des observations au cours des 32 années sont masqués.

Inspecter les valeurs

Pour explorer les valeurs de la couche de présence d'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 emplacement. 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 "Inspecteur".

Dans l'exemple ci-dessus, la valeur de la couche nommée value est 98. Les unités sont des points de pourcentage. Ainsi, environ 98 % du temps, l'emplacement a été classé comme étant recouvert d'eau. La valeur est la moyenne de chacune des valeurs mensuelles d'occurrence des eaux de surface, qui se normalise par rapport aux variations saisonnières, 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 d'image Earth Engine que nous voulons afficher sur la carte. Toutefois, la méthode Map.addLayer() permet également de 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 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 de variable et un argument supplémentaire qui nomme la couche, 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 refactorisation. La carte obtenue doit rester inchangée.

Ajouter des paramètres de visualisation

Nous allons maintenant 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)) entraîne la définition de l'opacité/transparence des pixels en fonction de la valeur d'occurrence.

Exécutez à nouveau le script et examinez les résultats révisés de nos modifications de style.

Présence d'eau de surface
Figure 4. Capture d'écran de la présence d'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 de l'eau est attendue, à l'aide d'une plage de valeurs allant de 0 à 100 %. Cependant, 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 de seuil). Nous utiliserons cette couche binaire simple comme couche d'arrière-plan propre sur laquelle d'autres couches GSW pourront être placées. Pour créer cette couche de seuil, vous pouvez utiliser les instructions suivantes, qui utilisent une valeur de seuil de 90 % pour séparer l'eau de la terre.

Nous commençons par définir une nouvelle variable de visualisation VIS_WATER_MASK pour stocker les informations de style du masque d'eau :

Éditeur de code (JavaScript)

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

Nous calculons ensuite une couche de masque d'eau à l'aide de l'opérateur de comparaison "supérieur à" .gt(90), puis nous définissons les zones précédemment masquées 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 la couche à la carte. Pour que cette couche s'affiche sous toutes les autres couches, 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.

Se rendre 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 d'accéder directement à un lieu particulier. Voici une série d'instructions qui fournissent un petit échantillon d'emplacements intéressants en termes d'eau de surface. Il vous suffit d'annuler la mise en commentaire d'une seule instruction à la fois. Votre script se rendra à cet emplacement lorsqu'il sera exécuté.

É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 là que d'un petit échantillon de lieux intéressants. N'hésitez pas à ajouter les vôtres.

Refactorisation, encore…

Avant de passer à la couche suivante de l'ensemble de données GSW, nous allons refactoriser un peu plus le 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 final refactorisé :

É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 explorer l'évolution de la présence d'eau au fil du temps.