ওয়াটার ক্লাস ট্রানজিশন

ওয়াটার ট্রানজিশন লেয়ার তিন ধরনের জলের উপস্থিতির (জল নয়, মরশুমি জল ও স্থায়ী জল) মধ্যে পরিবর্তন ক্যাপচার করে, এর সাথে ক্ষণস্থায়ী জলের (ক্ষণস্থায়ী স্থায়ী ও ক্ষণস্থায়ী মরশুমি) জন্য দুটি অতিরিক্ত ক্লাসও ক্যাপচার করে।

টিউটোরিয়ালের এই বিভাগ:

  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 ক্ষণস্থায়ী মৌসুমী

ট্রানজিশন ক্লাস অনুযায়ী এলাকার সারসংক্ষেপ তৈরি করা হচ্ছে

এই বিভাগে আমরা আবার জিওমেট্রি পলিগন টুল ব্যবহার করে আগ্রহের অঞ্চল নির্ধারণ করব। আপনি যদি নতুন লোকেশন বিশ্লেষণ করতে চান, তাহলে প্রথমে আপনাকে বেছে নিতে হবে এবং আপনার আঁকা আসল পলিগন মুছে ফেলতে হবে যাতে আপনি সম্মিলিত এলাকা থেকে ফলাফল না পান। কীভাবে জিওমেট্রি পরিবর্তন করতে হয় সেই সম্পর্কে তথ্য পেতে, কোড এডিটর ডকুমেন্টের জিওমেট্রি টুল বিভাগ দেখুন।

এই উদাহরণের জন্য আমরা মেকং নদীর ব-দ্বীপের মধ্যে একটি নতুন বহুভুজ আঁকব।

ROI সহ ট্রানজিশন ক্লাস
ছবি ১১. ভিয়েতনামের মেকং নদীর বদ্বীপ, যেখানে কোড এডিটরের পলিগন ড্রয়িং টুল ব্যবহার করে একটি আগ্রহের অঞ্চল তৈরি করা হয়েছে।

ছবির অংশ দ্বারা কভার করা এলাকা গণনা করার জন্য, আমরা ট্রানজিশন ইমেজ অবজেক্টে একটি অতিরিক্ত ব্যান্ড যোগ করব যা ee.Image.pixelArea পদ্ধতি ব্যবহার করে বর্গমিটারে প্রতিটি পিক্সেলের আকার শনাক্ত করে।

কোড এডিটর (জাভাস্ক্রিপ্ট)

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

ফলাফল হিসেবে পাওয়া ইমেজ অবজেক্ট (area_image_with_transition_class) হল একটি টু-ব্যান্ড ইমেজ যেখানে প্রথম ব্যান্ডে বর্গমিটার ইউনিটে এলাকার তথ্য থাকে (যা ee.Image.pixelArea পদ্ধতির মাধ্যমে তৈরি করা হয়) এবং দ্বিতীয় ব্যান্ডে ট্রানজিশন ক্লাস সংক্রান্ত তথ্য থাকে।

তারপর আমরা ee.Image.reduceRegion পদ্ধতি এবং একটি গ্রুপ করা রিডিউসার ব্যবহার করে আগ্রহের অঞ্চলের (roi) মধ্যে ক্লাস ট্রানজিশন সংক্ষিপ্ত করি যা প্রতিটি ট্রানজিশন ক্লাসের মধ্যে এলাকা যোগ করার জন্য কাজ করে:

কোড এডিটর (জাভাস্ক্রিপ্ট)

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" বিভাগের সবচেয়ে উপরে এইভাবে প্লেস করা যেতে পারে:

কোড এডিটর (জাভাস্ক্রিপ্ট)

//////////////////////////////////////////////////////////////
// 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 ফাংশনটি পাই চার্টের প্রত্যাশিত ফর্ম্যাট ব্যবহার করে ট্রানজিশন ক্লাসের সাথে সম্পর্কিত রঙের একটি তালিকা তৈরি করে।

এরপর, আমরা তালিকার প্রতিটি উপাদানে হেল্পার ফাংশন প্রয়োগ করার জন্য ee.List.map ব্যবহার করে তালিকার (roi_stats) প্রতিটি ডিকশনারিতে createFeature ফাংশন প্রয়োগ করব।

কোড এডিটর (জাভাস্ক্রিপ্ট)

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

গ্লোবাল সারফেস ওয়াটার ডেটাসেট সংক্রান্ত টিউটোরিয়াল এখানেই শেষ হল। মনে রাখবেন যে এই টিউটোরিয়ালে দেখানো হয়েছে যে কীভাবে মাত্র তিনটি ডেটা লেয়ার (ঘটনা, পরিবর্তনের তীব্রতা এবং ট্রানজিশন) নিয়ে কাজ করতে হয় যা গ্লোবাল সারফেস ওয়াটার ডেটাসেটে উপলভ্য। আপনি অন্যান্য ডেটা লেয়ার সম্পর্কে পড়তে পারেন যা ডেটা ব্যবহারকারীর নির্দেশিকা (v2)-তে উপলভ্য।

বিশ্লেষণ করে আনন্দ পান!