رخدادهای مبتنی بر آب (۱۹۸۴ تا ۲۰۱۵)

مجموعه داده GSW حاوی لایه‌های داده بسیاری است که داده‌های آب سطحی را به روش‌های مختلفی ارائه می‌دهد. با تجسم لایه رخداد آب شروع می‌کنیم، که خلاصه‌ای از مکان و تعداد دفعات وقوع آب سطحی در کل دوره زمانی بین مارس ۱۹۸۴ و اکتبر ۲۰۱۵ ارائه می‌دهد.

این بخش از آموزش:

  1. افزودن لایه نقشه برای تجسم وقوع آب‌های سطحی،
  2. نحوه پُرسمان کردن مقادیر لایه نقشه را نشان می‌دهد،
  3. افزودن سبک سفارشی برای بهبود تجسم،
  4. ایجاد لایه ماسک آب دودویی بااستفاده از مقدار آستانه،
  5. نقشه را روی بخش‌های جالب جهان متمرکز کنید، و
  6. نشان بده چگونه می‌توان کد را بازسازی کرد تا خواناتر و قابل‌نگهداری‌تر شود.

ایجاد یک تجسم پایه

با کپی کردن عبارت‌های زیر در «ویرایشگر کد» شروع کنید:

ویرایشگر کد (جاوا اسکریپت)

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

دستور اول به شیء تصویر Earth Engine برای مجموعه داده GSW ارجاع می‌دهد و آن را در متغیری به‌نام gsw ذخیره می‌کند. عبارت دوم یک لایه از مجموعه داده GSW را انتخاب می‌کند و آن را در متغیری به نام occurrence ذخیره می‌کند. عبارت سوم تصویر رخداد را به نقشه تعاملی «ویرایشگر کد» اضافه می‌کند.

روی دکمه «اجرا» در «ویرایشگر کد» کلیک کنید و پس‌از چند ثانیه باید نقشه‌ای با رنگ خاکستری در امتداد خطوط ساحلی ببینید، مشابه شکل ۱.

مصورسازی پیش‌فرض
شکل ۱. تجسم پیش‌فرض لایه داده‌های وقوع آب‌های سطحی جهانی.

در اکثر مناطق، مجموعه داده GSW شفاف به‌نظر می‌رسد، زیرا مکان‌هایی که در آن‌ها تصاویر Landsat جمع‌آوری نشده است (یعنی مناطق اقیانوسی) یا مکان‌هایی که در آن‌ها آب توسط هیچ مشاهده‌ای در ۳۲ سال گذشته شناسایی نشده است پوشانده شده‌اند.

بررسی مقادیر

برای کاوش مقادیر لایه وقوع آب، از برگه بازرس «ویرایشگر کد» استفاده خواهیم کرد. ابتدا روی برگه بازرس کلیک کنید، سپس روی نقشه کلیک کنید تا مکانی را انتخاب کنید. برگه بازرس اطلاعات مربوط به هریک از لایه‌های موجود در جایی را که کلیک کرده‌اید نمایش می‌دهد.

زبانه بازرس
شکل ۲. نمونه خروجی برگه «بازرس».

در مثال بالا، مقدار لایه با نام value برابر با ۹۸ است. واحدها به‌صورت درصد هستند، بنابراین تقریباً ۹۸٪ مواقع مکان به‌عنوان پوشیده از آب طبقه‌بندی شده است. این مقدار میانگین هریک از مقادیر ماهانه وقوع آب سطحی است که دربرابر تغییرات فصلی نرمال‌سازی می‌شود، همان‌طور که در راهنمای کاربران داده (نسخه ۲) شرح داده شده است.

بازسازی کد برای بهبود کد

اسکریپت ما فقط دو عبارت دارد، اما همین حالا هم فرصت داریم کد را بازسازی کنیم تا اسکریپت نهایی ما در طول زمان راحت‌تر خوانده و نگهداری شود. درحال‌حاضر، عبارت Map.addLayer() یک آرگومان واحد occurrence را ارسال می‌کند که شیء تصویر Earth Engine است که می‌خواهیم در نقشه نمایش دهیم. بااین‌حال، روش Map.addLayer() همچنین اجازه می‌دهد تا آرگومان‌های اضافی به آن منتقل شود. برای اینکه سریع ببینید چه آرگومان‌هایی دردسترس است، مکان‌نما را بعداز پرانتز باز قرار دهید و میان‌بر صفحه‌کلید «نمایش پیشنهادهای کد» را فشار دهید تا سند راهنما برای روش addLayer نشان داده شود. (میان‌برهای صفحه‌کلید را می‌توانید با انتخاب منوی «راهنما» <- «میان‌برها» مشاهده کنید.)

متغیرهای Map.addLayer
شکل ۳. نماگرفتی که آرگومان‌های روش addLayer را نشان می‌دهد.

میان‌برهای صفحه‌کلید نشان می‌دهند که پنج متغیر مستقل وجود دارد که می‌توانند به Map.addLayer منتقل شوند: eeObject، visParams، name، shown، و opacity. در متن فعلی ما، یک متغیر واحد occurrence را ارسال می‌کنیم که به‌عنوان اولین آرگومان، eeObject، تفسیر می‌شود. برای ارسال هم شیء متغیر و هم آرگومان اضافی که لایه را نام‌گذاری می‌کند، می‌توانیم کد را بازسازی کنیم تا از «آرگومان‌های نام‌گذاری‌شده» (eeObject و name) استفاده کند که از داخل یک ساختار داده JSON به روش ارسال می‌شوند، همان‌طور که در زیر نشان داده شده است:

ویرایشگر کد (جاوا اسکریپت)

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

کد را دوباره اجرا کنید تا مطمئن شوید که پس‌از تغییرات بازسازی کد همچنان کار می‌کند. نقشه حاصل باید بدون تغییر باقی بماند.

افزودن پارامترهای تجسم‌سازی

سپس، روی بهبود پارامترهای تجسم پیش‌فرض کار خواهیم کرد که باعث می‌شود آب خاکستری به‌نظر برسد. عبارت جدیدی اضافه کنید که متغیر VIS_OCCURRENCE را ایجاد کند و آن را به‌عنوان آرگومان اضافی به روش addLayer ارسال کنید.

ویرایشگر کد (جاوا اسکریپت)

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

ویرایشگر کد (جاوا اسکریپت)

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

پارامترهای دیداری‌سازی ذخیره‌شده در ساختار JSON VIS_OCCURRENCE نشان می‌دهند که باید از رنگ قرمز برای حداقل مقدار ۰٪ و از رنگ آبی برای حداکثر مقدار ۱۰۰٪ استفاده شود. افزودن .updateMask(occurrence.divide(100)) باعث می‌شود ماتی/ شفافیت پیکسل‌ها براساس مقدار رخداد تنظیم شود.

اسکریپت را دوباره اجرا کنید و نتایج بازبینی‌شده را از تغییرات سبک‌بندی ما مشاهده کنید.

رخداد آب‌های سطحی
شکل ۴. نماگرفت از وقوع آب برای دلتای پارانا در نزدیکی بوئنوس آیرس، بااستفاده از رنگ قرمز شفاف برای نقطه پایانی حداقل مقدار ۰٪ و رنگ آبی خالص برای نقطه پایانی حداکثر مقدار.

مناطق آبی اکنون آبی‌رنگ هستند! پیشرفت!

ایجاد لایه آستانه

تصویر وقوع آب حاوی اطلاعاتی درباره میزان انتظار وجود آب بااستفاده از طیف مقادیر ۰ تا ۱۰۰٪ است. بااین‌حال، اغلب مفید است که یک لایه آب دودویی تعریف شود (یعنی، «آب» درمقابل «غیرآب») براساس درصد مشخصی از وقوع (یعنی مقدار آستانه) طبقه‌بندی می‌کند. از این لایه دودویی ساده به‌عنوان لایه پس‌زمینه تمیزی استفاده خواهیم کرد که سایر لایه‌های GSW را می‌توان روی آن قرار داد. ایجاد این لایه آستانه را می‌توان بااستفاده از عبارت‌های زیر انجام داد که از مقدار آستانه ۹۰٪ برای جدا کردن آب و غیرآب استفاده می‌کند.

ابتدا متغیر تجسم جدیدی VIS_WATER_MASK برای نگهداری اطلاعات سبک‌بندی برای ماسک آب تعریف می‌کنیم:

ویرایشگر کد (جاوا اسکریپت)

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

سپس بااستفاده از عملگر مقایسه بزرگ‌تر از .gt(90)، لایه ماسک آب را محاسبه می‌کنیم و سپس بااستفاده از روش .unmask()، نواحی ماسک‌شده قبلی را روی صفر تنظیم می‌کنیم:

ویرایشگر کد (جاوا اسکریپت)

// 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 دیگری قرار دهید.

ویرایشگر کد (جاوا اسکریپت)

Map.addLayer({
  eeObject: water_mask,
  visParams: VIS_WATER_MASK,
  name: '90% occurrence water mask'
});
ماسک آب ۹۰٪
شکل ۵. نماگرفتی از ماسک آب ۹۰٪ برای دلتای پارانا در نزدیکی بوئنوس آیرس.

رفتن به بخش‌های جالب دنیا

کاوش جهان با حرکت افقی و بزرگ‌نمایی در اطراف جالب است، اما جهان بزرگ است و گاهی اوقات کمک می‌کند مستقیماً به مکان خاصی بروید. در اینجا مجموعه‌ای از بیانیه‌ها وجود دارد که نمونه کوچکی از مکان‌های جالب را ازنظر آب‌های سطحی ارائه می‌دهد. فقط یکی از عبارت‌ها را در هر زمان از حالت توضیح خارج کنید، و وقتی دستورات اجرا شود، به آن مکان می‌رود.

ویرایشگر کد (جاوا اسکریپت)

// 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 برویم، می‌خواهیم کمی بیشتر کد را بازسازی کنیم. به‌طور مشخص، عبارت‌های مشابه را باهم گروه‌بندی می‌کنیم و چند نظر اضافه می‌کنیم که کد ما را به بخش‌هایی برای دارایی‌ها، ثابت‌ها، محاسبات، متمرکز کردن نقشه، و افزودن لایه‌های نقشه تقسیم می‌کند.

این هم متن بازسازی‌شده نهایی:

ویرایشگر کد (جاوا اسکریپت)

//////////////////////////////////////////////////////////////
// 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
});

در بخش بعدی، بررسی می‌کنید که چگونه وقوع آب درطول زمان تغییر کرده است.