Earth Engine को इस तरह से डिज़ाइन किया गया है कि कंप्यूटेशन करते समय
आपको मैप प्रोजेक्शन के बारे में ज़्यादा चिंता न करनी पड़े. स्केल की तरह, कंप्यूटेशन जिस प्रोजेक्शन में होता है वह
"पुल" के आधार पर तय किया जाता है. खास तौर पर, आउटपुट
प्रोजेक्शन में इनपुट का अनुरोध किया जाता है. आउटपुट, फ़ंक्शन पैरामीटर (जैसे, crs),
Code Editor और geemap मैप ऑब्जेक्ट (जिनमें maps
mercator (EPSG:3857) प्रोजेक्शन होता है) या reproject() कॉल से तय किया जा सकता है. Code Editor या geemap में इमेज दिखाने पर, maps mercator में इनपुट का अनुरोध किया जाता है. MODIS इमेज पर यह ऑपरेशन देखें, जिसमें साइनसोइडल प्रोजेक्शन है:
Code Editor (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
इस कोड के नमूने के लिए, ऑपरेशन का क्रम पहली इमेज में दिखाया गया है. ध्यान दें कि इनपुट का प्रोजेक्शन, आउटपुट से तय होता है. खास तौर पर, maps mercator Code Editor में मैप डिसप्ले का प्रोजेक्शन. यह प्रोजेक्शन, ऑपरेशन के क्रम में वापस फैलता है, ताकि maps mercator में इनपुट का अनुरोध किया जा सके. इसका स्केल, मैप के ज़ूम लेवल से तय होता है.
Earth Engine में, प्रोजेक्शन को कोऑर्डिनेट रेफ़रंस सिस्टम (सीआरएस या
कई तरीकों का crs पैरामीटर) से तय किया जाता है. `projection()` को कॉल करके, किसी इमेज का प्रोजेक्शन देखा जा सकता है:
Code Editor (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-डिग्री स्केल वाला प्रोजेक्शन होता है.
अगर यह डिफ़ॉल्ट प्रोजेक्शन, आपके विश्लेषण के लिए सही नहीं है (जैसे, यह बहुत मोटा है या आपको टेरेन विश्लेषण जैसे डाउनस्ट्रीम कंप्यूटेशन में रीसैंपलिंग आर्टफ़ैक्ट से बचना है), तो image.setDefaultProjection(crs) का इस्तेमाल करके, कोई दूसरा डिफ़ॉल्ट प्रोजेक्शन सेट किया जा सकता है. इससे यह पक्का होता है कि अगर Earth
Engine को इमेज से जुड़े कंप्यूटेशन के लिए कोई प्रोजेक्शन चुनना है,
तो वह 1-डिग्री स्केल वाले WGS84 के बजाय, तय किया गया प्रोजेक्शन इस्तेमाल करेगा.
उदाहरण के लिए:
Code Editor (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())
अगर आपने किसी कंप्यूटेशन में इस तरह की इमेज का इस्तेमाल किया, तो आपको यह गड़बड़ी दिख सकती है:
आम तौर पर, 1-डिग्री स्केल पर एग्रीगेशन नहीं किया जाता. इसलिए, Earth Engine आपको आउटपुट के लिए पूरी जानकारी देने के लिए यह रिमाइंडर दिखाता है.
उपयोगकर्ताओं को अक्सर यह व्यवहार भ्रमित करने वाला लगता है और वे "खोई हुई" प्रोजेक्शन जानकारी के बारे में चिंता करते हैं. हालांकि, पिक्सल का कंप्यूटेशन तब तक नहीं किया जाता, जब तक उनकी ज़रूरत न हो (ज़्यादा जानें). इसके अलावा, उस समय हमेशा एक आउटपुट प्रोजेक्शन होता है, जो उस अनुरोध के साथ होता है जिसमें कंपोज़िट का कंप्यूटेशन करने का तरीका तय किया गया है .
ज़्यादातर इस्तेमाल के मामलों में, प्रोजेक्शन न होना कोई समस्या नहीं है और यह एक अहम ऑप्टिमाइज़ेशन है, क्योंकि इससे पूरे रिज़ॉल्यूशन वाले कंप्यूटेशन के पूरा होने का इंतज़ार किए बिना, किसी भी ज़ूम लेवल पर नतीजों की झलक देखी जा सकती है. हालांकि, इसका मतलब है कि अलग-अलग ज़ूम लेवल पर आउटपुट अलग-अलग दिख सकता है.
अगर ऑप्टिमाइज़ की गई डिसप्ले इमेज किसी वजह से काफ़ी नहीं है, तो आउटपुट को रीप्रोजेक्ट करके, किसी खास प्रोजेक्शन में कंप्यूटेशन किया जा सकता है. इसके बारे में अगले सेक्शन में बताया गया है.
रीप्रोजेक्ट करना
तरीके से, किसी खास प्रोजेक्शन में ऑपरेशन किए जा सकते हैं.reproject() reproject() का इस्तेमाल करने पर, इनपुट को reproject() कॉल में तय किए गए प्रोजेक्शन में अनुरोध किया जाता है.
आपके कोड में पहले किए गए कंप्यूटेशन, reproject() कॉल से तय किए गए प्रोजेक्शन में किए जाएंगे. उदाहरण के लिए, किसी कंपोज़िट को किसी
खास प्रोजेक्शन में बनाने के लिए:
Code Editor (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, तब इस्तेमाल किया जाता है, जब आपको ज़्यादा रिज़ॉल्यूशन वाले पिक्सल को कम रिज़ॉल्यूशन में एग्रीगेट करना हो. (रिज़ॉल्यूशन कम करने के बारे में ज़्यादा जानें).
ee.Terrain पैकेज में मौजूद फ़ंक्शन (जैसे, slope,
aspect, hillshade), आस-पास के पिक्सल के आधार पर वैल्यू का कंप्यूटेशन करते हैं. साथ ही, रीप्रोजेक्शन के दौरान होने वाले रीसैंपलिंग आर्टफ़ैक्ट के लिए संवेदनशील होते हैं. जब कंप्यूटेशन का प्रोजेक्शन, DEM's
नेटिव प्रोजेक्शन से अलग होता है, तो डिफ़ॉल्ट नियरेस्ट-नेबर रीसैंपलिंग से
आउटपुट में आर्टिफ़िशियल पैटर्न बन सकते हैं. बेहतर नतीजे पाने के लिए, DEM के नेटिव प्रोजेक्शन में टेरेन
विश्लेषण करें. अगर DEM टाइल के
ImageCollection के साथ काम किया जा रहा है, तो मोज़ेक बनाएं और कलेक्शन के नेटिव
प्रोजेक्शन के साथ
setDefaultProjection() का इस्तेमाल करें. इससे यह पक्का होगा कि विश्लेषण सही ग्रिड पर किया जाए. इसके बारे में, डिफ़ॉल्ट प्रोजेक्शन सेक्शन में बताया गया है.
reproject() का इस्तेमाल तब तक नहीं करना चाहिए, जब तक इसकी ज़रूरत न हो. इसकी कई वजहें हैं. मान लें कि आपने किसी चीज़ को रीप्रोजेक्ट किया और उसे मैप में जोड़ा. अगर reproject() कॉल में तय किया गया स्केल, मैप के ज़ूम लेवल से काफ़ी छोटा है, तो Earth Engine बहुत छोटे स्केल पर, बहुत बड़े स्पैटियल एक्सटेंट पर सभी इनपुट का अनुरोध करेगा. इससे एक साथ बहुत ज़्यादा डेटा का अनुरोध किया जा सकता है और गड़बड़ी हो सकती है.
अगर आखिर में मिलने वाला आउटपुट,
reproject() कॉल में तय किए गए प्रोजेक्शन से अलग है, तो एक और रीप्रोजेक्शन होगा. अपने कोड में reproject() का इस्तेमाल करते समय सावधानी बरतने की एक और वजह यह है. यह उदाहरण देखें, जिसमें MODIS इमेज को पहले
WGS84 में रीप्रोजेक्ट किया जाता है. इसके बाद, Code Editor मैप में दिखाने के लिए, maps mercator में रीप्रोजेक्ट किया जाता है:
Code Editor (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 अपने-आप करता है, ताकि मैप पर नतीजा दिखाया जा सके. यह भी देखें कि किस प्रोजेक्शन का इस्तेमाल करना है, इस बारे में जानकारी, अनुरोध से इनपुट तक वापस फैलती है.