इमेज के किसी हिस्से के आंकड़े

reduceRegion

किसी ee.Image के किसी क्षेत्र में पिक्सल वैल्यू के आंकड़े पाने के लिए, image.reduceRegion() का इस्तेमाल करें. इससे क्षेत्र के सभी पिक्सल को किसी आंकड़े या क्षेत्र में मौजूद पिक्सल डेटा के अन्य कॉम्पैक्ट वर्शन (जैसे, हिस्टोग्राम) में बदल दिया जाता है. रीजन को Geometry के तौर पर दिखाया जाता है. यह कई पिक्सल वाला पॉलीगॉन हो सकता है या एक पॉइंट हो सकता है. अगर यह एक पॉइंट है, तो रीजन में सिर्फ़ एक पिक्सल होगा. दोनों ही मामलों में, पहली इमेज में दिखाए गए तरीके से, आउटपुट के तौर पर क्षेत्र के पिक्सल से मिली जानकारी मिलती है.

reduceRegion डायग्राम
पहली इमेज. इमेज में, किसी इमेज और उसके हिस्से पर ee.Reducer का इस्तेमाल दिखाया गया है.

reduceRegion() का इस्तेमाल करके, किसी इमेज के क्षेत्र में पिक्सल के आंकड़े पाने का उदाहरण यहां दिया गया है. इसमें, सिएरा नेवादा के शंकुधारी वन की सीमाओं के अंदर, पांच साल के Landsat कंपोज़िट की औसत स्पेक्ट्रल वैल्यू का पता लगाया गया है. इसे इमेज 2 में दिखाया गया है:

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

कैलकुलेशन को फ़ोर्स करने के लिए, नतीजे को प्रिंट करना काफ़ी है. Code Editor, इसे कंसोल में Dictionary के तौर पर दिखाएगा. आउटपुट कुछ ऐसा दिखना चाहिए:

B1: 25.406029716816853
B2: 23.971497014238988
B3: 22.91059593763103
B4: 54.83164133293403
B5: 38.07655472573677
B6_VCID_2: 198.93216428012906
B7: 24.063261634961563
reduceRegion डायग्राम
दूसरी इमेज. कैलिफ़ोर्निया और नेवाडा के लिए, लैंडसैट इमेज डेटा का फ़ॉल्स कलर कंपोज़िट. जिस हिस्से की रोशनी कम करनी है उसे सफ़ेद रंग में दिखाया गया है.

ध्यान दें कि इस उदाहरण में, reducer (ee.Reducer.mean()), geometry (region.geometry()), scale (30 मीटर), और रिड्यूसर में इनपुट किए जाने वाले पिक्सल की ज़्यादा से ज़्यादा संख्या के लिए maxPixels की वैल्यू देकर, रिडक्शन तय किया गया है. reduceRegion() कॉल में हमेशा स्केल के बारे में बताना चाहिए. ऐसा इसलिए होता है, क्योंकि कॉम्प्लेक्स प्रोसेसिंग फ़्लो में अलग-अलग सोर्स से अलग-अलग स्केल का डेटा शामिल हो सकता है. ऐसे में, इनपुट से आउटपुट के स्केल का पता नहीं चल पाएगा. ऐसे में, स्केल डिफ़ॉल्ट रूप से 1 डिग्री पर सेट हो जाता है. इससे आम तौर पर, संतोषजनक नतीजे नहीं मिलते. Earth Engine, स्केल को कैसे मैनेज करता है, इस बारे में ज़्यादा जानने के लिए यह पेज देखें.

स्केल सेट करने के दो तरीके हैं: scale पैरामीटर की वैल्यू सेट करके या सीआरएस और सीआरएस ट्रांसफ़ॉर्म की वैल्यू सेट करके. (सीआरएस और सीआरएस ट्रांसफ़ॉर्म के बारे में ज़्यादा जानकारी के लिए, ग्लॉसरी देखें). उदाहरण के लिए, ऊपर दी गई 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
}));

आम तौर पर, स्केल तय करना काफ़ी होता है. इससे कोड को आसानी से समझा जा सकता है. Earth Engine, क्षेत्र को पहले रास्टर में बदलता है. इसके बाद, यह तय करता है कि रिड्यूसर में किन पिक्सल को इनपुट करना है. अगर सीआरएस के बिना स्केल तय किया जाता है, तो इमेज के नेटिव प्रोजेक्शन में क्षेत्र को रास्टर किया जाता है. इसे तय किए गए रिज़ॉल्यूशन के हिसाब से स्केल किया जाता है. अगर सीआरएस और स्केल, दोनों की जानकारी दी गई है, तो क्षेत्र को इनके आधार पर रास्टर किया जाता है.

इस इलाके में मौजूद पिक्सल

पिक्सेल को इन नियमों के हिसाब से, इलाके में मौजूद माना जाता है और उनका वज़न तय किया जाता है. ये नियम, तय किए गए स्केल और प्रोजेक्शन पर लागू होते हैं:

  • बिना वज़न वाले रिड्यूसर (जैसे, ee.Reducer.count() या ee.Reducer.mean().unweighted()): पिक्सल तब शामिल किए जाते हैं, जब उनका सेंट्रॉइड क्षेत्र में हो और इमेज का मास्क शून्य न हो.
  • वेटेड रिड्यूसर (जैसे, ee.Reducer.mean()): अगर पिक्सल का कम से कम (लगभग) 1/256 (~0.4%) हिस्सा क्षेत्र में है, तो पिक्सल शामिल किए जाते हैं. साथ ही, इमेज का मास्क शून्य नहीं होना चाहिए.इनका वज़न, इमेज के मास्क और क्षेत्र से कवर किए गए पिक्सल के (लगभग) हिस्से में से कम होता है. पिक्सल इंटरसेक्शन के वेट को अंदरूनी तौर पर 8-बिट पूर्णांक (0 से 255) के तौर पर दिखाया जाता है. इससे, फ़्रैक्शनल कवरेज को 256 अलग-अलग लेवल में बांटा जाता है.

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

इन गड़बड़ियों को ठीक करने के लिए कई विकल्प हैं: maxPixels को बढ़ाएं. उदाहरण के तौर पर, scale को बढ़ाएं या bestEffort को सही पर सेट करें. इससे अपने-आप एक नया (बड़ा) स्केल कैलकुलेट हो जाएगा, ताकि maxPixels से ज़्यादा न हो. अगर आपने maxPixels एट्रिब्यूट की वैल्यू नहीं दी है, तो डिफ़ॉल्ट वैल्यू का इस्तेमाल किया जाता है.