क्लाउड में मौजूद जियो-TIFF फ़ॉर्मैट वाली Earth Engine ऐसेट

Earth Engine, Cloud Optimized GeoTIFFs (COGs) पर आधारित ऐसेट के साथ काम करता है. COG फ़ॉर्मैट में सेव की गई ऐसेट का फ़ायदा यह है कि इमेज के स्पेस और मेटाडेटा फ़ील्ड को ऐसेट बनाने के समय इंडेक्स किया जाएगा. इससे इमेज, कलेक्शन में बेहतर परफ़ॉर्म कर पाएगी. आम तौर पर, इस्तेमाल के उदाहरणों में सीओजी-बैक वाली ऐसेट की परफ़ॉर्मेंस, इनजेस्ट की गई ऐसेट की परफ़ॉर्मेंस से मिलती-जुलती होती है.

ध्यान दें कि एक ऐसेट को कई सीओजी से बैक किया जा सकता है. उदाहरण के लिए, हर बैंड के लिए एक सीओजी हो सकता है. हालांकि, एक बैंड के लिए कई सीओजी टाइल इस्तेमाल नहीं की जा सकतीं.

(इसके अलावा, Earth Engine, Google Cloud Storage में मौजूद COG से सीधे तौर पर इमेज लोड कर सकता है (ज़्यादा जानें). हालांकि, ee.Image.loadGeoTIFF के ज़रिए लोड की गई और इमेज कलेक्शन में जोड़ी गई इमेज के लिए, GeoTiff को पढ़ना ज़रूरी होगा. इससे कलेक्शन में मौजूद इमेज को फ़िल्टर किया जा सकेगा.)

COG-बैक वाली ऐसेट बनाने के लिए,

  1. अपनी COG फ़ाइलों को GCS बकेट में रखें. इसके लिए, उन इलाकों की जानकारी देखें जहां COG फ़ाइलें इस्तेमाल की जा सकती हैं.
  2. इमेज अपलोड करने के लिए मेनिफ़ेस्ट लिखना
  3. अपलोड करने का निर्देश भेजने के लिए, 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

tilesetId और tilesetBandIndex फ़ील्ड का इस्तेमाल करके, एक से ज़्यादा Tileset के साथ ImageManifest तय किया जा सकता है. इसमें, नतीजे के तौर पर मिली ऐसेट का हर बैंड, Tileset के किसी एक बैंड पर आधारित होता है. यह तब काम आता है, जब अलग-अलग बैंड के रिज़ॉल्यूशन या डेटा टाइप अलग-अलग होते हैं. बैंड को किसी भी उपलब्ध Tileset से किसी भी क्रम में लिस्ट किया जा सकता है. इस उदाहरण में:

  • "b4b3b2.tif" का स्केल 10 मीटर है, जबकि "b5b6b7" का स्केल 20 मीटर है.
  • नतीजे के तौर पर मिली ऐसेट का बैंड ऑर्डर, इनपुट COG से मिलाया जाता है. उदाहरण के लिए, आउटपुट बैंड 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 क्षेत्र

स्टोरेज क्लास

बकेट का स्टोरेज क्लास "स्टैंडर्ड स्टोरेज" होना चाहिए.

शेयर करने की अनुमतियां

COG फ़ॉर्मैट वाली Earth Engine ऐसेट और उनके डेटा के लिए, एसीएल अलग-अलग मैनेज किए जाते हैं. जब COG फ़ाइल वाली ऐसेट को पढ़ने के लिए, सहयोगियों के साथ शेयर किया जाता है, तो यह मालिक की ज़िम्मेदारी होती है कि Earth Engine ऐसेट और उससे जुड़ी COG फ़ाइलों, दोनों को पढ़ने की अनुमति दी जाए.

1. Google Cloud Storage बकेट में मौजूद कॉन्टेंट को पढ़ने की अनुमतियां देना

साथ मिलकर काम करने वाले लोगों को COG फ़ाइल वाली ऐसेट पढ़ने के लिए, सबसे पहले Google Cloud Storage बकेट में मौजूद COG फ़ाइलों को पढ़ने का ऐक्सेस होना चाहिए. इन अनुमतियों के बिना, Earth Engine उनके लिए डेटा नहीं पा सकेगा. अगर Google Cloud Storage में मौजूद डेटा, Earth Engine के उपयोगकर्ता को नहीं दिखता है, तो Earth Engine इस तरह की गड़बड़ी का मैसेज दिखाएगा: "gs://my-bucket/my-object#123456 पर मौजूद GeoTIFF को लोड नहीं किया जा सका". यहां 123456, ऑब्जेक्ट का जनरेशन है.

खास तौर पर, सहयोगी के पास ये अनुमतियां होनी चाहिए:

  • बकेट पर storage.buckets.get (बकेट का मेटाडेटा और जगह की जानकारी पाने के लिए, ताकि Earth Engine ऐसेट के सोर्स का पता लगा सके).
  • storage.objects.get की अनुमति होनी चाहिए, ताकि वह बकेट में मौजूद ऐसेट का डेटा पढ़ सके.

ये अनुमतियां, "स्टोरेज लेगसी बकेट रीडर" और "स्टोरेज लेगसी ऑब्जेक्ट रीडर" भूमिकाओं से मिलती हैं. इनके अलावा, ये अनुमतियां अन्य भूमिकाओं से भी मिलती हैं.

साथ मिलकर काम करने वाले लोगों को ये भूमिकाएं असाइन करने के लिए:

  1. बकेट की अनुमति वाले पेज पर जाएं: https://console.cloud.google.com/storage/browser/{MY-BUCKET};tab=permissions
  2. "ऐक्सेस दें" पर क्लिक करें
  3. उन सभी प्रिंसिपल (जैसे, उपयोगकर्ता, ग्रुप, सेवा खाते) को जोड़ें जिन्हें पढ़ने का ऐक्सेस दिया जाना चाहिए.
  4. ये भूमिकाएं असाइन करें:
    • "Storage Legacy Bucket Reader" (इससे storage.buckets.get और बकेट-लेवल की अन्य अनुमतियां मिलती हैं).
    • "Storage Legacy Object Reader" (storage.objects.get की सुविधा देता है).
    • (इसके अलावा, सिर्फ़ storage.buckets.get और storage.objects.get अनुमतियों वाली कोई नई कस्टम भूमिका बनाई जा सकती है और उसे असाइन किया जा सकता है.)
  5. सेव करें

2. पढ़ने के लिए Earth Engine ऐसेट शेयर करना

यह पक्का करने के बाद कि आपके सहयोगियों के पास, GCS बकेट और ऑब्जेक्ट पर ज़रूरी अनुमतियां हैं, आपको Earth Engine ऐसेट भी शेयर करनी होगी. Earth Engine की ऐसेट के लिए अनुमतियां सेट करने के बारे में ज़्यादा जानने के लिए, Earth Engine की ऐसेट मैनेज करने से जुड़ी गाइड पढ़ें.

पीढ़ियां

COG-बैक वाली ऐसेट बनाने पर, Earth Engine, मेनिफ़ेस्ट में दिए गए TIFF का मेटाडेटा पढ़ता है. इसके बाद, ऐसेट स्टोर की एंट्री बनाता है. उस एंट्री से जुड़े हर यूआरआई का जनरेशन हो सकता है. जनरेशन के बारे में ज़्यादा जानने के लिए, ऑब्जेक्ट वर्शनिंग के दस्तावेज़ देखें. अगर जनरेशन के बारे में बताया गया है, तो Earth Engine उस यूआरआई को ठीक वैसे ही सेव करेगा जैसा बताया गया है. उदाहरण के लिए, gs://foo/bar#123. अगर जनरेशन की जानकारी नहीं दी जाती है, तो Earth Engine उस यूआरआई को TIFF के जनरेशन के साथ सेव करेगा. यह जनरेशन, ImportExternalImage को कॉल किए जाने के समय का होगा.

इसका मतलब है कि अगर GCS में मौजूद किसी बाहरी ऐसेट वाले TIFF को अपडेट किया जाता है (इसलिए, इसका जनरेशन बदल जाता है), तो Earth Engine, "gs://my-bucket/my-object#123456 पर GeoTIFF लोड नहीं किया जा सका" गड़बड़ी दिखाएगा. ऐसा इसलिए होगा, क्योंकि उम्मीद के मुताबिक ऑब्जेक्ट अब मौजूद नहीं है. हालांकि, ऐसा तब तक होगा, जब तक बकेट में ऑब्जेक्ट के कई वर्शन सेव करने की सुविधा चालू नहीं की जाती. इस नीति को इसलिए बनाया गया है, ताकि ऐसेट का मेटाडेटा, ऑब्जेक्ट के मेटाडेटा के साथ सिंक रहे.

कॉन्फ़िगरेशन

COG को कॉन्फ़िगर करने के लिए, TIFF फ़ाइल में ये चीज़ें होनी चाहिए:

  • टाइल किया गया हो, जहां टाइल के डाइमेंशन इनमें से कोई एक हो:

    • 256x256
    • 512x512
    • 1024x1024
    • 2048x2048
  • इस तरह से व्यवस्थित किया गया है कि सभी आईएफ़डी शुरुआत में हों.

बेहतरीन परफ़ॉर्मेंस के लिए:

  • टाइल के डाइमेंशन 512x512 या इससे ज़्यादा होने चाहिए.
  • इसमें दो खास जानकारी शामिल करें.

इस्तेमाल के उदाहरणों के आधार पर, 'INTERLEAVE' बनाने के विकल्प से परफ़ॉर्मेंस पर असर पड़ सकता है. हमारा सुझाव है कि हर स्थिति में, बैंड इंटरलीविंग का इस्तेमाल करें.

ऑप्टिमाइज़ किए गए कॉन्फ़िगरेशन के बारे में ज़्यादा जानकारी के लिए, यह पेज देखें.

नीचे दी गई 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 का इस्तेमाल करके, Cloud GeoTiff-Backed ऐसेट बनाना

ध्यान दें: REST API में नई और बेहतर सुविधाएं शामिल हैं. ऐसा हो सकता है कि ये सभी उपयोगकर्ताओं के लिए सही न हों. अगर आपने Earth Engine का इस्तेमाल पहले कभी नहीं किया है, तो हमारा सुझाव है कि आप JavaScript गाइड से शुरुआत करें.

REST API का इस्तेमाल करके, COG-बैक वाली ऐसेट बनाने के लिए, Earth Engine ImportExternalImage एंडपॉइंट को POST अनुरोध भेजें. नीचे दिए गए उदाहरण में दिखाया गया है कि आपके उपयोगकर्ता फ़ोल्डर में ऐसेट बनाने के लिए, इस अनुरोध को अनुमति दी जानी चाहिए.

अनुमति वाला सेशन शुरू करना

अपने उपयोगकर्ता फ़ोल्डर में Earth Engine ऐसेट बनाने के लिए, आपको अनुरोध करते समय अपनी पहचान की पुष्टि करनी होगी. AuthorizedSession शुरू करने के लिए, Earth Engine के पुष्टि करने वाले टूल से मिले क्रेडेंशियल का इस्तेमाल किया जा सकता है. इसके बाद, 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 में एक या उससे ज़्यादा बैंड होते हैं. ImportExternalImage के लिए, हर Tileset के लिए ज़्यादा से ज़्यादा एक ImageSource इस्तेमाल किया जा सकता है.

COGs एक्सपोर्ट करने के बारे में जानकारी के लिए, यह दस्तावेज़ देखें.

अनुरोध भेजें

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