כימות השינוי ביער

נתחיל עם החישוב שנדרש ליצירת פס שמציג פיקסלים שבהם הנתונים של Hansen et al. מראים גם אובדן וגם עלייה.

למערך הנתונים של Hansen et al. יש פס שבו הפיקסלים הם 1 במקומות שבהם התרחש אובדן ו-0 במקומות אחרים (loss), ופס שבו הפיקסלים הם 1 במקומות שבהם התרחש רווח ו-0 במקומות אחרים (gain). כדי ליצור פס שבו הפיקסלים גם בפס loss וגם בפס gain הם 1, אפשר להשתמש בשיטה הלוגית and() בתמונות. השיטה and() נקראת כמו image1.and(image2) ומחזירה תמונה שבה הפיקסלים הם 1 אם הערך של image1 ו-image2 הוא 1, ואחרת הם 0:

עורך הקוד (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');

התוצאה, אחרי הגדלה של ארקנסו עם תצוגת לוויין, אמורה להיראות כמו באיור 1.

Loss Arkansas
איור 1. תמונות Pixel שמציגות את אובדן היערות בארקנסו.

אם משלבים את הדוגמה הזו עם התוצאה מהקטע הקודם, אפשר ליצור מחדש את הנתון מתחילת המדריך:

עורך הקוד (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');

כימות השינוי ביער באזור שמעניין אתכם

עכשיו, אחרי שאתם מכירים טוב יותר את הפסים במערך הנתונים של Hansen et al., אנחנו יכולים להשתמש במושגים שלמדנו עד עכשיו כדי לחשב נתונים סטטיסטיים על התרחבות והצטמצמות של יערות באזור מסוים. לשם כך נצטרך להשתמש בנתוני וקטורים (נקודות, קווים ומצולעים). ‫Earth Engine מייצג מערך נתונים וקטורי כ-FeatureCollection. (מידע נוסף על אוספי תכונות ועל ייבוא נתוני וקטור)

בקטע הזה נשווה בין הכמות הכוללת של יערות שאבדו ברפובליקת קונגו בשנת 2012 לבין הכמות של יערות שאבדו באזורים המוגנים של המדינה באותו הזמן.

כמו שלמדתם במדריך בנושא Earth Engine API, ה-method העיקרי לחישוב נתונים סטטיסטיים באזור של תמונה הוא reduceRegion(). (מידע נוסף על צמצום אזורי תמונה) לדוגמה, נניח שאנחנו רוצים לחשב את מספר הפיקסלים שמוערך כמייצג אובדן של יערות במהלך תקופת המחקר. לשם כך, אפשר להשתמש בקוד הבא:

עורך הקוד (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);

בדוגמה הזו נעשה שימוש בפונקציה ee.Reducer.sum() reducer כדי לסכם את הערכים של הפיקסלים ב-lossImage בתכונה congo. מכיוון ש-lossImage מורכב מפיקסלים עם ערך של 1 או 0 (לגבי אובדן או אי-אובדן, בהתאמה), סכום הערכים האלה שווה למספר הפיקסלים של אובדן באזור.

לצערנו, הפעלת הסקריפט כמו שהוא גורמת לשגיאה כמו:

מספר הפיקסלים המקסימלי שמוגדר כברירת מחדל ב-reduceRegion() הוא 10 מיליון. הודעת השגיאה הזו מציינת שהרפובליקה של קונגו מכסה כ-383 מיליון פיקסלים של Landsat. למזלנו, הפונקציה reduceRegion() מקבלת הרבה פרמטרים, ואחד מהם (maxPixels) מאפשר לקבוע כמה פיקסלים ישמשו לחישוב. הגדרת הפרמטר הזה מאפשרת לבצע את החישוב:

עורך הקוד (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);

אם מרחיבים את האובייקט שמודפס במסוף, אפשר לראות שהתוצאה היא 4,897,933 פיקסלים של יער שאבדו. אפשר לנקות קצת את הפלט בהדפסה במסוף על ידי תיוג הפלט וקבלת התוצאה הרצויה מהמילון שמוחזר על ידי reduceRegion():

עורך הקוד (JavaScript)

print('pixels representing loss: ', stats.get('loss'));

חישוב שטחי פיקסלים

כמעט סיימתם לענות על השאלה כמה שטח אבד ברפובליקת קונגו, וכמה מהשטח הזה היה באזורים מוגנים. החלק שנותר הוא להמיר את הפיקסלים לאזור בפועל. ההמרה הזו חשובה כי אנחנו לא יודעים בהכרח את הגודל של הפיקסלים שמוזנים ל-reduceRegion(). כדי לחשב שטחים, ב-Earth Engine יש את השיטה ee.Image.pixelArea() שיוצרת תמונה שבה הערך של כל פיקסל הוא השטח של הפיקסל במטרים רבועים. מכפילים את תמונת ההפסד בתמונת האזור הזו, ואז מסכמים את התוצאה כדי לקבל מדד של האזור:

עורך הקוד (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');

עכשיו התוצאה היא 4,372,575,052 מטרים רבועים שאבדו במהלך תקופת המחקר.

עכשיו אתם מוכנים לענות על השאלה שבתחילת הקטע הזה – כמה שטחי יערות אבדו ברפובליקה של קונגו בשנת 2012, וכמה מהם היו באזורים מוגנים?

עורך הקוד (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'
);

הפלט מציין שמתוך 348,036,295 מטרים רבועים של יערות שאבדו ברפובליקת קונגו בשנת 2012, ‏ 11,880,976 מטרים רבועים היו באזורים מוגנים, כפי שמוצג בטבלה של מסד הנתונים העולמי בנושא אזורים מוגנים.

השינויים היחידים בין הסקריפט הזה לבין הסקריפט הקודם הם הוספת המידע על האזור המוגן ושינוי הסקריפט כך שיבדוק את ההפסד בשנת 2012 במקום את ההפסד הכולל. היה צורך לבצע שני שינויים. קודם כל, יש תמונה חדשה lossIn2012 שבה הערך 1 מציין מקום שבו תועד אובדן ב-2012, והערך 0 מציין מקום שבו לא תועד אובדן. בנוסף, מכיוון שהשם של הלהקה שונה (lossyear במקום loss), היה צריך לשנות את שם המאפיין בהצהרת ההדפסה.

בקטע הבא נסביר על כמה שיטות מתקדמות לחישוב ולשרטוט של אובדן היערות בכל שנה, במקום רק בשנה אחת כמו שעשינו בקטע הזה.