কার্যকরী প্রোগ্রামিং পরিচিতি
আর্থ ইঞ্জিন বিপুল সংখ্যক মেশিনে গণনা করার জন্য একটি সমান্তরাল প্রক্রিয়াকরণ ব্যবস্থা ব্যবহার করে। এই ধরনের প্রক্রিয়াকরণ সক্ষম করার জন্য, আর্থ ইঞ্জিন উল্লেখযোগ্য অপ্টিমাইজেশান এবং দক্ষতা লাভের জন্য সাধারণভাবে কার্যকরী ভাষার দ্বারা ব্যবহৃত মানক কৌশলগুলির সুবিধা নেয়, যেমন রেফারেন্সিয়াল স্বচ্ছতা এবং অলস মূল্যায়ন।
পদ্ধতিগত প্রোগ্রামিং ছাড়াও কার্যকরী প্রোগ্রামিং সেট করার প্রধান ধারণা হল পার্শ্বপ্রতিক্রিয়ার অনুপস্থিতি । এর মানে হল যে আপনি যে ফাংশনগুলি লেখেন সেগুলি ফাংশনের বাইরে থাকা ডেটার উপর নির্ভর করে না বা আপডেট করে না। আপনি নীচের উদাহরণগুলিতে দেখতে পাবেন, আপনার সমস্যার পুনর্গঠন করা সম্ভব যাতে এটি পার্শ্ব-প্রতিক্রিয়া ছাড়াই ফাংশন ব্যবহার করে সমাধান করা যায় - যা সমান্তরালভাবে চালানোর জন্য অনেক বেশি উপযুক্ত।
Loops জন্য
আর্থ ইঞ্জিনে ফর-লুপ ব্যবহার নিরুৎসাহিত করা হয়। map()
অপারেশন ব্যবহার করে একই ফলাফল অর্জন করা যেতে পারে যেখানে আপনি একটি ফাংশন নির্দিষ্ট করেন যা প্রতিটি উপাদানে স্বাধীনভাবে প্রয়োগ করা যেতে পারে। এটি সিস্টেমটিকে বিভিন্ন মেশিনে প্রক্রিয়াকরণ বিতরণ করতে দেয়।
নীচের উদাহরণটি ব্যাখ্যা করে যে আপনি কীভাবে সংখ্যার একটি তালিকা নেবেন এবং map()
ব্যবহার করে প্রতিটি সংখ্যার বর্গগুলির সাথে অন্য একটি তালিকা তৈরি করবেন: কোড এডিটর (জাভাস্ক্রিপ্ট)
// This generates a list of numbers from 1 to 10.
var myList = ee.List.sequence(1, 10);
// The map() operation takes a function that works on each element independently
// and returns a value. You define a function that can be applied to the input.
var computeSquares = function(number) {
// We define the operation using the EE API.
return ee.Number(number).pow(2);
};
// Apply your function to each item in the list by using the map() function.
var squares = myList.map(computeSquares);
print(squares); // [1, 4, 9, 16, 25, 36, 49, 64, 81]
যদি/অন্য শর্ত
পদ্ধতিগত প্রোগ্রামিং দৃষ্টান্তে অভ্যস্ত নতুন ব্যবহারকারীদের আরেকটি সাধারণ সমস্যা হল আর্থ ইঞ্জিনে if/else শর্তসাপেক্ষ অপারেটরগুলির যথাযথ ব্যবহার। যদিও, API একটি ee.Algorithms.If()
অ্যালগরিদম প্রদান করে, map()
এবং ফিল্টার ব্যবহার করে আরও কার্যকরী পদ্ধতির পক্ষে এটির ব্যবহারকে দৃঢ়ভাবে নিরুৎসাহিত করা হয়। আর্থ ইঞ্জিন ডিফার্ড এক্সিকিউশন ব্যবহার করে, যার অর্থ হল একটি এক্সপ্রেশনের মূল্যায়ন বিলম্বিত হয় যতক্ষণ না তার উপলব্ধি করা মূল্য আসলে প্রয়োজন হয়। কিছু ক্ষেত্রে, এই ধরনের এক্সিকিউশন মডেল একটি ee.Algorithms.If()
স্টেটমেন্টের সত্য এবং মিথ্যা উভয় বিকল্পেরই মূল্যায়ন করবে। এটি এক্সপ্রেশন এবং সেগুলি চালানোর জন্য প্রয়োজনীয় সংস্থানগুলির উপর নির্ভর করে অতিরিক্ত গণনা এবং মেমরি ব্যবহারের দিকে পরিচালিত করতে পারে।
বলুন আপনি উপরের উদাহরণের একটি বৈকল্পিক সমাধান করতে চান, যেখানে কাজটি শুধুমাত্র বিজোড় সংখ্যার বর্গ গণনা করা। যদি/অন্য শর্ত ছাড়াই এটি সমাধান করার জন্য একটি কার্যকরী পদ্ধতি, নীচে প্রদর্শিত হয়:
কোড এডিটর (জাভাস্ক্রিপ্ট)
// The following function determines if a number is even or odd. The mod(2) // function returns 0 if the number is even and 1 if it is odd (the remainder // after dividing by 2). The input is multiplied by this remainder so even // numbers get set to 0 and odd numbers are left unchanged. var getOddNumbers = function(number) { number = ee.Number(number); // Cast the input to a Number so we can use mod. var remainder = number.mod(2); return number.multiply(remainder); }; var newList = myList.map(getOddNumbers); // Remove the 0 values. var oddNumbers = newList.removeAll([0]); var squares = oddNumbers.map(computeSquares); print(squares); // [1, 9, 25, 49, 81]
সংগ্রহের সাথে কাজ করার সময় এই দৃষ্টান্তটি বিশেষভাবে প্রযোজ্য। আপনি যদি কিছু শর্তের উপর ভিত্তি করে সংগ্রহে একটি ভিন্ন অ্যালগরিদম প্রয়োগ করতে চান, পছন্দের উপায় হল প্রথমে শর্তের উপর ভিত্তি করে সংগ্রহটি ফিল্টার করা এবং তারপরে প্রতিটি উপসেটের জন্য একটি ভিন্ন ফাংশন map()
। এটি সিস্টেমটিকে অপারেশন সমান্তরাল করার অনুমতি দেয়। যেমন: কোড এডিটর (জাভাস্ক্রিপ্ট)
// Import Landsat 8 TOA collection and filter to 2018 images.
var collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA')
.filterDate('2018-01-01', '2019-01-01');
// Divide the collection into 2 subsets and apply a different algorithm on them.
var subset1 = collection.filter(ee.Filter.lt('SUN_ELEVATION', 40));
var subset2 = collection.filter(ee.Filter.gte('SUN_ELEVATION', 40));
// Multiply all images in subset1 collection by 2;
// do nothing to subset2 collection.
var processed1 = subset1.map(function(image) {
return image.multiply(2);
});
var processed2 = subset2;
// Merge the collections to get a single collection.
var final = processed1.merge(processed2);
print('Original collection size', collection.size());
print('Processed collection size', final.size());
ক্রমবর্ধমান পুনরাবৃত্তি
আপনাকে অনুক্রমিক অপারেশন করতে হতে পারে, যেখানে প্রতিটি পুনরাবৃত্তির ফলাফল পরবর্তী পুনরাবৃত্তি দ্বারা ব্যবহৃত হয়। আর্থ ইঞ্জিন এই ধরনের কাজের জন্য একটি iterate()
পদ্ধতি প্রদান করে। মনে রাখবেন যে iterate()
একটি ক্রমিক পদ্ধতিতে কার্যকর করা হয় এবং তাই বড় অপারেশনের জন্য ধীর হবে। এটি শুধুমাত্র তখনই ব্যবহার করুন যখন আপনি পছন্দসই আউটপুট অর্জন করতে map()
এবং ফিল্টার ব্যবহার করতে পারবেন না।
ফিবোনাচি সংখ্যা ক্রম তৈরির জন্য iterate()
এর একটি ভাল প্রদর্শন। এখানে, সিরিজের প্রতিটি সংখ্যা পূর্ববর্তী 2টি সংখ্যার সমষ্টি। iterate()
ফাংশনটি 2টি আর্গুমেন্ট, একটি ফাংশন (অ্যালগরিদম) এবং একটি প্রারম্ভিক মান নেয়। ফাংশনটি নিজেই 2টি মান, পুনরাবৃত্তির বর্তমান মান এবং পূর্ববর্তী পুনরাবৃত্তির ফলাফলে পাস করে। নিচের উদাহরণটি দেখায় কিভাবে আর্থ ইঞ্জিনে একটি ফিবোনাচি সিকোয়েন্স বাস্তবায়ন করা যায়।
কোড এডিটর (জাভাস্ক্রিপ্ট)
var algorithm = function(current, previous) { previous = ee.List(previous); var n1 = ee.Number(previous.get(-1)); var n2 = ee.Number(previous.get(-2)); return previous.add(n1.add(n2)); }; // Compute 10 iterations. var numIteration = ee.List.repeat(1, 10); var start = [0, 1]; var sequence = numIteration.iterate(algorithm, start); print(sequence); // [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
এখন যেহেতু আপনি জাভাস্ক্রিপ্ট ধারণাগুলি ভালভাবে বুঝতে পেরেছেন, আপনি আর্থ ইঞ্জিন API-এর ভূ-স্থানিক কার্যকারিতা সম্পর্কে একটি ভূমিকার জন্য API টিউটোরিয়ালটি দেখতে পারেন।