عدد مرات حدوث الفيضانات (1984-2015)

تحتوي مجموعة بيانات GSW على العديد من طبقات البيانات التي تعرض بيانات المياه السطحية بطرق مختلفة. سنبدأ بعرض طبقة بيانات توضّح أماكن توفّر المياه ومعدّل توفّرها خلال الفترة الزمنية الممتدة بين آذار (مارس) 1984 وتشرين الأول (أكتوبر) 2015.

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

  1. إضافة طبقة خريطة لتصوّر حدوث المياه السطحية
  2. توضيح كيفية طلب قيم طبقة الخريطة
  3. إضافة أنماط مخصّصة لتحسين التصوّر
  4. إنشاء طبقة قناع مائي ثنائي باستخدام قيمة حدية
  5. توسيط الخريطة على أجزاء مثيرة للاهتمام من العالم
  6. توضيح كيفية إعادة تصميم النص البرمجي ليكون أكثر قابلية للقراءة والصيانة

إنشاء تمثيل مرئي أساسي

ابدأ بنسخ العبارات التالية إلى "أداة تعديل الرموز":

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

var gsw = ee.Image('JRC/GSW1_0/GlobalSurfaceWater');
var occurrence = gsw.select('occurrence');
Map.addLayer(occurrence);

يشير البيان الأول إلى عنصر الصورة في Earth Engine لمجموعة بيانات GSW، ويخزّنه في متغيّر اسمه gsw. يختار البيان الثاني طبقة واحدة من مجموعة بيانات GSW ويخزّنها في متغير باسم occurrence. تضيف الجملة الثالثة صورة الحدوث إلى الخريطة التفاعلية في "محرّر التعليمات البرمجية".

انقر على زر "تشغيل" في "محرّر الرموز"، وبعد بضع ثوانٍ، من المفترض أن تظهر خريطة بلون رمادي على طول السواحل، كما هو موضّح في الشكل 1.

التصوّر التلقائي
الشكل 1. التمثيل المرئي التلقائي لطبقة بيانات توفّر المياه السطحية العالمية

في معظم المناطق، تبدو مجموعة بيانات GSW شفافة لأنّه تم إخفاء المواقع الجغرافية التي لم يتم جمع صور Landsat فيها (أي المناطق البحرية) أو التي لم يتم رصد المياه فيها خلال أي من عمليات الرصد على مدار 32 عامًا.

فحص القيم

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

علامة التبويب "أداة الفحص"
الشكل 2. مثال على الناتج في علامة التبويب "أداة الفحص"

في المثال أعلاه، قيمة الطبقة المسماة value هي 98. الوحدات هي نقاط مئوية، لذا تم تصنيف الموقع الجغرافي على أنّه مغطّى بالمياه في% 98 من الوقت تقريبًا. القيمة هي متوسط كل قيم حدوث المياه السطحية الشهرية، والتي يتم تسويتها حسب التغيّر الموسمي، كما هو موضّح في دليل مستخدمي البيانات (الإصدار 2) .

إعادة تصميم الرمز البرمجي لتحسينه

لا يحتوي البرنامج النصي إلا على عبارتين، ولكن لدينا الآن فرصة لإعادة تصميم الرمز البرمجي بحيث يسهل قراءة البرنامج النصي النهائي وصيانته بمرور الوقت. في الوقت الحالي، تمرّر عبارة Map.addLayer() وسيطة واحدة occurrence، وهي كائن صورة Earth Engine الذي نريد عرضه على الخريطة. ومع ذلك، تسمح طريقة Map.addLayer() أيضًا بتمرير وسيطات إضافية إليها. للاطّلاع بسرعة على الوسيطات المتاحة، ضَع المؤشر بعد الأقواس المفتوحة واضغط على اختصار لوحة المفاتيح الخاص بـ "عرض اقتراحات الرموز" لعرض مستند المساعدة الخاص بالطريقة addLayer. (يمكن الاطّلاع على اختصارات لوحة المفاتيح من خلال اختيار القائمة "مساعدة" -> "الاختصارات").

وسيطات Map.addLayer
الشكل 3. لقطة شاشة تعرض وسيطات طريقة addLayer.

توضّح اختصارات لوحة المفاتيح أنّه يمكن تمرير خمس وسيطات إلى Map.addLayer: eeObject وvisParams وname وshown وopacity. في النص البرمجي الحالي، نمرّر متغيّرًا واحدًا occurrence يتم تفسيره على أنّه الوسيط الأول، eeObject. لتمرير كلّ من الكائن المتغيّر ووسيط إضافي يحدّد اسم الطبقة، يمكننا إعادة تصميم الرمز البرمجي لاستخدام "الوسيطات المسماة" (eeObject وname) التي يتم تمريرها إلى الطريقة من داخل بنية بيانات JSON كما هو موضّح أدناه:

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

Map.addLayer({eeObject: occurrence, name: 'Water Occurrence (1984-2015)'});

نفِّذ الرمز مرة أخرى للتأكّد من أنّه لا يزال يعمل بعد إجراء تغييرات إعادة البناء. يجب أن تبقى الخريطة الناتجة بدون تغيير.

إضافة مَعلمات العرض المرئي

بعد ذلك، سنعمل على تحسين مَعلمات العرض المرئي التلقائية التي تجعل لون المياه يظهر باللون الرمادي. أضِف عبارة جديدة تنشئ متغيّرًا VIS_OCCURRENCE ومرِّره كمعلَمة إضافية إلى طريقة addLayer.

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

var VIS_OCCURRENCE = {
  min: 0,
  max: 100,
  palette: ['red', 'blue']
};

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

Map.addLayer({
  eeObject: occurrence.updateMask(occurrence.divide(100)),
  name: 'Water Occurrence (1984-2015)',
  visParams: VIS_OCCURRENCE
});

تشير مَعلمات التصوّر المخزَّنة في بنية JSON VIS_OCCURRENCE إلى أنّه يجب استخدام اللون الأحمر للحد الأدنى من القيمة البالغ% 0 واللون الأزرق للحد الأقصى من القيمة البالغ %100. تؤدي إضافة .updateMask(occurrence.divide(100)) إلى ضبط مستوى التعتيم/الشفافية لوحدات البكسل استنادًا إلى قيمة التكرار.

نفِّذ النص البرمجي مرة أخرى، واطّلِع على النتائج المعدَّلة من تغييرات الأنماط.

توفّر المياه السطحية
الشكل 4. لقطة شاشة لظهور المياه في دلتا بارانا بالقرب من بوينس آيرس، باستخدام لون أحمر شفاف لنقطة النهاية ذات القيمة الدنيا البالغة% 0 ولون أزرق ثابت لنقطة النهاية ذات القيمة القصوى

أصبحت مناطق المياه الآن باللون الأزرق. أحرزت تقدّمًا!

إنشاء طبقة حدّ

تحتوي صورة توفّر المياه على معلومات حول عدد المرات التي يُتوقّع فيها توفّر المياه باستخدام نطاق من القيم يتراوح بين 0 و100%. ومع ذلك، من المفيد غالبًا تحديد طبقة ثنائية للمياه (أي "مياه" مقابل "غير مياه") استنادًا إلى نسبة مئوية معيّنة من التكرار (أي قيمة حدّية). سنستخدم هذه الطبقة الثنائية البسيطة كطبقة خلفية نظيفة يمكن وضع طبقات GSW الأخرى فوقها. يمكن إنشاء طبقة الحدّ الأدنى هذه باستخدام العبارات التالية التي تستخدم قيمة حدّ أدنى تبلغ% 90 لفصل المياه عن غير المياه.

أولاً، نحدّد متغيّرًا جديدًا للتصوّر VIS_WATER_MASK من أجل الاحتفاظ بمعلومات التنسيق الخاصة بقناع المياه:

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

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

بعد ذلك، نحسب طبقة قناع المياه باستخدام عامل المقارنة "أكبر من" .gt(90)، ثم نضبط المناطق التي تم إخفاؤها سابقًا على صفر باستخدام الطريقة .unmask():

محرّر الرموز البرمجية (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);

وأخيرًا، أضِف الطبقة إلى الخريطة. لعرض هذه الطبقة تحت جميع الطبقات الأخرى، ضَع العبارة التالية قبل أي عبارات Map.addLayer أخرى.

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

Map.addLayer({
  eeObject: water_mask,
  visParams: VIS_WATER_MASK,
  name: '90% occurrence water mask'
});
قناع مائي بنسبة ‎90%
الشكل 5. لقطة شاشة لقناع مائي بنسبة% 90 لمنطقة دلتا بارانا بالقرب من بوينس آيرس

الانتقال إلى أماكن مثيرة للاهتمام حول العالم

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

محرّر الرموز البرمجية (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

هذه مجرد عيّنة صغيرة من المواقع الجغرافية المثيرة للاهتمام. يمكنك إضافة أفكارك الخاصة.

إعادة الهيكلة، مرة أخرى...

قبل الانتقال إلى الطبقة التالية من مجموعة بيانات GSW، سنعيد تنظيم بعض التعليمات البرمجية. على وجه التحديد، سنجمع العبارات المتشابهة معًا، وسنضيف بعض التعليقات التي ستقسّم الرمز إلى أقسام خاصة بمواد العرض والثوابت والحسابات وتوسيط الخريطة وإضافة طبقات الخريطة.

إليك النص البرمجي النهائي الذي تمّت إعادة تصميمه:

محرّر الرموز البرمجية (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
});

في القسم التالي، يمكنك استكشاف كيف تغيّر معدّل توفّر المياه بمرور الوقت.