জলের ঘটনা (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);

প্রথম বিবৃতিটি GSW ডেটাসেটের জন্য আর্থ ইঞ্জিন ইমেজ অবজেক্টকে উল্লেখ করে এবং এটিকে gsw নামে একটি পরিবর্তনশীলে সংরক্ষণ করে। দ্বিতীয় বিবৃতিটি GSW ডেটাসেটের একটি একক স্তর নির্বাচন করে, এবং এটিকে occurrence নামক একটি ভেরিয়েবলে সংরক্ষণ করে। তৃতীয় বিবৃতিটি কোড এডিটরের ইন্টারেক্টিভ মানচিত্রে ঘটনার চিত্র যোগ করে।

কোড এডিটরের "রান" বোতামে ক্লিক করুন, এবং কয়েক সেকেন্ড পরে আপনি চিত্র 1 এর মতো উপকূলরেখা বরাবর ধূসর রঙের একটি মানচিত্র দেখতে পাবেন।

ডিফল্ট ভিজ্যুয়ালাইজেশন
চিত্র 1. গ্লোবাল সারফেস ওয়াটার সংঘটন ডেটা লেয়ারের ডিফল্ট ভিজ্যুয়ালাইজেশন।

বেশির ভাগ এলাকায়, GSW ডেটাসেট স্বচ্ছ বলে মনে হয়, কারণ যেখানে ল্যান্ডস্যাটের ছবি সংগ্রহ করা হয়নি (অর্থাৎ সমুদ্রের এলাকা) অথবা যেখানে 32 বছরে কোনো পর্যবেক্ষণ দ্বারা জল সনাক্ত করা যায়নি সেগুলিকে মুখোশ করা হয়েছে

মান পরিদর্শন

জলের ঘটনা স্তরের মানগুলি অন্বেষণ করতে, আমরা কোড এডিটরের পরিদর্শক ট্যাবটি ব্যবহার করব। প্রথমে পরিদর্শক ট্যাবে ক্লিক করুন, তারপর একটি অবস্থান নির্বাচন করতে মানচিত্রে ক্লিক করুন। পরিদর্শক ট্যাবটি আপনি যেখানে ক্লিক করেছেন সেখানে উপস্থিত প্রতিটি স্তরের তথ্য প্রদর্শন করবে।

পরিদর্শক ট্যাব
চিত্র 2. উদাহরণ ইন্সপেক্টর ট্যাব আউটপুট।

উপরের উদাহরণে, value নামক স্তরটির মান হল 98৷ এককগুলি শতাংশ পয়েন্ট, তাই প্রায় 98% সময় অবস্থানটিকে জল আচ্ছাদিত হিসাবে শ্রেণীবদ্ধ করা হয়েছিল৷ মান হল প্রতিটি মাসিক পৃষ্ঠের জলের সংঘটন মানের গড়, যা ঋতুগত পরিবর্তনের বিরুদ্ধে স্বাভাবিক করে তোলে, যেমন ডেটা ব্যবহারকারী নির্দেশিকা (v2) এ বর্ণিত হয়েছে।

আপনার কোড উন্নত করতে রিফ্যাক্টরিং

আমাদের স্ক্রিপ্টে শুধুমাত্র দুটি বিবৃতি রয়েছে, কিন্তু ইতিমধ্যে আমাদের কাছে কোডটি রিফ্যাক্টর করার সুযোগ রয়েছে যাতে আমাদের চূড়ান্ত স্ক্রিপ্টটি সময়ের সাথে পড়া এবং বজায় রাখা সহজ হয়। বর্তমানে, Map.addLayer() স্টেটমেন্ট একটি একক আর্গুমেন্ট occurrence পাস করে, যা আর্থ ইঞ্জিন ইমেজ অবজেক্ট যা আমরা মানচিত্রে প্রদর্শন করতে চাই। যাইহোক, Map.addLayer() পদ্ধতি এটিতে অতিরিক্ত আর্গুমেন্ট পাস করার অনুমতি দেয়। কি আর্গুমেন্ট পাওয়া যায় তা দ্রুত দেখতে, খোলার বন্ধনীর পরে আপনার কার্সার রাখুন এবং addLayer পদ্ধতির জন্য সহায়তা নথিটি আনতে "কোড পরামর্শ দেখান" এর জন্য কীবোর্ড শর্টকাট টিপুন। (কিবোর্ড শর্টকাট মেনু সাহায্য -> শর্টকাট নির্বাচন করে দেখা যেতে পারে.)

Map.addLayer আর্গুমেন্ট
চিত্র 3. স্ক্রিনশট অ্যাড লেয়ার পদ্ধতির আর্গুমেন্ট দেখাচ্ছে।

কীবোর্ড শর্টকাটগুলি দেখায় যে পাঁচটি আর্গুমেন্ট রয়েছে যা 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 এ সঞ্চিত ভিজ্যুয়ালাইজেশন প্যারামিটারগুলি নির্দেশ করে যে লাল ন্যূনতম 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
});

পরবর্তী বিভাগে , আপনি সময়ের সাথে সাথে কীভাবে জলের ঘটনা পরিবর্তিত হয়েছে তা অন্বেষণ করবেন।