জলের উপস্থিতি (১৯৮৪-২০১৫)

GSW ডেটাসেটে অনেক ডেটা লেয়ার থাকে যা বিভিন্ন উপায়ে ভূপৃষ্ঠের জলের ডেটা উপস্থাপন করে। আমরা জল জমা হওয়ার লেয়ার ভিজ্যুয়ালাইজ করার মাধ্যমে শুরু করব, যা মার্চ ১৯৮৪ থেকে অক্টোবর ২০১৫ পর্যন্ত সম্পূর্ণ সময়সীমা জুড়ে কোথায় এবং কত ঘনঘন ভূপৃষ্ঠে জল জমা হয়েছে তার সারসংক্ষেপ প্রদান করে।

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

  1. সারফেস ওয়াটার অকারেন্স ভিজ্যুয়ালাইজ করার জন্য ম্যাপ লেয়ার যোগ করুন,
  2. ম্যাপ লেয়ারের ভ্যালু কীভাবে কোয়েরি করতে হয় তা দেখান,
  3. ভিজ্যুয়ালাইজেশন উন্নত করতে কাস্টম স্টাইলিং যোগ করুন,
  4. থ্রেশহোল্ড ভ্যালু ব্যবহার করে বাইনারি ওয়াটার মাস্ক লেয়ার তৈরি করো,
  5. পৃথিবীর আকর্ষণীয় অংশগুলি ম্যাপের কেন্দ্রে নিয়ে আসুন এবং
  6. স্ক্রিপ্টটি আরও সহজে পড়া ও ম্যানেজ করার জন্য কীভাবে রিফ্যাক্টর করতে হবে তা দেখাও।

প্রাথমিক ভিজ্যুয়ালাইজেশন তৈরি করা

কোড এডিটরে নিম্নলিখিত স্টেটমেন্ট কপি করে শুরু করুন:

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

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

প্রথম স্টেটমেন্ট GSW ডেটাসেটের জন্য Earth Engine ইমেজ অবজেক্ট রেফার করে এবং gsw নামের ভেরিয়েবলে এটি স্টোর করে। দ্বিতীয় স্টেটমেন্ট GSW ডেটাসেটের একটি লেয়ার বেছে নেয় এবং occurrence নামক ভেরিয়েবলে এটি স্টোর করে। তৃতীয় স্টেটমেন্টটি কোড এডিটরের ইন্টার‍্যাক্টিভ ম্যাপে অকারেন্স ইমেজ যোগ করে।

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

ডিফল্ট ভিজ্যুয়ালাইজেশন
ছবি ১. গ্লোবাল সারফেস ওয়াটার অকারেন্স ডেটা লেয়ারের ডিফল্ট ভিজ্যুয়ালাইজেশন।

বেশিরভাগ অঞ্চলে, GSW ডেটাসেট স্বচ্ছ দেখায়, কারণ যেসব লোকেশনে Landsat ছবি সংগ্রহ করা হয়নি (যেমন, সমুদ্র অঞ্চল) বা যেখানে ৩২ বছরে কোনও পর্যবেক্ষণে জল শনাক্ত করা হয়নি, সেগুলি মাস্ক করা হয়েছে।

ভ্যালু পরীক্ষা করা হচ্ছে

জলের উপস্থিতি সংক্রান্ত লেয়ারের ভ্যালু এক্সপ্লোর করতে, আমরা কোড এডিটরের ইন্সপেক্টর ট্যাব ব্যবহার করব। প্রথমে ইন্সপেক্টর ট্যাবে ক্লিক করুন, তারপর লোকেশন বেছে নিতে ম্যাপে ক্লিক করুন। আপনি যেখানে ক্লিক করেছেন সেখানে উপস্থিত প্রতিটি লেয়ারের তথ্য ইন্সপেক্টর ট্যাবে দেখানো হবে।

ইনস্পেক্টর ট্যাব
ছবি ২. ইন্সপেক্টর ট্যাবের আউটপুটের উদাহরণ।

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

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

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

Map.addLayer আর্গুমেন্ট
ছবি ৩. addLayer মেথডের আর্গুমেন্ট দেখানো স্ক্রিনশট।

কীবোর্ড শর্টকাট থেকে দেখা যায় যে পাঁচটি আর্গুমেন্ট আছে যা 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-এ স্টোর করা ভিজ্যুয়ালাইজেশন প্যারামিটার নির্দেশ করে যে ন্যূনতম ০% ভ্যালুর জন্য লাল এবং সর্বাধিক ১০০% ভ্যালুর জন্য নীল রঙ ব্যবহার করা উচিত। .updateMask(occurrence.divide(100)) যোগ করার ফলে ঘটনার ভ্যালুর উপর ভিত্তি করে পিক্সেলের অস্বচ্ছতা/স্বচ্ছতা সেট করা হয়।

স্ক্রিপ্টটি আবার রান করুন এবং আমাদের স্টাইলিং পরিবর্তনের সংশোধিত ফলাফল দেখুন।

সারফেস ওয়াটার অকারেন্স
ছবি ৪. বুয়েনস আইরেসের কাছে পারানা ডেল্টার জন্য জলের উপস্থিতির স্ক্রিনশট, যেখানে ০% ন্যূনতম মানের এন্ডপয়েন্টের জন্য স্বচ্ছ লাল রঙ এবং সর্বোচ্চ মানের এন্ডপয়েন্টের জন্য সলিড নীল রঙ ব্যবহার করা হয়েছে।

জলাশয়গুলি এখন নীল রঙের! প্রোগ্রেস!

থ্রেশহোল্ড লেয়ার তৈরি করা

জলের উপস্থিতি সংক্রান্ত ছবিতে ০ থেকে ১০০% পর্যন্ত রেঞ্জ ব্যবহার করে কত ঘনঘন জল পাওয়া যেতে পারে সেই সংক্রান্ত তথ্য থাকে। তবে, বাইনারি ওয়াটার লেয়ার সংজ্ঞায়িত করা প্রায়শই উপযোগী হয় (যেমন, "জল" বনাম "জল নয়") শ্রেণীবদ্ধ করা হয়। আমরা এই সাধারণ বাইনারি লেয়ারটি একটি পরিষ্কার ব্যাকগ্রাউন্ড লেয়ার হিসেবে ব্যবহার করব যার উপরে অন্যান্য GSW লেয়ার রাখা যেতে পারে। নিম্নলিখিত স্টেটমেন্ট ব্যবহার করে এই থ্রেশহোল্ড লেয়ার তৈরি করা যেতে পারে, যা জল ও জল নয় এমন অংশ আলাদা করতে ৯০% থ্রেশহোল্ড ভ্যালু ব্যবহার করে।

প্রথমে আমরা ওয়াটার মাস্কের স্টাইলিং সংক্রান্ত তথ্য রাখার জন্য একটি নতুন ভিজ্যুয়ালাইজেশন ভেরিয়েবল 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'
});
৯০% ওয়াটার মাস্ক
ছবি ৫. বুয়েনস আইরেসের কাছে পারানা ডেল্টার জন্য ৯০% ওয়াটার মাস্কের স্ক্রিনশট।

পৃথিবীর আকর্ষণীয় জায়গায় যাওয়া

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

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

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

পরবর্তী বিভাগে, আপনি এক্সপ্লোর করতে পারবেন যে সময়ের সাথে সাথে জলের উপস্থিতি কীভাবে পরিবর্তিত হয়েছে।