لنبدأ بالعملية الحسابية اللازمة لإنشاء نطاق يعرض وحدات البكسل التي تُظهر فيها بيانات 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.

من خلال الجمع بين هذا المثال والنتيجة من القسم السابق، أصبح من الممكن الآن إعادة إنشاء الشكل من بداية البرنامج التعليمي:
محرّر الرموز البرمجية (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.، يمكننا استخدام المفاهيم التي تعلّمناها حتى الآن لاحتساب إحصاءات حول زيادة المساحات الحرجية ونقصها في منطقة محدّدة. لإجراء ذلك، سنحتاج إلى استخدام بيانات متجهة (نقاط وخطوط ومضلّعات). يتم تمثيل مجموعة بيانات متجهة كـ FeatureCollection
في Earth Engine.
(مزيد من المعلومات عن مجموعات الميزات وكيفية
استيراد بيانات متجهة)
في هذا القسم، سنقارن بين إجمالي مساحة الغابات التي تم فقدانها في جمهورية الكونغو في عام 2012 ومساحة الغابات التي تم فقدانها في المناطق المحمية في البلد في الوقت نفسه.
كما تعلّمت في البرنامج التعليمي حول
Earth Engine API، فإنّ الطريقة الأساسية لاحتساب الإحصاءات في منطقة صورة هي
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()
لجمع قيم وحدات البكسل في 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);
من خلال توسيع العنصر الذي تمّت طباعته في وحدة التحكّم، نلاحظ أنّ النتيجة هي 4897933 بكسل من الغابات التي تمّت إزالتها. يمكنك تنظيم المخرجات في وحدة التحكّم قليلاً من خلال
تصنيف المخرجات والحصول على النتيجة المطلوبة من القاموس الذي تعرضه الدالة
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
)، كان يجب تغيير اسم السمة في عبارة الطباعة.
في القسم التالي، سنتعرّف على بعض الطرق المتقدّمة لاحتساب خسارة الغابات ورسمها بيانيًا لكل عام، بدلاً من عام واحد كما فعلنا في هذا القسم.