وقوع آب (1984-2015)

مجموعه داده GSW حاوی لایه های داده بسیاری است که داده های آب سطحی را به روش های مختلف ارائه می دهد. ما با تجسم لایه وقوع آب شروع خواهیم کرد، که خلاصه ای از مکان و تعداد دفعات وقوع آب سطحی در کل بازه زمانی بین مارس 1984 و اکتبر 2015 را ارائه می دهد.

این بخش از آموزش به شرح زیر خواهد بود:

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

ایجاد یک تجسم اولیه

با کپی کردن عبارات زیر در ویرایشگر کد شروع کنید:

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

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

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

بر روی دکمه "Run" ویرایشگر کد کلیک کنید و پس از چند ثانیه نقشه ای با رنگ خاکستری در امتداد خطوط ساحلی مشابه شکل 1 مشاهده خواهید کرد.

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

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

بازرسی ارزش ها

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

برگه بازرس
شکل 2. نمونه خروجی زبانه Inspector.

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

Refactoring برای بهبود کد شما

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

آرگومان های Map.addLayer
شکل 3. تصویری که آرگومان های متد addLayer را نشان می دهد.

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

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

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

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

اضافه کردن پارامترهای تجسم

در مرحله بعد، ما روی بهبود پارامترهای تجسم پیش‌فرض که آب ما را خاکستری می‌کنند، کار خواهیم کرد. یک عبارت جدید اضافه کنید که یک متغیر 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 نشان می دهد که قرمز باید برای حداقل مقدار 0٪ و آبی برای حداکثر مقدار 100٪ استفاده شود. افزودن .updateMask(occurrence.divide(100)) باعث می شود که کدورت/شفافیت پیکسل ها بر اساس مقدار وقوع تنظیم شود.

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

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

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

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

تصویر وقوع آب حاوی اطلاعاتی در مورد میزان آب مورد انتظار با استفاده از طیفی از مقادیر از 0 تا 100٪ است. با این حال، اغلب مفید است که یک لایه آب باینری (یعنی "آب" در مقابل "غیر آب") بر اساس درصد خاصی از وقوع (یعنی یک مقدار آستانه) تعریف شود. ما از این لایه باینری ساده به عنوان یک لایه پس زمینه تمیز استفاده می کنیم که می توان لایه های دیگر GSW را روی آن قرار داد. ایجاد این لایه آستانه را می توان با استفاده از دستورات زیر انجام داد که از مقدار آستانه 90 درصد برای جداسازی آب و غیرآب استفاده می کند.

ابتدا یک متغیر تجسم جدید 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'
});
ماسک آب 90 درصد
شکل 5. تصویری از ماسک 90 درصدی آب برای دلتای پارانا در نزدیکی بوئنوس آیرس.

رفتن به نقاط جالب دنیا

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

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

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

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