عمليات حسابية على الصور باستخدام Earth Engine REST API

ملاحظة: تحتوي واجهة REST API على ميزات جديدة ومتقدّمة قد لا تكون مناسبة لجميع المستخدمين. إذا كنت تستخدم Earth Engine للمرة الأولى، يُرجى البدء بقراءة دليل JavaScript.

يوضّح دليل البدء السريع لواجهة برمجة تطبيقات REST في Earth Engine كيفية الوصول إلى مجموعات من وحدات البكسل من مواد عرض 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 واختبار بيانات الاعتماد

اختبِر المفتاح الخاص من خلال استخدامه للحصول على بيانات الاعتماد. استخدِم بيانات الاعتماد لإنشاء جلسة معتمَدة لإرسال طلبات HTTP. قدِّم طلب 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) بالمقياس المطلوب (10 أمتار لصور Sentinel-2). هذا الإجراء يهدف فقط إلى تحديد المقياس المطلوب بالدرجات، وهي وحدات الإسقاط. سيتم استخدام هذه المقاييس لتحديد التحويل التشابهي في الطلب.

# 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]

إرسال الطلب

أرسِل طلب POST إلى نقطة النهاية computePixels. يُرجى العِلم أنّ الطلب يحتوي على 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)