Quickstart

এই নির্দেশিকাটি ব্যাখ্যা করে কিভাবে আপনি Google Colab ব্যবহার করে পাইথন থেকে আর্থ ইঞ্জিন REST API-এ কোয়েরি ইস্যু করা শুরু করতে পারেন। একই ধারণা অন্যান্য ভাষা এবং পরিবেশ থেকে API অ্যাক্সেস করার ক্ষেত্রে প্রযোজ্য।

দ্রষ্টব্য: REST API-এ নতুন এবং উন্নত বৈশিষ্ট্য রয়েছে যা সমস্ত ব্যবহারকারীর জন্য উপযুক্ত নাও হতে পারে৷ আপনি যদি আর্থ ইঞ্জিনে নতুন হন, অনুগ্রহ করে জাভাস্ক্রিপ্ট নির্দেশিকা দিয়ে শুরু করুন।

আপনি শুরু করার আগে

এই নির্দেশাবলী অনুসরণ করুন:

আপনার Colab নোটবুক সেট-আপ করুন

আপনি যদি এই কুইকস্টার্টটি স্ক্র্যাচ থেকে শুরু করেন, তাহলে Colab স্টার্ট পৃষ্ঠা থেকে NEW NOTEBOOK-এ ক্লিক করে একটি নতুন Colab নোটবুক তৈরি করতে পারেন এবং একটি নতুন কোড সেলে নীচের কোডের নমুনাগুলি লিখতে পারেন। Colab-এ ইতিমধ্যেই Cloud SDK ইনস্টল করা আছে। এর মধ্যে রয়েছে gcloud কমান্ড-লাইন টুল যা আপনি ক্লাউড পরিষেবাগুলি পরিচালনা করতে ব্যবহার করতে পারেন। বিকল্পভাবে, এই পৃষ্ঠার শুরুতে বোতাম থেকে ডেমো নোটবুক চালান।

Google ক্লাউডে প্রমাণীকরণ করুন

প্রথম জিনিসটি লগইন করতে হবে যাতে আপনি Google ক্লাউডে প্রমাণীকৃত অনুরোধ করতে পারেন।

Colab-এ আপনি চালাতে পারেন:

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

(অথবা যদি আপনি স্থানীয়ভাবে চালাচ্ছেন, একটি কমান্ড লাইন থেকে, ধরে নিচ্ছেন যে আপনি ক্লাউড SDK ইনস্টল করেছেন :)

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

আপনার Google ব্যবহারকারী অ্যাকাউন্ট ব্যবহার করে লগ ইন করার বিকল্পটি গ্রহণ করুন এবং সাইন-ইন প্রক্রিয়াটি সম্পূর্ণ করুন৷

আপনার পরিষেবা অ্যাকাউন্টের জন্য একটি ব্যক্তিগত কী ফাইল পান

আপনি প্রমাণীকরণের জন্য পরিষেবা অ্যাকাউন্ট ব্যবহার করার আগে, আপনাকে অবশ্যই একটি ব্যক্তিগত কী ফাইল ডাউনলোড করতে হবে। Colab-এ সেটি করতে, নোটবুক 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

আপনার শংসাপত্রগুলি অ্যাক্সেস এবং পরীক্ষা করা

আপনি এখন আর্থ ইঞ্জিন API এ আপনার প্রথম প্রশ্ন পাঠাতে প্রস্তুত৷ শংসাপত্র পেতে ব্যক্তিগত কী ব্যবহার করুন। HTTP অনুরোধ করার জন্য একটি অনুমোদিত সেশন তৈরি করতে প্রমাণপত্রাদি ব্যবহার করুন। আপনি এটি আপনার 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আর্থ ইঞ্জিন কোড এডিটর ব্যবহার করে উপলব্ধ ডেটাসেটগুলি অনুসন্ধান এবং অন্বেষণ করতে পারেন৷ আসুন কিছু সেন্টিনেল 2 ডেটা সন্ধান করি। (যদি এটি আপনার প্রথমবার কোড এডিটর ব্যবহার করা হয় তবে আপনি সাইন ইন করার সময় আপনার পক্ষ থেকে আর্থ ইঞ্জিন অ্যাক্সেস করার জন্য এটি অনুমোদন করার জন্য আপনাকে অনুরোধ করা হবে।) কোড এডিটরে, উপরের দিকে অনুসন্ধান বাক্সে "সেন্টিনেল" অনুসন্ধান করুন। বেশ কয়েকটি রাস্টার ডেটাসেট উপস্থিত হয়:

"সেন্টিনেল-2: মাল্টিস্পেকট্রাল ইন্সট্রুমেন্ট (MSI), লেভেল-1C" এ ক্লিক করুন:

এই ধরনের ডেটাসেট বিবরণ পৃষ্ঠাগুলিতে আর্থ ইঞ্জিন পাবলিক ডেটা ক্যাটালগের যেকোনো ডেটাসেট ব্যবহার করার জন্য আপনার প্রয়োজনীয় গুরুত্বপূর্ণ তথ্য অন্তর্ভুক্ত থাকে, যার মধ্যে ডেটাসেটের একটি সংক্ষিপ্ত বিবরণ, অতিরিক্ত বিবরণ পেতে ডেটা প্রদানকারীর লিঙ্ক, ডেটাসেটে প্রযোজ্য হতে পারে এমন কোনো ব্যবহার বিধিনিষেধ সম্পর্কে তথ্য এবং ডেটাসেটের আর্থ ইঞ্জিন সম্পদ আইডি অন্তর্ভুক্ত থাকে।

এই ক্ষেত্রে আমরা উইন্ডোর ডানদিকে দেখতে পাচ্ছি যে এটি একটি চিত্র সংগ্রহ সম্পদ যার পথ হল COPERNICUS/S2

বিশেষ ছবি জন্য ক্যোয়ারী

এই সেন্টিনেল-2 ডেটাসেটে 2015 থেকে বর্তমান পর্যন্ত বিশ্বকে কভার করা দুই মিলিয়নেরও বেশি ছবি রয়েছে। মাউন্টেন ভিউ, ক্যালিফোর্নিয়ার একটি নির্দিষ্ট বিন্দু অন্তর্ভুক্ত কম ক্লাউড কভার সহ এপ্রিল, 2017 থেকে কিছু ডেটা খুঁজে পেতে ছবির সংগ্রহের বিরুদ্ধে একটি projects.assets.listImages কোয়েরি জারি করা যাক।

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 অন্তর্গত। এখানে একটি পাইথন স্নিপেট রয়েছে যা একটি 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 কোঅর্ডিনেট সিস্টেম বা UTM জোন 10N-এ 16-বিট পূর্ণসংখ্যা ডেটা রয়েছে। এই প্রথম ব্যান্ডটির আইডি B1 এবং প্রতি পিক্সেল 60 মিটার রেজোলিউশন রয়েছে। এই স্থানাঙ্ক ব্যবস্থায় চিত্রটির উৎপত্তি অবস্থানে (499980,4200000)।

affineTransform.scaleY এর নেতিবাচক মান ইঙ্গিত করে যে উত্সটি চিত্রের উত্তর-পশ্চিম কোণে রয়েছে, যেমনটি সাধারণত হয়: y পিক্সেল সূচক বৃদ্ধি y স্থানিক স্থানাঙ্ক (দক্ষিণে শিরোনাম) হ্রাসের সাথে মিলে যায়।

পিক্সেল মান আনা হচ্ছে

এই ছবিটির উচ্চ রেজোলিউশন ব্যান্ডগুলি থেকে কিছু ডেটা আনার জন্য একটি projects.assets.getPixels কোয়েরি ইস্যু করা যাক৷ ডেটাসেট বর্ণনার পৃষ্ঠাটি বলে যে B2 , B3 , B4 এবং B8 ব্যান্ডগুলির রেজোলিউশন প্রতি পিক্সেল 10 মিটার। এই স্ক্রিপ্টটি সেই চারটি ব্যান্ড থেকে ডেটার উপরের-বাম 256x256-পিক্সেল টাইল নিয়ে আসে। numpy NPY ফরম্যাটে ডেটা লোড করা একটি পাইথন ডেটা অ্যারেতে প্রতিক্রিয়া ডিকোড করা সহজ করে তোলে।

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

একটি থাম্বনেইল ছবি তৈরি করা হচ্ছে

এই চিত্রটির একটি RGB থাম্বনেইল তৈরি করতে আমরা একটি অনুরূপ প্রক্রিয়া ব্যবহার করতে পারি। এর নেটিভ রেজোলিউশনে ডেটা অনুরোধ করার পরিবর্তে, আমরা একটি অঞ্চল এবং চিত্রের মাত্রা স্পষ্টভাবে নির্দিষ্ট করব। সম্পূর্ণ চিত্রটির একটি থাম্বনেইল পেতে, আমরা অনুরোধ অঞ্চল হিসাবে চিত্রটির পদচিহ্ন জ্যামিতি ব্যবহার করতে পারি। পরিশেষে, লাল, সবুজ এবং নীল চিত্র ব্যান্ড এবং ডেটা মানগুলির একটি উপযুক্ত পরিসর নির্দিষ্ট করে, আমরা একটি আকর্ষণীয় RGB থাম্বনেইল চিত্র পেতে পারি।

এই সব একসাথে রাখলে, পাইথন স্নিপেট এইরকম দেখায় (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)

এখানে ফলের থাম্বনেইল ইমেজ আছে: