पानी की क्लास का ट्रांज़िशन

वॉटर ट्रांज़िशन लेयर, पानी की मौजूदगी की तीन कैटगरी (पानी नहीं है, मौसमी पानी, और स्थायी पानी) के बीच होने वाले बदलावों को कैप्चर करती है. साथ ही, इसमें कुछ समय के लिए मौजूद रहने वाले पानी की दो अतिरिक्त कैटगरी (कुछ समय के लिए मौजूद रहने वाला स्थायी पानी और कुछ समय के लिए मौजूद रहने वाला मौसमी पानी) भी शामिल हैं.

ट्यूटोरियल के इस सेक्शन में:

  1. पानी के ट्रांज़िशन को विज़ुअलाइज़ करने के लिए, मैप लेयर जोड़ें,
  2. किसी खास इलाके में, हर ट्रांज़िशन क्लास के एरिया को जोड़ने के लिए, ग्रुप किया गया रिड्यूसर बनाएं. साथ ही,
  3. एक ऐसा चार्ट बनाओ जिसमें ट्रांज़िशन क्लास के हिसाब से, इलाके की खास जानकारी दी गई हो.

बेसिक विज़ुअलाइज़ेशन

स्क्रिप्ट के ऐसेट लिस्ट सेक्शन में, यह स्टेटमेंट जोड़ें. इससे transition नाम का एक सिंगल बैंड इमेज ऑब्जेक्ट बनता है:

कोड एडिटर (JavaScript)

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

GSW इमेज में, ट्रांज़िशन क्लास के नंबर और नाम का मेटाडेटा होता है. साथ ही, ट्रांज़िशन क्लास को स्टाइल करने के लिए, डिफ़ॉल्ट पैलेट होता है. मैप में ट्रांज़िशन लेयर जोड़ने पर, विज़ुअलाइज़ेशन के ये पैरामीटर अपने-आप इस्तेमाल हो जाएंगे.

अपनी स्क्रिप्ट के मैप लेयर सेक्शन में सबसे नीचे, यह स्टेटमेंट जोड़ें. इससे एक नई मैप लेयर जुड़ जाएगी, जो ट्रांज़िशन क्लास दिखाती है:

कोड एडिटर (JavaScript)

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 कुछ समय के लिए उपलब्ध मौसमी प्रॉडक्ट

ट्रांज़िशन क्लास के हिसाब से, क्षेत्रफल की खास जानकारी

इस सेक्शन में, हम दिलचस्पी के क्षेत्र को तय करने के लिए, फिर से ज्यामिति पॉलीगॉन टूल का इस्तेमाल करेंगे. अगर आपको किसी नई जगह का विश्लेषण करना है, तो पहले उस ओरिजनल पॉलीगॉन को चुनें और मिटाएं जिसे आपने ड्रॉ किया था. इससे आपको दोनों जगहों के मिले-जुले नतीजे नहीं मिलेंगे. ज्यामिति में बदलाव करने का तरीका जानने के लिए, कोड एडिटर के दस्तावेज़ों में ज्यामिति टूल सेक्शन देखें.

इस उदाहरण के लिए, हम मेकांग नदी के डेल्टा में एक नया पॉलीगॉन बनाएंगे.

आरओआई के साथ ट्रांज़िशन क्लास
11वीं इमेज. वियतनाम में मेकॉन्ग नदी का डेल्टा. इसमें कोड एडिटर के पॉलीगॉन ड्रॉइंग टूल का इस्तेमाल करके, दिलचस्पी वाला इलाका बनाया गया है.

इमेज के कुछ हिस्सों से कवर किए गए इलाके का हिसाब लगाने के लिए, हम ट्रांज़िशन इमेज ऑब्जेक्ट में एक और बैंड जोड़ेंगे. यह बैंड, ee.Image.pixelArea तरीके का इस्तेमाल करके, हर पिक्सल के साइज़ की पहचान वर्ग मीटर में करता है.

कोड एडिटर (JavaScript)

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

इससे मिलने वाला इमेज ऑब्जेक्ट (area_image_with_transition_class) दो बैंड वाली इमेज है. इसमें पहले बैंड में, वर्ग मीटर की इकाइयों में इलाके की जानकारी होती है. यह जानकारी, ee.Image.pixelArea तरीके से जनरेट होती है. वहीं, दूसरे बैंड में ट्रांज़िशन क्लास की जानकारी होती है.

इसके बाद, हम ee.Image.reduceRegion तरीके और ग्रुप किए गए रिड्यूसर का इस्तेमाल करके, दिलचस्पी वाले इलाके (roi) में क्लास ट्रांज़िशन की खास जानकारी देते हैं. यह रिड्यूसर, हर ट्रांज़िशन क्लास के अंदर मौजूद इलाके का योग करता है:

कोड एडिटर (JavaScript)

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 दिखता है. ध्यान दें कि इलाके की खास जानकारी का डेटा देखने के लिए, आपको ट्री को कुछ लेवल तक बड़ा करना होगा.

ग्रुप किए गए रिडक्शन के नतीजे
इमेज 12. Console टैब का आउटपुट, जिसमें ग्रुप किए गए रिडक्शन के नतीजे दिख रहे हैं.

reduction_results ऑब्जेक्ट में, हर ट्रांज़िशन क्लास के तहत आने वाले इलाके की जानकारी होती है. हालांकि, इसे पढ़ना आसान नहीं होता. अगले सेक्शन में, हम नतीजों को देखना आसान बनाएंगे.

खास जानकारी वाला चार्ट बनाना

इस सेक्शन में, हम नतीजों को बेहतर तरीके से समझने के लिए एक चार्ट बनाएंगे. शुरू करने के लिए, हम सबसे पहले ट्रांज़िशन क्लास की सूची को उनके एरिया के हिसाब से अलग करते हैं:

कोड एडिटर (JavaScript)

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

ग्रुप किए गए रिड्यूसर (reduction_results) का नतीजा, एक डिक्शनरी होती है. इसमें डिक्शनरी की एक सूची होती है. हर ट्रांज़िशन क्लास के लिए, सूची में एक डिक्शनरी होती है. ये स्टेटमेंट, उस डिक्शनरी से ग्रुप किए गए रिड्यूसर के नतीजों को निकालने के लिए, ee.Dictionary.get तरीके का इस्तेमाल करते हैं. साथ ही, नतीजों को ee.List डेटा टाइप में कास्ट करते हैं, ताकि हम अलग-अलग डिक्शनरी को ऐक्सेस कर सकें.

कोड एडिटर के चार्टिंग फ़ंक्शन का इस्तेमाल करने के लिए, हम एक FeatureCollection बनाएंगे. इसमें ज़रूरी जानकारी शामिल होगी. इसके लिए, हम सबसे पहले दो लुकअप डिक्शनरी और दो हेल्पर फ़ंक्शन बनाते हैं. लुकअप डिक्शनरी बनाने वाले कोड को "कैलकुलेशन" सेक्शन में सबसे ऊपर रखा जा सकता है. इसके लिए, यह तरीका अपनाएं:

कोड एडिटर (JavaScript)

//////////////////////////////////////////////////////////////
// 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 डिक्शनरी, ट्रांज़िशन क्लास की वैल्यू को कलर की परिभाषाओं से जोड़ती है.

इन दोनों हेल्पर फ़ंक्शन को "हेल्पर फ़ंक्शन" नाम के नए कोड सेक्शन में रखा जा सकता है.

कोड एडिटर (JavaScript)

//////////////////////////////////////////////////////////////
// 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 फ़ंक्शन, ट्रांज़िशन क्लास से जुड़े रंगों की सूची बनाता है. इसके लिए, वह पाई चार्ट के लिए तय किए गए फ़ॉर्मैट का इस्तेमाल करता है.

इसके बाद, हम सूची (roi_stats) में मौजूद हर डिक्शनरी पर createFeature फ़ंक्शन लागू करेंगे. इसके लिए, हम ee.List.map का इस्तेमाल करेंगे, ताकि सूची के हर एलिमेंट पर हेल्पर फ़ंक्शन लागू किया जा सके.

कोड एडिटर (JavaScript)

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

अब हमारे पास एक FeatureCollection है, जिसमें वे एट्रिब्यूट शामिल हैं जिन्हें हमें चार्ट पर दिखाना है. इसलिए, हम एक चार्ट ऑब्जेक्ट बना सकते हैं और उसे कंसोल पर प्रिंट कर सकते हैं.

कोड एडिटर (JavaScript)

// 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 विकल्प, छोटे स्लाइस को "अन्य" कैटगरी में एक साथ ग्रुप करने से रोकता है. इससे मिलने वाला चार्ट, इमेज 13 में दिखाए गए चार्ट जैसा होना चाहिए.

पानी के ट्रांज़िशन की क्लास की खास जानकारी वाला चार्ट
13वीं इमेज. पानी के ट्रांज़िशन की कैटगरी के साइज़ की खास जानकारी देने वाला चार्ट.

फ़ाइनल स्क्रिप्ट

इस सेक्शन की पूरी स्क्रिप्ट यहां दी गई है:

कोड एडिटर (JavaScript)

//////////////////////////////////////////////////////////////
// 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) में, उपलब्ध अन्य डेटा लेयर के बारे में पढ़ा जा सकता है.

डेटा का विश्लेषण करने के लिए शुभकामनाएं!