انتقال فئة المياه

ترصد طبقة انتقال المياه التغيّرات بين ثلاث فئات من حالات توفّر المياه (لا تتوفّر مياه، تتوفّر مياه موسمية، تتوفّر مياه دائمة)، بالإضافة إلى فئتين إضافيتين للمياه المؤقتة (مياه دائمة مؤقتة ومياه موسمية مؤقتة).

سيتضمّن هذا القسم من الدليل التوجيهي ما يلي:

  1. إضافة طبقة خريطة لعرض عملية انتقال المياه
  2. أنشئ أداة تقليل مجمّعة لجمع مساحة كل فئة انتقال ضمن منطقة محدّدة من مناطق الاهتمام.
  3. أنشئ رسمًا بيانيًا يلخّص المنطقة حسب فئة الانتقال.

التمثيل البصري الأساسي

في قسم "قائمة مواد العرض" من نص الفيديو، أضِف العبارة التالية التي تنشئ عنصر صورة بنطاق واحد باسم transition:

محرّر الرموز البرمجية (JavaScript)

var transition = gsw.select('transition');

تحتوي صور GSW على بيانات وصفية حول أرقام أسماء فئات الانتقال، ولوحة ألوان تلقائية لتصميم فئات الانتقال. عند إضافة طبقة الانتقال إلى الخريطة، سيتم استخدام مَعلمات العرض المرئي هذه تلقائيًا.

في أسفل قسم "طبقات الخريطة" (Map Layers) في النص البرمجي، أضِف العبارة التالية التي تضيف طبقة خريطة جديدة تعرض فئات الانتقال:

محرّر الرموز البرمجية (JavaScript)

Map.setCenter(105.26, 11.2134, 9);     // Mekong River Basin, SouthEast Asia
Map.addLayer({
  eeObject: transition,
  name: 'Transition classes (1984-2015)',
});

عند تشغيل النص البرمجي، سيتم عرض طبقة الانتقال.

فئات الانتقال للمياه السطحية
الشكل 10. لقطة شاشة لدلتا نهر ميكونغ تعرض تباينًا كبيرًا في عمليات الانتقال بين فئات المياه السطحية

مفتاح الخريطة لفئات الانتقال هو:

القيمة الرمز التصنيف
0 ليس ماء
1 نهائية
2 جديد دائم
3 فقدان دائم
4 موسمي
5 موسم جديد
6 محتوى موسمي غير متوفّر
7 من موسمية إلى دائمة
8 من دائم إلى موسمي
9 دائم مؤقت
10 موسم مؤقت

تلخيص المنطقة حسب فئة الانتقال

في هذا القسم، سنستخدم مرة أخرى أداة مضلّع الشكل الهندسي لتحديد منطقة الاهتمام. إذا أردت تحليل موقع جغرافي جديد، عليك أولاً اختيار المضلّع الأصلي الذي رسمته وحذفه حتى لا تحصل على نتائج من المناطق المدمجة. راجِع قسم أدوات الأشكال الهندسية في مستندات "محرّر الرموز" للحصول على معلومات حول كيفية تعديل الأشكال الهندسية.

في هذا المثال، سنرسم مضلّعًا جديدًا داخل دلتا نهر ميكونغ.

فئات النقل التي تتضمّن عائد استثمار
الشكل 11. دلتا نهر ميكونغ في فيتنام، مع منطقة اهتمام تم إنشاؤها باستخدام أداة رسم المضلّعات في "محرّر الأكواد"

من أجل حساب المساحة التي تغطيها أجزاء من صورة، سنضيف نطاقًا إضافيًا إلى عنصر صورة الانتقال يحدّد حجم كل بكسل بالمتر المربع باستخدام طريقة ee.Image.pixelArea.

محرّر الرموز البرمجية (JavaScript)

var area_image_with_transition_class = ee.Image.pixelArea().addBands(transition);

كائن الصورة الناتج (area_image_with_transition_class) هو صورة ذات نطاقَين، يحتوي النطاق الأول على معلومات المساحة بوحدات المتر المربع (الناتجة عن طريقة ee.Image.pixelAreacode> )، ويحتوي النطاق الثاني على معلومات فئة الانتقال.

بعد ذلك، نلخّص عمليات الانتقال بين الفئات ضمن منطقة الاهتمام (roi) باستخدام طريقة ee.Image.reduceRegion و أداة تقليل مجمّعة تعمل على جمع المساحة ضمن كل فئة من فئات الانتقال:

محرّر الرموز البرمجية (JavaScript)

var reduction_results = area_image_with_transition_class.reduceRegion({
  reducer: ee.Reducer.sum().group({
    groupField: 1,
    groupName: 'transition_class_value',
  }),
  geometry: roi,
  scale: 30,
  bestEffort: true,
});
print('reduction_results', reduction_results);

تعرض الآن نتيجة علامة التبويب "وحدة التحكّم" reduction_results. يُرجى العِلم أنّه عليك توسيع العرض التدرّجي للحساب بعدة مستويات للاطّلاع على بيانات ملخّص المنطقة.

نتائج التخفيض المجمَّعة
الشكل 12. ناتج علامة التبويب "وحدة التحكّم"، يعرض نتائج عملية التصغير المجمّعة.

على الرغم من أنّ العنصر reduction_results يتضمّن معلومات حول المنطقة التي تغطيها كل فئة من فئات الانتقال، إلا أنّه ليس من السهل قراءته. في القسم التالي، سنعمل على تسهيل عرض النتائج.

إنشاء رسم بياني ملخّص

في هذا القسم، سننشئ رسمًا بيانيًا لتلخيص النتائج بشكل أفضل. للبدء، نستخرج أولاً قائمة فئات الانتقال مع المناطق على النحو التالي:

محرّر الرموز البرمجية (JavaScript)

var roi_stats = ee.List(reduction_results.get('groups'));

نتيجة أداة الاختزال المجمّعة (reduction_results) هي قاموس يحتوي على قائمة قواميس. يتضمّن القاموس في القائمة قاموسًا واحدًا لكل فئة من فئات الانتقال. تستخدم هذه العبارات الطريقة ee.Dictionary.get لاستخراج نتائج المخفّض المجمّعة من هذا القاموس وتحويل النتائج إلى نوع بيانات ee.List ، ما يتيح لنا الوصول إلى القواميس الفردية.

للاستفادة من وظائف إنشاء الرسوم البيانية في "محرّر التعليمات البرمجية"، سننشئ FeatureCollection تتضمّن المعلومات اللازمة. للقيام بذلك، سننشئ أولاً قاموسَي بحث ودالتَين مساعدتَين. يمكن وضع الرمز الذي ينشئ قواميس البحث في أعلى قسم "الحسابات" على النحو التالي:

محرّر الرموز البرمجية (JavaScript)

//////////////////////////////////////////////////////////////
// Calculations
//////////////////////////////////////////////////////////////

// Create a dictionary for looking up names of transition classes.
var lookup_names = ee.Dictionary.fromLists(
    ee.List(gsw.get('transition_class_values')).map(numToString),
    gsw.get('transition_class_names')
);
// Create a dictionary for looking up colors of transition classes.
var lookup_palette = ee.Dictionary.fromLists(
    ee.List(gsw.get('transition_class_values')).map(numToString),
    gsw.get('transition_class_palette')
);

يربط قاموس lookup_names قيم فئة الانتقال بأسماءها، بينما يربط قاموس lookup_palette قيم فئة الانتقال بتعريفات الألوان.

يمكن وضع دالتَي المساعدة في قسم جديد من الرمز البرمجي باسم "دوال المساعدة".

محرّر الرموز البرمجية (JavaScript)

//////////////////////////////////////////////////////////////
// Helper functions
//////////////////////////////////////////////////////////////

// Create a feature for a transition class that includes the area covered.
function createFeature(transition_class_stats) {
  transition_class_stats = ee.Dictionary(transition_class_stats);
  var class_number = transition_class_stats.get('transition_class_value');
  var result = {
      transition_class_number: class_number,
      transition_class_name: lookup_names.get(class_number),
      transition_class_palette: lookup_palette.get(class_number),
      area_m2: transition_class_stats.get('sum')
  };
  return ee.Feature(null, result);   // Creates a feature without a geometry.
}

// Create a JSON dictionary that defines piechart colors based on the
// transition class palette.
// https://developers.google.com/chart/interactive/docs/gallery/piechart
function createPieChartSliceDictionary(fc) {
  return ee.List(fc.aggregate_array("transition_class_palette"))
    .map(function(p) { return {'color': p}; }).getInfo();
}

// Convert a number to a string. Used for constructing dictionary key lists
// from computed number objects.
function numToString(num) {
  return ee.Number(num).format();
}

تأخذ الدالة createFeature قاموسًا (يحتوي على المنطقة وفئة الانتقال المائي) وتعرض Feature مناسبًا للرسم البياني. تنشئ الدالة createPieChartSliceDictionary قائمة بالألوان التي تتوافق مع فئات الانتقال، وذلك باستخدام التنسيق المتوقّع من المخطط الدائري.

بعد ذلك، سنطبّق الدالة createFeature على كل قاموس في القائمة (roi_stats)، باستخدام ee.List.map لتطبيق الدالة المساعدة على كل عنصر في القائمة.

محرّر الرموز البرمجية (JavaScript)

var transition_fc = ee.FeatureCollection(roi_stats.map(createFeature));
print('transition_fc', transition_fc);

بعد أن أصبح لدينا FeatureCollection يحتوي على السمات التي نريد عرضها على الرسم البياني، يمكننا إنشاء عنصر رسم بياني وطباعته في وحدة التحكّم.

محرّر الرموز البرمجية (JavaScript)

// Add a summary chart.
var transition_summary_chart = ui.Chart.feature.byFeature({
    features: transition_fc,
    xProperty: 'transition_class_name',
    yProperties: ['area_m2', 'transition_class_number']
  })
  .setChartType('PieChart')
  .setOptions({
    title: 'Summary of transition class areas',
    slices: createPieChartSliceDictionary(transition_fc),
    sliceVisibilityThreshold: 0  // Don't group small slices.
  });
print(transition_summary_chart);

يؤدي الخيار slices إلى تلوين شرائح المخطط الدائري لتستخدِم لوحة الألوان التلقائية المحدّدة لفئات الانتقال (الموضّحة سابقًا في جدول مفتاح الخريطة). يمنع الخيار sliceVisibilityThreshold تجميع الشرائح الصغيرة معًا في فئة "غير ذلك". يجب أن يكون الرسم البياني الناتج مشابهًا للرسم البياني الموضّح في الشكل 13.

الرسم البياني لملخّص فئة الانتقال إلى استخدام المياه
الشكل 13. رسم بياني يلخّص الأحجام النسبية لفئات الانتقال المائي.

النص البرمجي النهائي

نص هذا القسم بالكامل هو:

محرّر الرموز البرمجية (JavaScript)

//////////////////////////////////////////////////////////////
// Asset List
//////////////////////////////////////////////////////////////

var gsw = ee.Image('JRC/GSW1_0/GlobalSurfaceWater');
var occurrence = gsw.select('occurrence');
var change = gsw.select("change_abs");
var transition = gsw.select('transition');
var roi = ee.Geometry.Polygon(
        [[[105.531921, 10.412183],
          [105.652770, 10.285193],
          [105.949401, 10.520218],
          [105.809326, 10.666006]]]);
//////////////////////////////////////////////////////////////
// Constants
//////////////////////////////////////////////////////////////

var VIS_OCCURRENCE = {
    min: 0,
    max: 100,
    palette: ['red', 'blue']
};
var VIS_CHANGE = {
    min: -50,
    max: 50,
    palette: ['red', 'black', 'limegreen']
};
var VIS_WATER_MASK = {
  palette: ['white', 'black']
};

//////////////////////////////////////////////////////////////
// Helper functions
//////////////////////////////////////////////////////////////

// Create a feature for a transition class that includes the area covered.
function createFeature(transition_class_stats) {
  transition_class_stats = ee.Dictionary(transition_class_stats);
  var class_number = transition_class_stats.get('transition_class_value');
  var result = {
      transition_class_number: class_number,
      transition_class_name: lookup_names.get(class_number),
      transition_class_palette: lookup_palette.get(class_number),
      area_m2: transition_class_stats.get('sum')
  };
  return ee.Feature(null, result);   // Creates a feature without a geometry.
}

// Create a JSON dictionary that defines piechart colors based on the
// transition class palette.
// https://developers.google.com/chart/interactive/docs/gallery/piechart
function createPieChartSliceDictionary(fc) {
  return ee.List(fc.aggregate_array("transition_class_palette"))
    .map(function(p) { return {'color': p}; }).getInfo();
}

// Convert a number to a string. Used for constructing dictionary key lists
// from computed number objects.
function numToString(num) {
  return ee.Number(num).format();
}

//////////////////////////////////////////////////////////////
// Calculations
//////////////////////////////////////////////////////////////

// Create a dictionary for looking up names of transition classes.
var lookup_names = ee.Dictionary.fromLists(
    ee.List(gsw.get('transition_class_values')).map(numToString),
    gsw.get('transition_class_names')
);
// Create a dictionary for looking up colors of transition classes.
var lookup_palette = ee.Dictionary.fromLists(
    ee.List(gsw.get('transition_class_values')).map(numToString),
    gsw.get('transition_class_palette')
);

// Create a water mask layer, and set the image mask so that non-water areas
// are transparent.
var water_mask = occurrence.gt(90).mask(1);

// Generate a histogram object and print it to the console tab.
var histogram = ui.Chart.image.histogram({
  image: change,
  region: roi,
  scale: 30,
  minBucketWidth: 10
});
histogram.setOptions({
  title: 'Histogram of surface water change intensity.'
});
print(histogram);

// Summarize transition classes in a region of interest.
var area_image_with_transition_class = ee.Image.pixelArea().addBands(transition);
var reduction_results = area_image_with_transition_class.reduceRegion({
  reducer: ee.Reducer.sum().group({
    groupField: 1,
    groupName: 'transition_class_value',
  }),
  geometry: roi,
  scale: 30,
  bestEffort: true,
});
print('reduction_results', reduction_results);

var roi_stats = ee.List(reduction_results.get('groups'));

var transition_fc = ee.FeatureCollection(roi_stats.map(createFeature));
print('transition_fc', transition_fc);

// Add a summary chart.
var transition_summary_chart = ui.Chart.feature.byFeature({
    features: transition_fc,
    xProperty: 'transition_class_name',
    yProperties: ['area_m2', 'transition_class_number']
  })
  .setChartType('PieChart')
  .setOptions({
    title: 'Summary of transition class areas',
    slices: createPieChartSliceDictionary(transition_fc),
    sliceVisibilityThreshold: 0  // Don't group small slices.
  });
print(transition_summary_chart);

//////////////////////////////////////////////////////////////
// Initialize Map Location
//////////////////////////////////////////////////////////////

// Uncomment one of the following statements to center the map on
// a particular location.
// 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,
  shown: false
});
Map.addLayer({
  eeObject: change,
  visParams: VIS_CHANGE,
  name: 'occurrence change intensity',
  shown: false
});
Map.addLayer({
  eeObject: transition,
  name: 'Transition classes (1984-2015)',
});

بهذا نختتم البرنامج التعليمي حول مجموعة بيانات "المياه السطحية العالمية". يُرجى العِلم أنّ هذا البرنامج التعليمي قد أوضح كيفية استخدام ثلاث طبقات فقط من طبقات البيانات (الحدوث وشدة التغيير والانتقال) المتوفّرة في مجموعة بيانات "المياه السطحية العالمية". يمكنك الاطّلاع على طبقات البيانات الأخرى المتوفّرة في دليل مستخدمي البيانات (الإصدار 2).

نتمنّى لك تجربة تحليل ناجحة.