Earth Engine को इस तरह से डिज़ाइन किया गया है कि कंप्यूटेशन करते समय, आपको मैप प्रोजेक्शन के बारे में शायद ही कभी चिंता करनी पड़े. स्केल की तरह, प्रोजेक्शन जिसमें कंप्यूटेशन होता है, उसे "पुल" के आधार पर तय किया जाता है. खास तौर पर, आउटपुट प्रोजेक्शन में इनपुट का अनुरोध किया जाता है. आउटपुट, फ़ंक्शन पैरामीटर (जैसे कि crs), कोड एडिटर और geemap मैप ऑब्जेक्ट (जिनमें maps mercator (EPSG:3857) प्रोजेक्शन होता है) या reproject() कॉल से तय किया जा सकता है. Code Editor या geemap में इमेज दिखाते समय, maps mercator में इनपुट का अनुरोध किया जाता है. MODIS इमेज पर की गई इस कार्रवाई पर विचार करें. इस इमेज में साइनसोडल प्रोजेक्शन है:
कोड एडिटर (JavaScript)
// The input image has a SR-ORG:6974 (sinusoidal) projection. var image = ee.Image('MODIS/061/MOD13A1/2014_05_09').select(0); // Normalize the image and add it to the map. var rescaled = image.unitScale(-2000, 10000); var visParams = {min: 0.15, max: 0.7}; Map.addLayer(rescaled, visParams, 'Rescaled');
import ee import geemap.core as geemap
Colab (Python)
# The input image has a SR-ORG:6974 (sinusoidal) projection. image = ee.Image('MODIS/061/MOD13A1/2014_05_09').select(0) # Normalize the image and add it to the map. rescaled = image.unitScale(-2000, 10000) vis_params = {'min': 0.15, 'max': 0.7} m = geemap.Map() m.add_layer(rescaled, vis_params, 'Rescaled') m
इस कोड सैंपल के लिए, ऑपरेशन के क्रम को पहले डायग्राम में दिखाया गया है. ध्यान दें कि इनपुट का प्रोजेक्शन, आउटपुट से तय होता है. खास तौर पर, Code Editor में मैप डिसप्ले के maps mercator प्रोजेक्शन से. यह प्रोजेक्शन, इस तरह से ऑपरेशंस के क्रम में वापस फैलता है कि इनपुट को मैप्स मरकेटर में अनुरोध किया जाता है. साथ ही, मैप के ज़ूम लेवल से तय किए गए स्केल पर अनुरोध किया जाता है.
Earth Engine में, प्रोजेक्शन को कोऑर्डिनेट रेफ़रंस सिस्टम (सीआरएस या कई तरीकों का crs पैरामीटर) के ज़रिए तय किया जाता है. किसी इमेज के प्रोजेक्शन की जांच करने के लिए, उस पर projection() को कॉल करें:
कोड एडिटर (JavaScript)
var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318').select(0); print('Projection, crs, and crs_transform:', image.projection()); print('Scale in meters:', image.projection().nominalScale());
import ee import geemap.core as geemap
Colab (Python)
image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318').select(0) display('Projection, crs, and crs_transform:', image.projection()) display('Scale in meters:', image.projection().nominalScale())
ध्यान दें कि projection() से मिले ee.Projection पर nominalScale() को कॉल करके, इमेज के नेटिव रिज़ॉल्यूशन का पता लगाया जा सकता है. नेटिव रिज़ॉल्यूशन, इमेज पिरामिड के सबसे निचले लेवल का मीटर में नॉमिनल पिक्सल स्केल होता है. किसी इमेज के हर बैंड का स्केल और/या प्रोजेक्शन अलग-अलग हो सकता है. इसलिए, अगर आपने ऐसी इमेज पर projection() फ़ंक्शन कॉल किया है जिसमें कम से कम एक बैंड का प्रोजेक्शन, अन्य बैंड के प्रोजेक्शन से अलग है, तो आपको यह गड़बड़ी दिख सकती है:
डिफ़ॉल्ट प्रोजेक्शन
अगर आपको किसी खास प्रोजेक्शन में कंप्यूटेशन की ज़रूरत नहीं है, तो आम तौर पर प्रोजेक्शन तय करने की ज़रूरत नहीं होती है. सिर्फ़ ऐसे आउटपुट के लिए, Earth Engine को प्रोजेक्शन और/या स्केल की जानकारी की ज़रूरत होगी जो साफ़ तौर पर समझ में नहीं आता. अस्पष्टता की समस्या इन वजहों से हो सकती है:
अलग-अलग प्रोजेक्शन वाली इमेज वाले ImageCollection को छोटा करने से
(जैसे, कंपोज़िट इमेज बनाना). अलग-अलग प्रोजेक्शन वाली इनपुट इमेज से बनी कंपोज़िट या मोज़ेक इमेज में डिफ़ॉल्ट प्रोजेक्शन होगा. यह WGS84 प्रोजेक्शन होगा, जिसका स्केल 1 डिग्री होगा.
उदाहरण के लिए:
कोड एडिटर (JavaScript)
var collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA'); var mosaic = collection.filterDate('2018-01-01', '2019-01-01').mosaic(); print(mosaic.projection());
import ee import geemap.core as geemap
Colab (Python)
collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA') mosaic = collection.filterDate('2018-01-01', '2019-01-01').mosaic() display(mosaic.projection())
अगर इस तरह की इमेज का इस्तेमाल किसी कैलकुलेशन में किया जाता है, तो आपको यह गड़बड़ी दिख सकती है:
आम तौर पर, एक डिग्री के स्केल पर एग्रीगेशन नहीं किया जाता. इसलिए, Earth Engine आपको यह सूचना देता है, ताकि आप आउटपुट के लिए पूरी जानकारी दे सकें.
उपयोगकर्ताओं को अक्सर यह व्यवहार भ्रमित करने वाला लगता है. साथ ही, वे "खोई हुई" प्रोजेक्शन की जानकारी के बारे में चिंता करते हैं. हालांकि, पिक्सल की गणना तब तक नहीं की जाती, जब तक उनकी ज़रूरत न हो (ज़्यादा जानें). इसके अलावा, उस समय हमेशा एक आउटपुट प्रोजेक्शन होता है, जो उस अनुरोध के साथ होता है जिसमें कंपोज़िट की गणना करने का तरीका बताया गया होता है.
ज़्यादातर मामलों में, अनुमान न होने से कोई समस्या नहीं होती. यह एक अहम ऑप्टिमाइज़ेशन है, क्योंकि इससे किसी भी ज़ूम लेवल पर नतीजों की झलक देखी जा सकती है. इसके लिए, पूरी रिज़ॉल्यूशन कंप्यूटेशन के पूरा होने का इंतज़ार नहीं करना पड़ता. हालांकि, इसका मतलब यह है कि अलग-अलग ज़ूम लेवल पर आउटपुट अलग-अलग दिख सकता है.
अगर ऑप्टिमाइज़ की गई डिसप्ले इमेज किसी वजह से सही नहीं है, तो किसी खास प्रोजेक्शन में कंप्यूटेशन को मजबूर किया जा सकता है. इसके लिए, आउटपुट को फिर से प्रोजेक्ट करना होगा. इसके बारे में यहां बताया गया है.
फिर से प्रोजेक्ट किया जा रहा है
reproject() तरीके का इस्तेमाल करके, किसी खास प्रोजेक्शन में कार्रवाइयां की जा सकती हैं. reproject() का इस्तेमाल करने पर, इनपुट के लिए अनुरोध किया जाता है. ये इनपुट, reproject() कॉल में बताई गई प्रोजेक्शन के हिसाब से होते हैं.
reproject() कॉल से पहले आपके कोड में किए गए कैलकुलेशन, तय किए गए प्रोजेक्शन में किए जाएंगे. उदाहरण के लिए, किसी कंपोज़िट को किसी खास प्रोजेक्शन में जनरेट करने के लिए:
कोड एडिटर (JavaScript)
// Some projection that is suitable for your area of interest. var proj = ee.Projection(...); var output = collection.reduce(...).reproject(proj);
import ee import geemap.core as geemap
Colab (Python)
# Some projection that is suitable for your area of interest. proj = ee.Projection(...) output = collection.reduce(...).reproject(proj)
कुछ ऐसे मामले जिनमें अनुमानित किराये की जानकारी देना ज़रूरी है:
- ग्रेडिएंट का हिसाब लगाया जा रहा है. जैसे,
ee.Terrain.gradientयाee.Terrain.slope. reduceResolution, इसका इस्तेमाल तब किया जाता है, जब आपको ज़्यादा रिज़ॉल्यूशन वाले पिक्सल को कम रिज़ॉल्यूशन वाले पिक्सल में बदलना हो. (रिज़ॉल्यूशन कम करने के बारे में ज़्यादा जानें).
reproject() का इस्तेमाल तब तक नहीं करना चाहिए, जब तक कि इसकी ज़रूरत न हो. इसकी कई वजहें हैं. मान लें कि आपने किसी डेटा को फिर से प्रोजेक्ट किया और उसे मैप में जोड़ दिया. अगर reproject() कॉल में तय किया गया स्केल, मैप के ज़ूम लेवल से बहुत छोटा है, तो Earth Engine बहुत छोटे स्केल पर और बहुत बड़े स्पैटियल एक्सटेंट पर सभी इनपुट का अनुरोध करेगा. इस वजह से, एक ही बार में बहुत ज़्यादा डेटा का अनुरोध किया जा सकता है और गड़बड़ी हो सकती है.
अगर फ़ाइनल आउटपुट, reproject() कॉल में तय किए गए प्रोजेक्शन से अलग प्रोजेक्शन में है, तो इससे एक और रीप्रोजेक्शन होगा. इसलिए, अपने कोड में reproject() का इस्तेमाल करते समय सावधानी बरतनी चाहिए. यहां दिए गए उदाहरण पर ध्यान दें. इसमें MODIS इमेज को पहले WGS84 में रीप्रोजेक्ट किया जाता है. इसके बाद, Code Editor के मैप में दिखाने के लिए, इसे maps mercator में रीप्रोजेक्ट किया जाता है:
कोड एडिटर (JavaScript)
// The input image has a SR-ORG:6974 (sinusoidal) projection. var image = ee.Image('MODIS/061/MOD13A1/2014_05_09').select(0); // Operations *before* the reproject call will be done in the projection // specified by reproject(). The output results in another reprojection. var reprojected = image .unitScale(-2000, 10000) .reproject('EPSG:4326', null, 500); Map.addLayer(reprojected, {min: 0.15, max: 0.7}, 'Reprojected');
import ee import geemap.core as geemap
Colab (Python)
# The input image has a SR-ORG:6974 (sinusoidal) projection. image = ee.Image('MODIS/061/MOD13A1/2014_05_09').select(0) # Operations *before* the reproject call will be done in the projection # specified by reproject(). The output results in another reprojection. reprojected = image.unitScale(-2000, 10000).reproject('EPSG:4326', None, 500) m = geemap.Map() m.add_layer(reprojected, {'min': 0.15, 'max': 0.7}, 'Reprojected') m
दूसरे फ़िगर में, रीप्रोजेक्शन के इस आसान उदाहरण से जुड़ी कार्रवाइयों का फ़्लो दिखाया गया है. ध्यान दें कि पहले रीप्रोजेक्शन को साफ़ तौर पर बताया गया है. ऐसा reproject() कॉल में बताया गया है. दूसरा रीप्रोजेक्शन, Earth Engine अपने-आप करता है. ऐसा इसलिए, ताकि मैप पर नतीजे दिखाए जा सकें. यह भी ध्यान दें कि किस प्रोजेक्शन का इस्तेमाल करना है, इस बारे में जानकारी अनुरोध से इनपुट तक वापस फैलती है.