Earth Engine, Cloud Optimised GeoTIFFs (COGs) की मदद से काम करने वाली एसेट के साथ काम करता है. सीओजी की मदद से बनाई गई ऐसेट का एक फ़ायदा यह है कि ऐसेट बनाने के समय, इमेज के स्पेस और मेटाडेटा फ़ील्ड को इंडेक्स किया जाएगा. इससे, इमेज को कलेक्शन में बेहतर तरीके से दिखाया जा सकेगा. आम तौर पर इस्तेमाल किए जाने वाले उदाहरणों में, सीओजी की मदद से जनरेट हुई ऐसेट की परफ़ॉर्मेंस, डाली गई ऐसेट की परफ़ॉर्मेंस से मेल खाती है.
ध्यान दें कि एक ऐसेट के लिए कई सीओजी का बैक अप लिया जा सकता है. उदाहरण के लिए, हर बैंड के लिए एक सीओजी हो सकता है. हालांकि, एक ही बैंड के लिए कई सीओजी टाइल का इस्तेमाल नहीं किया जा सकता.
इसके अलावा, Earth Engine सीधे तौर पर Google Cloud Storage में मौजूद सीओजी से इमेज लोड कर सकता है (ज़्यादा जानें).
हालांकि, ee.Image.loadGeoTIFF
से लोड की गई और इमेज कलेक्शन में जोड़ी गई इमेज के लिए, कलेक्शन पर फ़िल्टर करने के लिए GeoTiff को पढ़ना ज़रूरी होगा.)
सीओजी की मदद से ऐसेट बनाने के लिए,
- अपनी सीओजी फ़ाइलों को GCS बकेट में डालें. अनुमति वाले इलाकों के बारे में जानने के लिए, नीचे देखें.
- इमेज अपलोड करने के लिए मैनिफ़ेस्ट लिखना
- अपलोड करने का निर्देश भेजने के लिए,
earthengine
कमांड-लाइन यूटिलिटी का इस्तेमाल करें:
earthengine upload external_image --manifest my_manifest.json
एक Tileset
वाले इमेज मेनिफ़ेस्ट का सैंपल
सबसे आसान ImageManifest
वह होता है जिसमें सिर्फ़ एक Tileset
होता है. अगर कोई बैंड नहीं चुना जाता है, तो बनने वाली ऐसेट में GeoTIFF के सभी बैंड शामिल होंगे. साथ ही, GeoTIFF में बैंड के नाम कोड में बदले गए होंगे. इस मामले में, "vis-red", "vis-green", और "vis-blue".
request = {
'imageManifest': {
'name': f'projects/{ee_project}/assets/cogdemo1',
'tilesets': [
{ 'id': '0', 'sources': [ { 'uris': ['gs://ee-docs-demos/COG_demo.tif'] } ] }
],
'properties': {
'version': '1.1'
},
'startTime': '2016-01-01T00:00:00.000000000Z',
'endTime': '2016-12-31T15:01:23.000000000Z',
},
}
pprint(request)
एक से ज़्यादा Tileset
एक से ज़्यादा Tileset
के साथ ImageManifest
तय किया जा सकता है. इसमें, tilesetId
और tilesetBandIndex
फ़ील्ड का इस्तेमाल करके, नतीजे में मिली ऐसेट के हर बैंड को Tileset
के किसी एक बैंड से बैक किया जाता है. यह तब काम आता है, जब अलग-अलग बैंड के रिज़ॉल्यूशन या डेटा टाइप अलग-अलग हों. उपलब्ध किसी भी Tileset
से, बैंड को किसी भी क्रम में सूची में शामिल किया जा सकता है. नीचे दिए गए उदाहरण में:
- "b4b3b2.tif" का स्केल 10 मीटर है, जबकि "b5b6b7" का स्केल 20 मीटर है.
- इस ऐसेट के बैंड का क्रम, इनपुट सीओजी से मिला-जुला होता है. उदाहरण के लिए, आउटपुट बैंड 0,
Tileset
0 से है, जबकि आउटपुट बैंड 1,Tileset
1 से है.
request = {
'imageManifest': {
'name': f'projects/{ee_project}/assets/cogdemo2',
'uriPrefix': 'gs://ee-docs-demos/external_image_demo/',
'tilesets': [
{ 'id': '0', 'sources': [ { 'uris': ['b4b3b2.tif'] } ] },
{ 'id': '1', 'sources': [ { 'uris': ['b5b6b7.tif'] } ] },
],
'bands': [
{ 'id': 'red', 'tilesetId': '0', 'tilesetBandIndex': 0 },
{ 'id': 'rededge3', 'tilesetId': '1', 'tilesetBandIndex': 2 },
{ 'id': 'rededge2', 'tilesetId': '1', 'tilesetBandIndex': 1 },
{ 'id': 'green', 'tilesetId': '0', 'tilesetBandIndex': 1 },
{ 'id': 'blue', 'tilesetId': '1', 'tilesetBandIndex': 0 },
{ 'id': 'rededge1', 'tilesetId': '0', 'tilesetBandIndex': 2 },
],
},
}
pprint(request)
सीओजी से जुड़ी ऐसेट के बारे में जानकारी
जगह
Cloud Storage बकेट की लोकेशन इनमें से कोई एक होनी चाहिए:
- अमेरिका का एक से ज़्यादा इलाका
- अमेरिका का कोई भी ड्यूअल-रीजन, जिसमें US-CENTRAL1 शामिल हो
- क्षेत्र US-CENTRAL1
स्टोरेज क्लास
बकेट का स्टोरेज क्लास, "स्टैंडर्ड स्टोरेज" होना चाहिए.
शेयर करने की अनुमतियां
सीओजी की मदद से बनाई गई Earth Engine एसेट और उसमें मौजूद डेटा के एसीएल को अलग-अलग मैनेज किया जाता है. जब सहयोगियों के साथ, रीड-ओनली ऐक्सेस के लिए सीओजी की मदद से बनाई गई ऐसेट शेयर की जाती हैं, तो ऐसेट के मालिक की यह ज़िम्मेदारी होती है कि वह यह पक्का करे कि Earth Engine ऐसेट और उसमें मौजूद सीओजी फ़ाइलों, दोनों को रीड-ओनली ऐक्सेस दिया गया हो.
1. Google Cloud Storage बकेट को पढ़ने की अनुमतियां देना
साथ मिलकर काम करने वाले लोगों को सीओजी की मदद से सुरक्षित की गई एसेट पढ़ने के लिए, उनके पास Google Cloud Storage बकेट में मौजूद सीओजी फ़ाइलों को पढ़ने का ऐक्सेस होना चाहिए. इन अनुमतियों के बिना, Earth Engine उनका डेटा वापस नहीं ला पाएगा. अगर Earth Engine के उपयोगकर्ता को Google Cloud Storage में मौजूद डेटा नहीं दिखता है, तो Earth Engine "gs://my-bucket/my-object#123456
पर GeoTIFF लोड नहीं हो सका" (जहां 123456 ऑब्जेक्ट का जनरेशन है) फ़ॉर्म में गड़बड़ी का मैसेज दिखाएगा.
खास तौर पर, सहयोगियों के पास ये अनुमतियां होनी चाहिए:
storage.buckets.get
का इस्तेमाल किया जा सकता है. इससे, बकेट का मेटाडेटा और जगह की जानकारी मिलती है. साथ ही, Earth Engine को ऐसेट के सोर्स को सही तरीके से हल करने में मदद मिलती है.storage.objects.get
पर जाएं (COG की मदद से मैनेज की जा रही ऐसेट का असल डेटा पढ़ने के लिए).
ये अनुमतियां, "स्टोरेज लेगसी बकेट रीडर" और "स्टोरेज लेगसी ऑब्जेक्ट रीडर" जैसी भूमिकाओं से मिलती हैं. इनके अलावा, और भी भूमिकाएं हैं जिनसे ये अनुमतियां मिल सकती हैं.
सहयोगियों को ये भूमिकाएं असाइन करने के लिए:
- बकेट की अनुमति वाले पेज पर जाएं:
https://console.cloud.google.com/storage/browser/{MY-BUCKET};tab=permissions
- "ऐक्सेस दें" पर क्लिक करें
- उन सभी प्रिंसिपल (उदाहरण के लिए, उपयोगकर्ता, ग्रुप, सेवा खाते) को जोड़ें जिन्हें पढ़ने का ऐक्सेस दिया जाना चाहिए.
- ये भूमिकाएं असाइन करें:
- "Storage लेगसी बकेट रीडर" (
storage.buckets.get
और बकेट-लेवल पर पढ़ने की अन्य अनुमतियां देता है). - "स्टोरेज लीगेसी ऑब्जेक्ट रीडर" (
storage.objects.get
उपलब्ध कराता है). - इसके अलावा, सिर्फ़
storage.buckets.get
औरstorage.objects.get
अनुमतियों वाली नई कस्टम भूमिका बनाई जा सकती है और उसे असाइन किया जा सकता है.
- "Storage लेगसी बकेट रीडर" (
- सेव करें
2. पढ़ने के लिए Earth Engine ऐसेट शेयर करना
यह पक्का करने के बाद कि आपके साथ काम करने वाले लोगों के पास, GCS की बुककेट और ऑब्जेक्ट के लिए ज़रूरी अनुमतियां हैं, आपको Earth Engine ऐसेट भी शेयर करनी होगी. Earth Engine ऐसेट की अनुमतियां सेट करने के बारे में ज़्यादा जानने के लिए, Earth Engine ऐसेट मैनेजमेंट गाइड देखें.
पीढ़ियां
जब सीओजी की मदद से कोई ऐसेट बनाई जाती है, तो Earth Engine, मेनिफ़ेस्ट में बताए गए TIFFs के मेटाडेटा को पढ़ता है और ऐसेट स्टोर की एंट्री बनाता है. उस एंट्री से जुड़े हर यूआरआई में जनरेशन हो सकता है. जनरेशन के बारे में जानकारी पाने के लिए, ऑब्जेक्ट के वर्शन के बारे में जानकारी देने वाले दस्तावेज़ देखें. अगर कोई जनरेशन तय किया गया है, जैसे कि gs://foo/bar#123
, तो Earth Engine उस यूआरआई को वैसा ही सेव करेगा. अगर जनरेशन की जानकारी नहीं दी गई है, तो Earth Engine उस यूआरआई को TIFF के जनरेशन के साथ सेव करेगा. यह जनरेशन, ImportExternalImage
को कॉल करने के समय का होगा.
इसका मतलब है कि अगर GCS में किसी बाहरी एसेट वाली TIFF फ़ाइल को अपडेट किया जाता है (इसलिए, उसकी जनरेशन बदल जाती है), तो Earth Engine "gs://my-bucket/my-object#123456
पर GeoTIFF लोड नहीं हो सका" गड़बड़ी दिखाएगा. ऐसा इसलिए होगा, क्योंकि उम्मीद के मुताबिक ऑब्जेक्ट अब मौजूद नहीं है. हालांकि, ऐसा तब तक नहीं होगा, जब तक कि बकेट में एक से ज़्यादा ऑब्जेक्ट के वर्शन चालू न हों.
इस नीति को ऐसेट के मेटाडेटा को ऑब्जेक्ट के मेटाडेटा के साथ सिंक रखने के लिए बनाया गया है.
कॉन्फ़िगरेशन
सीओजी को कॉन्फ़िगर करने के तरीके के हिसाब से, TIFF में ये चीज़ें होनी चाहिए:
टाइल किया गया, जहां टाइल के डाइमेंशन इनमें से कोई एक हैं:
- 256x256
- 512x512
- 1024x1024
- 2048x2048
इस तरह से व्यवस्थित किया गया है कि सभी आईएफ़डी शुरुआत में हों.
सबसे अच्छी परफ़ॉर्मेंस के लिए:
- टाइल के डाइमेंशन 512x512 या इससे ज़्यादा होने चाहिए.
- दो खास जानकारी शामिल करें.
इस्तेमाल के उदाहरणों के आधार पर, 'INTERLEAVE' बनाने के विकल्प से परफ़ॉर्मेंस पर असर पड़ सकता है. हमारा सुझाव है कि सभी मामलों में, BAND इंटरलीव का इस्तेमाल करें.
ऑप्टिमाइज़ किए गए कॉन्फ़िगरेशन के बारे में ज़्यादा जानकारी के लिए, यह पेज देखें.
यहां दिया गया gdal_translate
कमांड, किसी रास्टर को बैंड-इंटरलीव्ड, zstd-कंप्रेस्ड, और क्लाउड ऑप्टिमाइज़्ड GeoTIFF में बदल देगा. यह फ़ॉर्मैट, Earth Engine में बेहतर तरीके से काम करेगा:
gdal_translate in.tif out.tif \
-co COPY_SRC_OVERVIEWS=YES \
-co TILED=YES \
-co BLOCKXSIZE=512 \
-co BLOCKYSIZE=512 \
-co COMPRESS=ZSTD \
-co ZSTD_LEVEL=22 \
-co INTERLEAVE=BAND \
-co NUM_THREADS=ALL_CPUS
प्रेडिकटर (पूर्णांक डेटा टाइप के लिए -co PREDICTOR=2
और फ़्लोटिंग पॉइंट डेटा टाइप के लिए -co PREDICTOR=3
) तय करके, आउटपुट फ़ाइल का साइज़ और भी कम किया जा सकता है.
GDAL >= 3.11 का इस्तेमाल करने वाले उपयोगकर्ताओं के लिए, COG ड्राइवर, खास जानकारी बनाने और उसे सेव करने की चिंता किए बिना फ़ाइलें बना सकता है.
gdal_translate in.tif out.tif \
-of COG \
-co OVERVIEWS=IGNORE_EXISTING \
-co COMPRESS=ZSTD \
-co LEVEL=22 \
-co PREDICTOR=2 \
-co INTERLEAVE=BAND \
-co NUM_THREADS=ALL_CPUS \
REST API का इस्तेमाल करके, क्लाउड पर मौजूद GeoTiff फ़ॉर्मैट वाली ऐसेट बनाना
ध्यान दें: REST API में नई और बेहतर सुविधाएं शामिल हैं. ऐसा हो सकता है कि ये सभी उपयोगकर्ताओं के लिए सही न हों. अगर आपने Earth Engine का इस्तेमाल पहले कभी नहीं किया है, तो हमारा सुझाव है कि आप JavaScript की गाइड से शुरू करें.
REST API का इस्तेमाल करके, सीओजी की मदद से बनाई गई एसेट बनाने के लिए, Earth Engine ImportExternalImage
एंडपॉइंट पर POST
अनुरोध करें.
यहां दिखाए गए अनुरोध को अनुमति दी जानी चाहिए, ताकि आपके उपयोगकर्ता फ़ोल्डर में एसेट बनाई जा सके.
अनुमति वाला सेशन शुरू करना
अपने उपयोगकर्ता फ़ोल्डर में Earth Engine एसेट बनाने के लिए, आपको अनुरोध करते समय अपनी पहचान की पुष्टि करनी होगी. AuthorizedSession
शुरू करने के लिए, Earth Engine Authenticator में मौजूद क्रेडेंशियल का इस्तेमाल किया जा सकता है.
इसके बाद, Earth Engine को अनुरोध भेजने के लिए AuthorizedSession
का इस्तेमाल किया जा सकता है.
import ee
import json
from pprint import pprint
from google.auth.transport.requests import AuthorizedSession
ee.Authenticate() # or !earthengine authenticate --auth_mode=gcloud
# Specify the cloud project you want associated with Earth Engine requests.
ee_project = 'your-project'
session = AuthorizedSession(
ee.data.get_persistent_credentials().with_quota_project(ee_project)
)
अनुरोध का मुख्य भाग
अनुरोध का मुख्य हिस्सा, ImageManifest
का एक इंस्टेंस है.
यहां सीओजी का पाथ और दूसरी काम की प्रॉपर्टी के बारे में बताया गया है.
ImageManifest
को कॉन्फ़िगर करने के तरीके के बारे में जानने के लिए, यह गाइड देखें. एक या एक से ज़्यादा Tileset
तय किए जा सकते हैं. साथ ही, हर Tileset
के साथ एक या एक से ज़्यादा बैंड जोड़े जा सकते हैं. ImportExternalImage
के लिए,
हर Tileset
के लिए ज़्यादा से ज़्यादा एक ImageSource
इस्तेमाल किया जा सकता है.
सीओजी एक्सपोर्ट करने के बारे में जानकारी के लिए, यह दस्तावेज़ देखें.
अनुरोध भेजना
Earth Engine के projects.images.importExternal
एंडपॉइंट पर POST अनुरोध करें.
url = f'https://earthengine.googleapis.com/v1alpha/projects/{ee_project}/image:importExternal'
response = session.post(
url = url,
data = json.dumps(request)
)
pprint(json.loads(response.content))