Earth Engine REST API की मदद से इमेज कंप्यूटेशन करना

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

Earth Engine REST API को झटपट शुरू करने की गाइड में, Earth Engine ऐसेट से पिक्सल के ब्लॉक ऐक्सेस करने का तरीका बताया गया है. मान लें कि आपको नतीजे पाने से पहले, पिक्सल पर कोई कैलकुलेशन लागू करनी है. इस गाइड में, क्लाइंट लाइब्रेरी में से किसी एक का इस्तेमाल करके, कंप्यूटेशन का प्रोटोटाइप बनाने का तरीका बताया गया है. साथ ही, इसमें कंप्यूटेशन ग्राफ़ को क्रम से लगाने और कंप्यूट किए गए नतीजे पाने के लिए, REST API का इस्तेमाल करने का तरीका भी बताया गया है. REST API के ज़रिए कंप्यूट अनुरोध करने का मतलब है कि कंप्यूट एंडपॉइंट में से किसी एक को POST अनुरोध भेजा गया है. उदाहरण के लिए, computePixels, computeFeatures या सामान्य value.compute. खास तौर पर, इस उदाहरण में दिखाया गया है कि किसी छोटे इलाके की Sentinel-2 की इमेज का मीडियन कंपोज़िट कैसे बनाया जाता है.

शुरू करने से पहले

इन निर्देशों का पालन करके:

  1. Earth Engine के लिए आवेदन करना
  2. Google Cloud प्रोजेक्ट बनाना
  3. प्रोजेक्ट पर Earth Engine API चालू करें
  4. सेवा खाता बनाना
  5. Earth Engine कंप्यूटेशन करने के लिए, सेवा खाते को प्रोजेक्ट लेवल की अनुमति देना

ध्यान दें: इस ट्यूटोरियल को पूरा करने के लिए, आपको ऐसे सेवा खाते की ज़रूरत होगी जो Earth Engine को ऐक्सेस करने के लिए रजिस्टर किया गया हो. आगे बढ़ने से पहले, सेवा खाता रजिस्टर करने के लिए ये निर्देश देखें.

Google Cloud में पुष्टि करना

सबसे पहले, आपको लॉगिन करना होगा, ताकि Google Cloud से पुष्टि किए गए अनुरोध किए जा सकें. आपको प्रोजेक्ट को उसी समय सेट करना होगा. साइन इन करने के लिए, आउटपुट में दिए गए निर्देशों का पालन करें.

# INSERT YOUR PROJECT HERE
PROJECT = 'your-project'

!gcloud auth login --project {PROJECT}

अपने सेवा खाते के लिए निजी कुंजी फ़ाइल पाना

Earth Engine का इस्तेमाल करने के लिए, आपके पास पहले से ही रजिस्टर किया गया सेवा खाता होना चाहिए. अगर आपके पास ऐसा कोई खाता नहीं है, तो खाता बनाने के लिए इन निर्देशों का पालन करें. अपने सेवा खाते का ईमेल पता, इस सेल में कॉपी करें. (Earth Engine का इस्तेमाल करने के लिए, सेवा खाते का पहले से ही रजिस्टर होना ज़रूरी है). नीचे दिए गए सेल में, सेवा खाते के लिए कुंजी फ़ाइल जनरेट करने के लिए, gsutil कमांड लाइन का इस्तेमाल किया गया है. कुंजी फ़ाइल, नोटबुक वीएम पर बनाई जाएगी.

# INSERT YOUR SERVICE ACCOUNT HERE
SERVICE_ACCOUNT='your-service-account@your-project.iam.gserviceaccount.com'
KEY = 'key.json'

!gcloud iam service-accounts keys create {KEY} --iam-account {SERVICE_ACCOUNT}

AuthorizedSession शुरू करें और अपने क्रेडेंशियल की जांच करें

क्रेडेंशियल पाने के लिए, निजी कुंजी का इस्तेमाल करके उसकी जांच करें. एचटीटीपी अनुरोध करने के लिए, क्रेडेंशियल का इस्तेमाल करके एक मान्य सेशन बनाएं. क्रेडेंशियल काम कर रहे हैं या नहीं, यह देखने के लिए सेशन के ज़रिए GET अनुरोध करें.

from google.auth.transport.requests import AuthorizedSession
from google.oauth2 import service_account

credentials = service_account.Credentials.from_service_account_file(KEY)
scoped_credentials = credentials.with_scopes(
    ['https://www.googleapis.com/auth/cloud-platform'])

session = AuthorizedSession(scoped_credentials)

url = 'https://earthengine.googleapis.com/v1beta/projects/earthengine-public/assets/LANDSAT'

response = session.get(url)

from pprint import pprint
import json
pprint(json.loads(response.content))

कैलकुलेशन को क्रम से लगाना

किसी चीज़ का हिसाब लगाने का अनुरोध भेजने से पहले, हिसाब लगाने के तरीके को Earth Engine एक्सप्रेशन ग्राफ़ फ़ॉर्मैट में रखना ज़रूरी है. यहां एक्सप्रेशन ग्राफ़ पाने का तरीका बताया गया है.

Earth Engine में पुष्टि करना

सेवा खाते से, Earth Engine के स्कोप वाले क्रेडेंशियल पाएं. इनका इस्तेमाल, Earth Engine को चालू करने के लिए करें.

import ee

# Get some new credentials since the other ones are cloud scope.
ee_creds = ee.ServiceAccountCredentials(SERVICE_ACCOUNT, KEY)
ee.Initialize(ee_creds)

कैलकुलेशन तय करना

क्लाइंट एपीआई की मदद से, सामान्य तौर पर होने वाली कंप्यूटिंग का प्रोटोटाइप बनाएं. ध्यान दें कि कैलकुलेशन का नतीजा Image है.

coords = [
  -121.58626826832939,
  38.059141484827485,
]
region = ee.Geometry.Point(coords)

collection = ee.ImageCollection('COPERNICUS/S2')
collection = collection.filterBounds(region)
collection = collection.filterDate('2020-04-01', '2020-09-01')
image = collection.median()

एक्सप्रेशन ग्राफ़ को क्रम से लगाना

इससे एक ऐसा ऑब्जेक्ट बनेगा जो Earth Engine एक्सप्रेशन ग्राफ़ (खास तौर पर, Expression) को दिखाता है. आम तौर पर, आपको इन्हें क्लाइंट एपीआई में से किसी एक की मदद से बनाना चाहिए.

serialized = ee.serializer.encode(image)

अपनी ज़रूरत के हिसाब से प्रोजेक्शन (WGS84) और स्केल (Sentinel-2 के लिए 10 मीटर) बनाएं. इसका इस्तेमाल सिर्फ़ डिग्री में, प्रोजेक्शन की ज़रूरी स्केल का पता लगाने के लिए किया जाता है. इन स्केल का इस्तेमाल, अनुरोध में अफ़ाइन ट्रांसफ़ॉर्म तय करने के लिए किया जाएगा.

# Make a projection to discover the scale in degrees.
proj = ee.Projection('EPSG:4326').atScale(10).getInfo()

# Get scales out of the transform.
scale_x = proj['transform'][0]
scale_y = -proj['transform'][4]

अनुरोध भेजें

computePixels एंडपॉइंट पर POST अनुरोध करें. ध्यान दें कि अनुरोध में Expression शामिल है, जो कि क्रम से किया गया हिसाब है. इसमें PixelGrid भी शामिल है. PixelGrid में, मनमुताबिक आउटपुट के लिए dimensions और अनुरोध किए गए कोऑर्डिनेट सिस्टम की इकाइयों में AffineTransform शामिल होता है. यहां कोऑर्डिनेट सिस्टम भौगोलिक है. इसलिए, ट्रांसफ़ॉर्म को डिग्री में स्केल और अनुरोध किए गए इमेज पैच के ऊपरी बाएं कोने के भौगोलिक निर्देशांकों के साथ तय किया गया है.

import json

url = 'https://earthengine.googleapis.com/v1beta/projects/{}/image:computePixels'
url = url.format(PROJECT)

response = session.post(
  url=url,
  data=json.dumps({
    'expression': serialized,
    'fileFormat': 'PNG',
    'bandIds': ['B4','B3','B2'],
    'grid': {
      'dimensions': {
        'width': 640,
        'height': 640
      },
      'affineTransform': {
        'scaleX': scale_x,
        'shearX': 0,
        'translateX': coords[0],
        'shearY': 0,
        'scaleY': scale_y,
        'translateY': coords[1]
      },
      'crsCode': 'EPSG:4326',
    },
    'visualizationOptions': {'ranges': [{'min': 0, 'max': 3000}]},
  })
)

image_content = response.content

अगर इसे नोटबुक में चलाया जा रहा है, तो IPython इमेज डिसप्ले विजेट का इस्तेमाल करके नतीजे दिखाए जा सकते हैं.

# Import the Image function from the IPython.display module.
from IPython.display import Image
Image(image_content)