گذار کلاس آب

لایه انتقال آب تغییرات بین سه کلاس وقوع آب (غیرآب، آب فصلی، و آب دائمی) را به‌همراه دو کلاس دیگر برای آب زودگذر (دائمی زودگذر و فصلی زودگذر) ثبت می‌کند.

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

  1. لایه نقشه برای تجسم انتقال آب اضافه کنید،
  2. یک کاهنده گروه‌بندی‌شده برای جمع کردن مساحت هر کلاس انتقال در یک منطقه موردعلاقه مشخص ایجاد کنید، و
  3. نموداری ایجاد کنید که منطقه را براساس کلاس انتقال خلاصه کند.

دیداری‌سازی پایه

در بخش «فهرست دارایی» در اسکریپت، عبارت زیر را اضافه کنید که شیء تصویر تک‌باندی به‌نام transition ایجاد می‌کند:

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

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

تصاویر GSW حاوی فراداده‌هایی درباره شماره‌ها و نام‌های کلاس انتقال و یک پالت پیش‌فرض برای سبک‌بندی کلاس‌های انتقال است. وقتی لایه انتقال به نقشه اضافه شود، این پارامترهای دیداری‌سازی به‌طور خودکار استفاده خواهد شد.

در پایین بخش «لایه‌های نقشه» در متن، عبارت زیر را اضافه کنید که لایه نقشه جدیدی را اضافه می‌کند که کلاس‌های انتقال را نمایش می‌دهد:

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

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

وقتی اسکریپت را اجرا می‌کنید، لایه انتقال نمایش داده خواهد شد.

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

کلید نقشه برای کلاس‌های انتقال عبارت است از:

مقدار نماد برچسب
0 آب نباشد
1 دائمی
2 دائمی جدید
3 دائمی ازدست‌رفته
4 فصلی
5 فصلی جدید
6 فصلی ازدست‌رفته
7 فصلی به دائمی
8 دائمی به فصلی
9 دائمی زودگذر
10 فصلی زودگذر

خلاصه کردن منطقه براساس کلاس انتقال

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

برای این مثال، چندضلعی جدیدی در دلتای رود مکونگ رسم می‌کنیم.

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

برای محاسبه مساحت پوشش‌داده‌شده توسط بخش‌هایی از تصویر، باند دیگری به شیء تصویر انتقال اضافه می‌کنیم که اندازه هر پیکسل را به متر مربع بااستفاده از روش ee.Image.pixelArea شناسایی می‌کند.

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

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

شیء تصویر حاصل (area_image_with_transition_class) یک تصویر دو باندی است که باند اول حاوی اطلاعات مساحت برحسب متر مربع (تولیدشده توسط روش ee.Image.pixelArea ) و باند دوم حاوی اطلاعات کلاس انتقال است.

سپس انتقال‌های کلاس را در منطقه موردنظر (roi) بااستفاده از روش ee.Image.reduceRegion و یک کاهنده گروه‌بندی‌شده که برای جمع کردن مساحت در هر کلاس انتقال عمل می‌کند، خلاصه می‌کنیم:

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

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 را نمایش می‌دهد. توجه داشته باشید که باید درخت را چند سطح گسترش دهید تا داده‌های خلاصه منطقه را ببینید.

نتایج کاهش گروه‌بندی‌شده
شکل ۱۲. برونداد زبانه «کنسول» که نتایج کاهش گروه‌بندی‌شده را نشان می‌دهد.

اگرچه شیء reduction_results حاوی اطلاعاتی درباره منطقه تحت پوشش هر کلاس انتقال است، اما خواندن آن چندان آسان نیست. در بخش بعدی مشاهده نتایج را آسان‌تر خواهیم کرد.

درحال ایجاد نمودار خلاصه

در این بخش، نموداری برای خلاصه کردن بهتر نتایج ایجاد خواهیم کرد. برای شروع، ابتدا فهرست کلاس‌های انتقال را با نواحی به‌صورت زیر استخراج می‌کنیم:

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

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

نتیجه کاهنده گروه‌بندی‌شده (reduction_results) واژه‌نامه‌ای است که حاوی فهرستی از واژه‌نامه‌ها است. برای هر کلاس انتقال، یک واژه‌نامه در فهرست وجود دارد. این عبارت‌ها از روش ee.Dictionary.get برای استخراج نتایج کاهنده گروه‌بندی‌شده از آن واژه‌نامه استفاده می‌کنند و نتایج را به نوع داده ee.List تبدیل می‌کنند تا بتوانیم به واژه‌نامه‌های تکی دسترسی داشته باشیم.

برای استفاده از توابع نمودارسازی «ویرایشگر کد»، یک FeatureCollection می‌سازیم که حاوی اطلاعات لازم است. برای انجام این کار، ابتدا دو واژه‌نامه جست‌وجو و دو تابع کمکی ایجاد می‌کنیم. کدی که واژه‌نامه‌های جستجو را ایجاد می‌کند می‌تواند در بالای بخش «محاسبات» به‌صورت زیر قرار گیرد:

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

//////////////////////////////////////////////////////////////
// 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 مقادیر کلاس انتقال را با تعاریف رنگ مرتبط می‌کند.

دو تابع کمکی را می‌توان در بخش کد جدیدی به‌نام «تابع‌های کمکی» قرار داد.

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

//////////////////////////////////////////////////////////////
// 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 یک واژه‌نامه (شامل مساحت و کلاس انتقال آب) را می‌گیرد و یک «عارضه» مناسب برای نمودار کردن برمی‌گرداند. تابع createPieChartSliceDictionary فهرستی از رنگ‌ها ایجاد می‌کند که بااستفاده از قالب موردانتظار نمودار دایره‌ای، با کلاس‌های انتقال مطابقت دارد.

سپس، تابع createFeature را روی هر واژه‌نامه در فهرست (roi_stats) اعمال می‌کنیم و از ee.List.map برای اعمال تابع کمکی روی هر عنصر فهرست استفاده می‌کنیم.

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

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

اکنون که FeatureCollection حاوی مشخصه‌هایی را که می‌خواهیم در نمودار نمایش دهیم داریم، می‌توانیم شیء نمودار را ایجاد کنیم و آن را در کنسول چاپ کنیم.

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

// 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 از گروه‌بندی برش‌های کوچک باهم در دسته «دیگر» جلوگیری می‌کند. نمودار حاصل باید چیزی شبیه به آنچه در شکل ۱۳ نشان داده شده است باشد.

نمودار خلاصه کلاس انتقال آب
شکل ۱۳. نمودار خلاصه اندازه نسبی کلاس‌های انتقال آب.

متن نهایی

متن کامل این بخش:

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

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

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

تحلیل خوبی داشته باشید!