Earth Engine को इस तरह से डिज़ाइन किया गया है कि कैलकुलेशन करते समय, आपको मैप प्रोजेक्शन के बारे में कम ही चिंता करनी पड़े. स्केल की तरह ही, जिस प्रोजेक्शन में कैलकुलेशन की जाती है उसे "पुल" के आधार पर तय किया जाता है. खास तौर पर, आउटपुट प्रोजेक्शन में इनपुट का अनुरोध किया जाता है. आउटपुट को फ़ंक्शन पैरामीटर (उदाहरण के लिए, crs
),
कोड एडिटर, और geemap मैप ऑब्जेक्ट (जिनमें maps
mercator (EPSG:3857) प्रोजेक्शन है) से तय किया जा सकता है. इसके अलावा, reproject()
कॉल से भी आउटपुट तय किया जा सकता है. जब Code Editor या geemap में इमेज दिखाई जाती हैं, तो इनपुट का अनुरोध maps mercator में किया जाता है. MODIS इमेज पर, साइनसोइडल प्रोजेक्शन के साथ, ये आसान कार्रवाइयां करें:
// 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
# 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
इस कोड सैंपल के लिए, ऑपरेशन का क्रम डायग्राम में दिखाया गया है. ध्यान दें कि इनपुट का प्रोजेक्शन, आउटपुट से तय होता है. खास तौर पर, कोड एडिटर में मैप डिसप्ले के मैप मेर्काटर प्रोजेक्शन से. यह प्रोजेक्शन, ऑपरेशन के क्रम में वापस भेजा जाता है, ताकि मैप के मेर्काटर में इनपुट का अनुरोध किया जा सके. यह अनुरोध, मैप के ज़ूम लेवल के हिसाब से तय किए गए स्केल पर किया जाता है.

Earth Engine में, प्रोजेक्शन को कोऑर्डिनेट रेफ़रंस सिस्टम (सीआरएस या कई तरीकों के crs
पैरामीटर) से तय किया जाता है. किसी इमेज के प्रोजेक्शन की जानकारी देखने के लिए, उस पर projection()
बोलें:
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
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 डिग्री होगा.
उदाहरण के लिए:
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
collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA') mosaic = collection.filterDate('2018-01-01', '2019-01-01').mosaic() display(mosaic.projection())
अगर किसी कैलकुलेशन में इस तरह की इमेज का इस्तेमाल किया जाता है, तो आपको गड़बड़ी का यह मैसेज दिख सकता है:
आम तौर पर, 1-डिग्री स्केल पर एग्रीगेशन करना ज़रूरी या सही नहीं होता. इसलिए, Earth Engine आपको यह रिमाइंडर देता है, ताकि आप आउटपुट के लिए पूरी जानकारी दें.
उपयोगकर्ताओं को अक्सर यह व्यवहार भ्रमित करने वाला लगता है और वे "खोई हुई" प्रोजेक्शन जानकारी के बारे में चिंता करते हैं. हालांकि, पिक्सल तब तक कैलकुलेट नहीं किए जाते, जब तक कि ज़रूरत न पड़े (ज़्यादा जानें). साथ ही, उस समय अनुरोध के साथ हमेशा एक आउटपुट प्रोजेक्शन होता है, जिसमें कॉम्पोज़िट कैलकुलेट करने का तरीका बताया गया होता है.
ज़्यादातर इस्तेमाल के उदाहरणों में, प्रोजेक्शन न होना कोई समस्या नहीं है और यह असल में एक अहम ऑप्टिमाइज़ेशन है. इसकी मदद से, किसी भी ज़ूम लेवल पर नतीजों की झलक देखी जा सकती है. इसके लिए, पूरे रिज़ॉल्यूशन का हिसाब लगाने के लिए इंतज़ार करने की ज़रूरत नहीं होती. हालांकि, इसका मतलब यह है कि अलग-अलग ज़ूम लेवल पर आउटपुट अलग-अलग दिख सकता है.
अगर ऑप्टिमाइज़ की गई डिसप्ले इमेज किसी तरह से काफ़ी नहीं है, तो किसी खास प्रोजेक्शन में कैलकुलेशन करने के लिए, आउटपुट को फिर से प्रोजेक्ट किया जा सकता है. इसके बारे में अगले सेक्शन में बताया गया है.
फिर से प्रोजेक्ट करना
reproject()
तरीके का इस्तेमाल करके, किसी खास प्रोजेक्शन में ऑपरेशन को फ़ोर्स किया जा सकता है. reproject()
का इस्तेमाल करने पर, reproject()
कॉल में बताए गए प्रोजेक्शन में इनपुट का अनुरोध किया जाता है.
reproject()
कॉल से पहले आपके कोड में किए गए कैलकुलेशन, तय किए गए प्रोजेक्शन में किए जाएंगे. उदाहरण के लिए, किसी कॉम्पोज़िट को किसी खास प्रोजेक्शन में बनाने के लिए:
// 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
# 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 में फिर से प्रोजेक्ट किया जाता है. इसके बाद, उसे maps mercator में फिर से प्रोजेक्ट किया जाता है:
// 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
# 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 के ज़रिए अपने-आप किया जाता है. यह भी ध्यान दें कि किस प्रोजेक्शन का इस्तेमाल करना है, इसकी जानकारी अनुरोध से इनपुट में वापस भेजी जाती है.
