Commençons par le calcul nécessaire pour créer une bande qui affiche les pixels où les données de Hansen et al. indiquent à la fois une perte et un gain.
L'ensemble de données Hansen et al. comporte une bande dont les pixels sont définis sur 1 en cas de perte et sur 0 dans le cas contraire (loss
), ainsi qu'une bande dont les pixels sont définis sur 1 en cas de gain et sur 0 dans le cas contraire (gain
). Pour créer une bande dont les pixels sont définis sur 1 dans les bandes loss
et gain
, vous pouvez utiliser la méthode logique and()
sur les images. La méthode and()
est appelée comme image1.and(image2)
et renvoie une image dans laquelle les pixels sont définis sur 1 lorsque image1 et image2 sont définies sur 1, et sur 0 dans le cas contraire :
Éditeur de code (JavaScript)
// Load the data and select the bands of interest. var gfc2014 = ee.Image('UMD/hansen/global_forest_change_2015'); var lossImage = gfc2014.select(['loss']); var gainImage = gfc2014.select(['gain']); // Use the and() method to create the lossAndGain image. var gainAndLoss = gainImage.and(lossImage); // Show the loss and gain image. Map.addLayer(gainAndLoss.updateMask(gainAndLoss), {palette: 'FF00FF'}, 'Gain and Loss');
Le résultat, avec un zoom sur l'Arkansas en vue satellite, devrait ressembler à la figure 1.

En combinant cet exemple avec le résultat de la section précédente, il est désormais possible de recréer la figure du début du tutoriel :
Éditeur de code (JavaScript)
// Displaying forest, loss, gain, and pixels where both loss and gain occur. var gfc2014 = ee.Image('UMD/hansen/global_forest_change_2015'); var lossImage = gfc2014.select(['loss']); var gainImage = gfc2014.select(['gain']); var treeCover = gfc2014.select(['treecover2000']); // Use the and() method to create the lossAndGain image. var gainAndLoss = gainImage.and(lossImage); // Add the tree cover layer in green. Map.addLayer(treeCover.updateMask(treeCover), {palette: ['000000', '00FF00'], max: 100}, 'Forest Cover'); // Add the loss layer in red. Map.addLayer(lossImage.updateMask(lossImage), {palette: ['FF0000']}, 'Loss'); // Add the gain layer in blue. Map.addLayer(gainImage.updateMask(gainImage), {palette: ['0000FF']}, 'Gain'); // Show the loss and gain image. Map.addLayer(gainAndLoss.updateMask(gainAndLoss), {palette: 'FF00FF'}, 'Gain and Loss');
Quantifier les changements forestiers dans une région d'intérêt
Maintenant que vous connaissez mieux les bandes de l'ensemble de données Hansen et al., nous pouvons utiliser les concepts appris jusqu'à présent pour calculer des statistiques sur le gain et la perte de forêt dans une région d'intérêt. Pour cela, nous devrons utiliser des données vectorielles (points, lignes et polygones). Un ensemble de données vectorielles est représenté par un FeatureCollection
dans Earth Engine.
(En savoir plus sur les collections d'entités et sur l'importation de données vectorielles)
Dans cette section, nous allons comparer la quantité totale de perte de forêt survenue en République du Congo en 2012 à la quantité de perte de forêt survenue dans les zones protégées du pays au cours de la même période.
Comme vous l'avez appris dans le tutoriel sur l'API Earth Engine, la méthode clé pour calculer des statistiques dans une région d'image est reduceRegion()
. (En savoir plus sur la réduction des régions d'image) Par exemple, supposons que nous voulions calculer le nombre de pixels estimés
pour représenter la perte de forêt au cours de la période d'étude. Pour ce faire, considérez le code suivant :
Éditeur de code (JavaScript)
// Load country features from Large Scale International Boundary (LSIB) dataset. var countries = ee.FeatureCollection('USDOS/LSIB_SIMPLE/2017'); // Subset the Congo Republic feature from countries. var congo = countries.filter(ee.Filter.eq('country_na', 'Rep of the Congo')); // Get the forest loss image. var gfc2014 = ee.Image('UMD/hansen/global_forest_change_2015'); var lossImage = gfc2014.select(['loss']); // Sum the values of forest loss pixels in the Congo Republic. var stats = lossImage.reduceRegion({ reducer: ee.Reducer.sum(), geometry: congo, scale: 30 }); print(stats);
Cet exemple utilise le réducteur ee.Reducer.sum()
pour additionner les valeurs des pixels dans lossImage
au sein de la fonctionnalité congo
. Étant donné que lossImage
se compose de pixels dont la valeur est 1 ou 0 (pour la perte ou l'absence de perte, respectivement), la somme de ces valeurs équivaut au nombre de pixels de perte dans la région.
Malheureusement, l'exécution du script tel quel entraîne une erreur du type suivant :
Le nombre maximal de pixels par défaut dans reduceRegion()
est de 10 millions. Ce message d'erreur indique que la République du Congo couvre environ 383 millions de pixels Landsat. Heureusement, reduceRegion()
accepte de nombreux paramètres, dont l'un (maxPixels
) vous permet de contrôler le nombre de pixels utilisés dans le calcul. Spécifier ce paramètre permet au calcul de réussir :
Éditeur de code (JavaScript)
// Load country features from Large Scale International Boundary (LSIB) dataset. var countries = ee.FeatureCollection('USDOS/LSIB_SIMPLE/2017'); // Subset the Congo Republic feature from countries. var congo = countries.filter(ee.Filter.eq('country_na', 'Rep of the Congo')); // Get the forest loss image. var gfc2014 = ee.Image('UMD/hansen/global_forest_change_2015'); var lossImage = gfc2014.select(['loss']); // Sum the values of forest loss pixels in the Congo Republic. var stats = lossImage.reduceRegion({ reducer: ee.Reducer.sum(), geometry: congo, scale: 30, maxPixels: 1e9 }); print(stats);
En développant l'objet imprimé dans la console, vous verrez que le résultat est de 4 897 933 pixels de forêt perdus. Vous pouvez nettoyer un peu l'impression dans la console en étiquetant la sortie et en obtenant le résultat qui vous intéresse à partir du dictionnaire renvoyé par reduceRegion()
:
Éditeur de code (JavaScript)
print('pixels representing loss: ', stats.get('loss'));
Calculer les zones de pixels
Vous êtes presque prêt à répondre à la question de savoir quelle superficie a été perdue en République du Congo et quelle part de cette superficie se trouvait dans des zones protégées. Il ne reste plus qu'à convertir les pixels en surface réelle. Cette conversion est importante, car nous ne connaissons pas nécessairement la taille des pixels saisis dans reduceRegion()
. Pour calculer les zones, Earth Engine dispose de la méthode ee.Image.pixelArea()
qui génère une image dans laquelle la valeur de chaque pixel correspond à sa superficie en mètres carrés. En multipliant l'image de perte par cette image de zone, puis en additionnant le résultat, nous obtenons une mesure de la zone :
Éditeur de code (JavaScript)
// Load country features from Large Scale International Boundary (LSIB) dataset. var countries = ee.FeatureCollection('USDOS/LSIB_SIMPLE/2017'); // Subset the Congo Republic feature from countries. var congo = countries.filter(ee.Filter.eq('country_na', 'Rep of the Congo')); // Get the forest loss image. var gfc2014 = ee.Image('UMD/hansen/global_forest_change_2015'); var lossImage = gfc2014.select(['loss']); var areaImage = lossImage.multiply(ee.Image.pixelArea()); // Sum the values of forest loss pixels in the Congo Republic. var stats = areaImage.reduceRegion({ reducer: ee.Reducer.sum(), geometry: congo, scale: 30, maxPixels: 1e9 }); print('pixels representing loss: ', stats.get('loss'), 'square meters');
Le résultat est désormais de 4 372 575 052 mètres carrés perdus au cours de la période étudiée.
Vous êtes maintenant prêt à répondre à la question posée au début de cette section : quelle superficie forestière a été perdue en République du Congo en 2012, et quelle part de cette perte se trouvait dans des zones protégées ?
Éditeur de code (JavaScript)
// Load country features from Large Scale International Boundary (LSIB) dataset. var countries = ee.FeatureCollection('USDOS/LSIB_SIMPLE/2017'); // Subset the Congo Republic feature from countries. var congo = ee.Feature( countries .filter(ee.Filter.eq('country_na', 'Rep of the Congo')) .first() ); // Subset protected areas to the bounds of the congo feature // and other criteria. Clip to the intersection with congo. var protectedAreas = ee.FeatureCollection('WCMC/WDPA/current/polygons') .filter(ee.Filter.and( ee.Filter.bounds(congo.geometry()), ee.Filter.neq('IUCN_CAT', 'VI'), ee.Filter.neq('STATUS', 'proposed'), ee.Filter.lt('STATUS_YR', 2010) )) .map(function(feat){ return congo.intersection(feat); }); // Get the loss image. var gfc2014 = ee.Image('UMD/hansen/global_forest_change_2015'); var lossIn2012 = gfc2014.select(['lossyear']).eq(12); var areaImage = lossIn2012.multiply(ee.Image.pixelArea()); // Calculate the area of loss pixels in the Congo Republic. var stats = areaImage.reduceRegion({ reducer: ee.Reducer.sum(), geometry: congo.geometry(), scale: 30, maxPixels: 1e9 }); print( 'Area lost in the Congo Republic:', stats.get('lossyear'), 'square meters' ); // Calculate the area of loss pixels in the protected areas. var stats = areaImage.reduceRegion({ reducer: ee.Reducer.sum(), geometry: protectedAreas.geometry(), scale: 30, maxPixels: 1e9 }); print( 'Area lost in protected areas:', stats.get('lossyear'), 'square meters' );
Le résultat indique que sur les 348 036 295 mètres carrés de forêt perdus en République du Congo en 2012, 11 880 976 se trouvaient dans des zones protégées, comme indiqué dans le tableau de la base de données mondiale sur les zones protégées.
Les seules différences entre ce script et le précédent sont l'ajout d'informations sur les zones protégées et le fait que le script ne s'intéresse plus à la perte globale, mais à la perte en 2012. Deux modifications ont été nécessaires. Tout d'abord, il existe une nouvelle image lossIn2012
qui contient la valeur 1 lorsque des pertes ont été enregistrées en 2012, et 0 dans le cas contraire. Deuxièmement, comme le nom du groupe est différent (lossyear
au lieu de loss
), le nom de la propriété a dû être modifié dans l'instruction print.
Dans la section suivante, nous allons explorer des méthodes avancées pour calculer et représenter graphiquement la perte de forêt pour chaque année, au lieu d'une seule année comme nous l'avons fait dans cette section.