Quickstart

इस गाइड में बताया गया है कि Google Colab का इस्तेमाल करके, Python से Earth Engine REST API को क्वेरी भेजने का तरीका क्या है. एपीआई को अन्य भाषाओं और एनवायरमेंट से ऐक्सेस करने के लिए भी यही सिद्धांत लागू होते हैं.

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

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

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

Colab notebook सेट अप करना

अगर आपको यह क्विकस्टार्ट शुरू से करना है, तो Colab के शुरुआती पेज पर जाकर, नई नोटबुक पर क्लिक करके एक नई Colab नोटबुक बनाएं. इसके बाद, नीचे दिए गए कोड के सैंपल को नई कोड सेल में डालें. Colab में Cloud SDK पहले से इंस्टॉल होता है. इसमें gcloud कमांड-लाइन टूल शामिल है. इसका इस्तेमाल Cloud सेवाओं को मैनेज करने के लिए किया जा सकता है. इसके अलावा, इस पेज की शुरुआत में मौजूद बटन से डेमो नोटबुक चलाएं.

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

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

Colab में, ये काम किए जा सकते हैं:

PROJECT = 'my-project'
!gcloud auth login --project {PROJECT}

(अगर आपको इसे स्थानीय तौर पर चलाना है, तो कमांड लाइन से चलाएं. इसके लिए, Cloud SDK इंस्टॉल होना चाहिए:)

PROJECT='my-project'
gcloud auth login --project $PROJECT

अपने Google उपयोगकर्ता खाते का इस्तेमाल करके लॉग इन करने का विकल्प स्वीकार करें और साइन-इन की प्रोसेस पूरी करें.

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

सेवा खाते का इस्तेमाल करके पुष्टि करने से पहले, आपको निजी कुंजी वाली फ़ाइल डाउनलोड करनी होगी. Colab में ऐसा करने के लिए, notebook VM में डाउनलोड करें:

SERVICE_ACCOUNT='foo-name@project-name.iam.gserviceaccount.com'
KEY = 'my-secret-key.json'
!gcloud iam service-accounts keys create {KEY} --iam-account {SERVICE_ACCOUNT}

इसके अलावा, कमांड लाइन से भी ऐसा किया जा सकता है:

SERVICE_ACCOUNT='foo-name@project-name.iam.gserviceaccount.com'
KEY='my-secret-key.json'
gcloud iam service-accounts keys create $KEY --iam-account $SERVICE_ACCOUNT

अपने क्रेडेंशियल ऐक्सेस करना और उनकी जांच करना

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

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/v1alpha/projects/earthengine-public/assets/LANDSAT'

response = session.get(url)

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

अगर सब कुछ सही तरीके से कॉन्फ़िगर किया गया है, तो इसे चलाने पर ऐसा आउटपुट मिलेगा:

{'id': 'LANDSAT',
 'name': 'projects/earthengine-public/assets/LANDSAT',
 'type': 'FOLDER'}

कोई डेटासेट चुनें

code.earthengine.google.com पर जाकर, Earth Engine Code Editor का इस्तेमाल करके, उपलब्ध डेटासेट खोजे और एक्सप्लोर किए जा सकते हैं. आइए, Sentinel 2 का कुछ डेटा खोजें. (अगर आपने Code Editor का इस्तेमाल पहले कभी नहीं किया है, तो साइन इन करने पर आपसे इसे Earth Engine को ऐक्सेस करने की अनुमति देने के लिए कहा जाएगा.) कोड एडिटर में, सबसे ऊपर मौजूद खोज बॉक्स में "sentinel" खोजें. कई रास्टर डेटासेट दिखते हैं:

"Sentinel-2: MultiSpectral Instrument (MSI), Level-1C" पर क्लिक करें:

इस तरह के डेटासेट के ब्यौरे वाले पेजों में, Earth Engine के सार्वजनिक डेटा कैटलॉग में मौजूद किसी भी डेटासेट का इस्तेमाल करने के लिए ज़रूरी जानकारी शामिल होती है. जैसे, डेटासेट का संक्षिप्त ब्यौरा, ज़्यादा जानकारी पाने के लिए डेटा उपलब्ध कराने वाली कंपनी के लिंक, डेटासेट पर लागू होने वाली इस्तेमाल से जुड़ी पाबंदियों के बारे में जानकारी, और डेटासेट का Earth Engine ऐसेट आईडी.

इस मामले में, हमें विंडो की दाईं ओर दिखता है कि यह इमेज कलेक्शन ऐसेट है. इसका पाथ COPERNICUS/S2 है.

किसी खास इमेज के लिए क्वेरी करना

इस Sentinel-2 डेटासेट में, 2015 से लेकर अब तक की दुनिया की 20 लाख से ज़्यादा इमेज शामिल हैं. आइए, इमेज कलेक्शन के लिए projects.assets.listImages क्वेरी जारी करें. इससे हमें अप्रैल 2017 का ऐसा डेटा मिलेगा जिसमें बादल कम हों. साथ ही, इसमें कैलिफ़ोर्निया के माउंटेन व्यू का कोई खास पॉइंट शामिल हो.

import urllib

coords = [-122.085, 37.422]

project = 'projects/earthengine-public'
asset_id = 'COPERNICUS/S2'
name = '{}/assets/{}'.format(project, asset_id)
url = 'https://earthengine.googleapis.com/v1alpha/{}:listImages?{}'.format(
  name, urllib.parse.urlencode({
    'startTime': '2017-04-01T00:00:00.000Z',
    'endTime': '2017-05-01T00:00:00.000Z',
    'region': '{"type":"Point", "coordinates":' + str(coords) + '}',
    'filter': 'CLOUDY_PIXEL_PERCENTAGE < 10',
}))

response = session.get(url)
content = response.content

for asset in json.loads(content)['images']:
    id = asset['id']
    cloud_cover = asset['properties']['CLOUDY_PIXEL_PERCENTAGE']
    print('%s : %s' % (id, cloud_cover))

यह स्क्रिप्ट, मिलती-जुलती इमेज के लिए कलेक्शन को क्वेरी करती है. साथ ही, JSON रिस्पॉन्स को डिकोड करती है. इसके बाद, मिलती-जुलती हर इमेज ऐसेट के लिए, ऐसेट आईडी और क्लाउड कवर प्रिंट करती है. आउटपुट ऐसा दिखना चाहिए:

COPERNICUS/S2/20170420T184921_20170420T190203_T10SEG : 4.3166
COPERNICUS/S2/20170430T190351_20170430T190351_T10SEG : 0

इस पॉइंट पर, इस महीने की दो ऐसी इमेज मौजूद हैं जिनमें बादल कम हैं.

किसी इमेज की जांच करना

ऐसा लगता है कि किसी एक इमेज में बादल नहीं हैं. आइए, उस ऐसेट पर करीब से नज़र डालें जिसका आईडी COPERNICUS/S2/20170430T190351_20170430T190351_T10SEG है. ध्यान दें कि सभी सार्वजनिक कैटलॉग ऐसेट, प्रोजेक्ट earthengine-public से जुड़ी होती हैं. यहां Python का एक स्निपेट दिया गया है. यह आईडी के हिसाब से किसी ऐसेट की जानकारी पाने के लिए, projects.assets.get क्वेरी जारी करेगा. साथ ही, उपलब्ध डेटा बैंड प्रिंट करेगा और पहले बैंड के बारे में ज़्यादा जानकारी प्रिंट करेगा:

asset_id = 'COPERNICUS/S2/20170430T190351_20170430T190351_T10SEG'
name = '{}/assets/{}'.format(project, asset_id)
url = 'https://earthengine.googleapis.com/v1alpha/{}'.format(name)

response = session.get(url)
content = response.content

asset = json.loads(content)
print('Band Names: %s' % ','.join(band['id'] for band in asset['bands']))
print('First Band: %s' % json.dumps(asset['bands'][0], indent=2, sort_keys=True))

आउटपुट कुछ ऐसा दिखना चाहिए:

Band Names: B1,B2,B3,B4,B5,B6,B7,B8,B8A,B9,B10,B11,B12,QA10,QA20,QA60
First Band: {
  "dataType": {
    "precision": "INTEGER",
    "range": {
      "max": 65535
    }
  },
  "grid": {
    "affineTransform": {
      "scaleX": 60,
      "scaleY": -60,
      "translateX": 499980,
      "translateY": 4200000
    },
    "crsCode": "EPSG:32610",
    "dimensions": {
      "height": 1830,
      "width": 1830
    }
  },
  "id": "B1",
  "pyramidingPolicy": "MEAN"
}

डेटा बैंड की सूची, डेटासेट के ब्यौरे में पहले देखी गई सूची से मेल खाती है. हम देख सकते हैं कि इस डेटासेट में EPSG:32610 कोऑर्डिनेट सिस्टम या यूटीएम ज़ोन 10N में 16-बिट पूर्णांक डेटा है. इस पहले बैंड का आईडी B1 है और इसका रिज़ॉल्यूशन 60 मीटर प्रति पिक्सल है. इस निर्देशांक सिस्टम में इमेज का शुरुआती बिंदु, (499980,4200000) पर है.

affineTransform.scaleY की नेगेटिव वैल्यू से पता चलता है कि ओरिजन, इमेज के उत्तर-पश्चिम कोने में है. आम तौर पर ऐसा ही होता है: y पिक्सल इंडेक्स बढ़ने से, y स्पेशल कोऑर्डिनेट (दक्षिण की ओर) कम होते हैं.

Pixel की वैल्यू फ़ेच करना

आइए, इस इमेज के हाई रिज़ॉल्यूशन बैंड से कुछ डेटा पाने के लिए, projects.assets.getPixels क्वेरी जारी करें. डेटासेट की जानकारी वाले पेज पर बताया गया है कि बैंड B2, B3, B4, और B8 का रिज़ॉल्यूशन 10 मीटर प्रति पिक्सल है. यह स्क्रिप्ट, उन चार बैंड से डेटा की सबसे ऊपर बाईं ओर मौजूद 256x256 पिक्सल वाली टाइल को फ़ेच करती है. डेटा को numpy NPY फ़ॉर्मैट में लोड करने से, जवाब को Python डेटा ऐरे में डिकोड करना आसान हो जाता है.

import numpy
import io

name = '{}/assets/{}'.format(project, asset_id)
url = 'https://earthengine.googleapis.com/v1alpha/{}:getPixels'.format(name)
body = json.dumps({
    'fileFormat': 'NPY',
    'bandIds': ['B2', 'B3', 'B4', 'B8'],
    'grid': {
        'affineTransform': {
            'scaleX': 10,
            'scaleY': -10,
            'translateX': 499980,
            'translateY': 4200000,
        },
        'dimensions': {'width': 256, 'height': 256},
    },
})

pixels_response = session.post(url, body)
pixels_content = pixels_response.content

array = numpy.load(io.BytesIO(pixels_content))
print('Shape: %s' % (array.shape,))
print('Data:')
print(array)

आउटपुट ऐसा दिखना चाहिए:

Shape: (256, 256)
Data:
[[( 899, 586, 351, 189) ( 918, 630, 501, 248) (1013, 773, 654, 378) ...,
  (1014, 690, 419, 323) ( 942, 657, 424, 260) ( 987, 691, 431, 315)]
 [( 902, 630, 541, 227) (1059, 866, 719, 429) (1195, 922, 626, 539) ...,
  ( 978, 659, 404, 287) ( 954, 672, 426, 279) ( 990, 678, 397, 304)]
 [(1050, 855, 721, 419) (1257, 977, 635, 569) (1137, 770, 400, 435) ...,
  ( 972, 674, 421, 312) (1001, 688, 431, 311) (1004, 659, 378, 284)]
 ...,
 [( 969, 672, 375, 275) ( 927, 680, 478, 294) (1018, 724, 455, 353) ...,
  ( 924, 659, 375, 232) ( 921, 664, 438, 273) ( 966, 737, 521, 306)]
 [( 920, 645, 391, 248) ( 979, 728, 481, 327) ( 997, 708, 425, 324) ...,
  ( 927, 673, 387, 243) ( 927, 688, 459, 284) ( 962, 732, 509, 331)]
 [( 978, 723, 449, 330) (1005, 712, 446, 314) ( 946, 667, 393, 269) ...,
  ( 949, 692, 413, 271) ( 927, 689, 472, 285) ( 966, 742, 516, 331)]]

अगर आपको इस इमेज से पिक्सल का कोई दूसरा सेट चुनना है, तो affineTransform में अपनी ज़रूरत के हिसाब से बदलाव करें. ध्यान रखें कि affineTransform को इमेज के स्पेशल कोऑर्डिनेट रेफ़रंस सिस्टम में तय किया जाता है. अगर आपको ओरिजन की जगह को पिक्सल कोऑर्डिनेट में बदलना है, तो इस आसान फ़ॉर्मूले का इस्तेमाल करें:

request_origin = image_origin + pixel_scale * offset_in_pixels

थंबनेल इमेज जनरेट करना

हम इस इमेज का आरजीबी थंबनेल जनरेट करने के लिए, इसी तरह के तरीके का इस्तेमाल कर सकते हैं. हम इमेज के ओरिजनल रिज़ॉल्यूशन में डेटा का अनुरोध करने के बजाय, किसी क्षेत्र और इमेज के डाइमेंशन के बारे में साफ़ तौर पर बताएंगे. पूरी इमेज का थंबनेल पाने के लिए, हम इमेज के फ़ुटप्रिंट की ज्यामिति को अनुरोध क्षेत्र के तौर पर इस्तेमाल कर सकते हैं. आखिर में, लाल, हरे, और नीले रंग के इमेज बैंड और डेटा वैल्यू की सही रेंज तय करके, हम आरजीबी थंबनेल इमेज पा सकते हैं.

इन सभी को एक साथ रखने पर, Python स्निपेट ऐसा दिखता है. इसमें Colab IPython इमेज डिसप्ले विजेट का इस्तेमाल किया गया है:

url = 'https://earthengine.googleapis.com/v1alpha/{}:getPixels'.format(name)
body = json.dumps({
    'fileFormat': 'PNG',
    'bandIds': ['B4', 'B3', 'B2'],
    'region': asset['geometry'],
    'grid': {
        'dimensions': {'width': 256, 'height': 256},
    },
    'visualizationOptions': {
        'ranges': [{'min': 0, 'max': 3000}],
    },
})

image_response = session.post(url, body)
image_content = image_response.content

from IPython.display import Image
Image(image_content)

यहां थंबनेल इमेज दी गई है: