একটি চিত্র অঞ্চলের পরিসংখ্যান

reduceRegion

একটি ee.Image এর কোনো অঞ্চলের পিক্সেল মানের পরিসংখ্যান পেতে, image.reduceRegion() ব্যবহার করুন। এটি অঞ্চলটির সমস্ত পিক্সেলকে একটি পরিসংখ্যান বা পিক্সেল ডেটার অন্য কোনো সংক্ষিপ্ত উপস্থাপনায় (যেমন হিস্টোগ্রাম) রূপান্তরিত করে। অঞ্চলটিকে একটি Geometry হিসাবে উপস্থাপন করা হয়, যা অনেক পিক্সেল ধারণকারী একটি বহুভুজ হতে পারে, অথবা এটি একটি একক বিন্দুও হতে পারে, সেক্ষেত্রে অঞ্চলটিতে কেবল একটি পিক্সেল থাকবে। উভয় ক্ষেত্রেই, চিত্র ১-এ যেমন দেখানো হয়েছে, আউটপুটটি হলো অঞ্চলটির পিক্সেলগুলো থেকে প্রাপ্ত একটি পরিসংখ্যান।

রিডিউসরিজিওন ডায়াগ্রাম
চিত্র ১. একটি চিত্র এবং একটি অঞ্চলের উপর ee.Reducer প্রয়োগের একটি দৃষ্টান্ত।

reduceRegion() ব্যবহার করে কোনো ছবির একটি অঞ্চলের পিক্সেল পরিসংখ্যান পাওয়ার একটি উদাহরণ হিসেবে, সিয়েরা নেভাডা কনিফারাস ফরেস্টের (চিত্র ২-এ প্রদর্শিত) সীমানার মধ্যে একটি ৫-বছরের ল্যান্ডস্যাট কম্পোজিটের গড় স্পেকট্রাল মান নির্ণয় করার কথা বিবেচনা করুন:

// Load input imagery: Landsat 7 5-year composite.
var image = ee.Image('LANDSAT/LE7_TOA_5YEAR/2008_2012');

// Load an input region: Sierra Nevada.
var region = ee.Feature(ee.FeatureCollection('EPA/Ecoregions/2013/L3')
  .filter(ee.Filter.eq('us_l3name', 'Sierra Nevada'))
  .first());

// Reduce the region. The region parameter is the Feature geometry.
var meanDictionary = image.reduceRegion({
  reducer: ee.Reducer.mean(),
  geometry: region.geometry(),
  scale: 30,
  maxPixels: 1e9
});

// The result is a Dictionary.  Print it.
print(meanDictionary);

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

B1: 25.406029716816853
B2: 23.971497014238988
B3: 22.91059593763103
B4: 54.83164133293403
B5: 38.07655472573677
B6_VCID_2: 198.93216428012906
B7: 24.063261634961563
রিডিউসরিজিওন ডায়াগ্রাম
চিত্র ২। ক্যালিফোর্নিয়া ও নেভাডার ল্যান্ডস্যাট চিত্র তথ্যের ফলস কালার কম্পোজিট। যে অঞ্চলটিকে সংকুচিত করতে হবে, তা সাদা রঙে দেখানো হয়েছে।

লক্ষ্য করুন যে এই উদাহরণে, reducer ( ee.Reducer.mean() ), geometry ( region.geometry() ), scale (৩০ মিটার) এবং রিডিউসারে ইনপুট করার জন্য সর্বোচ্চ পিক্সেল সংখ্যার জন্য maxPixels প্রদান করে রিডাকশন নির্দিষ্ট করা হয়েছে। reduceRegion() কলে সর্বদা একটি স্কেল নির্দিষ্ট করা উচিত। এর কারণ হলো, জটিল প্রসেসিং ফ্লোতে, যেখানে বিভিন্ন স্কেলের নানা উৎস থেকে আসা ডেটা থাকতে পারে, সেখানে ইনপুট থেকে আউটপুটের স্কেল দ্ব্যর্থহীনভাবে নির্ধারণ করা যায় না। সেক্ষেত্রে, স্কেল ডিফল্টভাবে ১ ডিগ্রি হয়ে যায়, যা সাধারণত অসন্তোষজনক ফলাফল দেয়। আর্থ ইঞ্জিন কীভাবে স্কেল পরিচালনা করে সে সম্পর্কে আরও তথ্যের জন্য এই পৃষ্ঠাটি দেখুন।

স্কেল নির্ধারণ করার দুটি উপায় আছে: scale প্যারামিটার নির্দিষ্ট করে, অথবা একটি CRS এবং CRS ট্রান্সফর্ম নির্দিষ্ট করে। (CRS এবং CRS ট্রান্সফর্ম সম্পর্কে আরও তথ্যের জন্য শব্দকোষ দেখুন)। উদাহরণস্বরূপ, (উপরে উল্লিখিত) meanDictionary রিডাকশনটি নিম্নলিখিতটির সমতুল্য:

// As an alternative to specifying scale, specify a CRS and a CRS transform.
// Make this array by constructing a 4326 projection at 30 meters,
// then copying the bounds of the composite, from composite.projection().
var affine = [0.00026949458523585647, 0, -180, 0, -0.00026949458523585647, 86.0000269494563];

// Perform the reduction, print the result.
print(image.reduceRegion({
  reducer: ee.Reducer.mean(),
  geometry: region.geometry(),
  crs: 'EPSG:4326',
  crsTransform: affine,
  maxPixels: 1e9
}));

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

অঞ্চলের পিক্সেল

নির্দিষ্ট স্কেল এবং প্রজেকশনে প্রয়োগ করা নিম্নলিখিত নিয়ম অনুসারে পিক্সেলগুলিকে অঞ্চলের মধ্যে (এবং ওজনযুক্ত) নির্ধারণ করা হয়:

  • আনওয়েটেড রিডিউসার (যেমন ee.Reducer.count() বা ee.Reducer.mean().unweighted() ): পিক্সেলগুলো অন্তর্ভুক্ত করা হয় যদি তাদের সেন্ট্রয়েড নির্দিষ্ট অঞ্চলের মধ্যে থাকে এবং ছবিটির মাস্ক অশূন্য হয়।
  • ওয়েটেড রিডিউসার (যেমন ee.Reducer.mean() ): পিক্সেলগুলো অন্তর্ভুক্ত করা হয় যদি পিক্সেলটির অন্তত (আনুমানিক) ১/২৫৬ (~০.৪%) অংশ রিজিয়নের মধ্যে থাকে এবং ইমেজটির মাস্ক নন-জিরো হয়; এদের ওয়েট হলো ইমেজটির মাস্ক এবং রিজিয়ন দ্বারা আবৃত পিক্সেলের (আনুমানিক) ভগ্নাংশের মধ্যে সর্বনিম্নটি। পিক্সেল ইন্টারসেকশন ওয়েটগুলো অভ্যন্তরীণভাবে ৮-বিট পূর্ণসংখ্যা (০ থেকে ২৫৫) হিসাবে উপস্থাপিত হয়, যা ভগ্নাংশীয় কভারেজকে ২৫৬টি স্বতন্ত্র স্তরে কোয়ান্টাইজ করে।

গণনা সফল করার জন্য maxPixels প্যারামিটারটি প্রয়োজন। উদাহরণ থেকে এই প্যারামিটারটি বাদ দিলে একটি ত্রুটি প্রদর্শিত হয়, যা দেখতে অনেকটা এইরকম:

এই ত্রুটিগুলো এড়ানোর জন্য একাধিক উপায় আছে: উদাহরণের মতো maxPixels বাড়ানো, scale বাড়ানো, অথবা bestEffort true সেট করা, যা স্বয়ংক্রিয়ভাবে একটি নতুন (বৃহত্তর) স্কেল গণনা করে যাতে maxPixels অতিক্রম না করে। আপনি যদি maxPixels নির্দিষ্ট না করেন, তাহলে ডিফল্ট মান ব্যবহৃত হয়।