Quickstart

Bu kılavuzda, Google Colab'i kullanarak Python'dan Earth Engine REST API'ye hızlıca sorgu göndermeye nasıl başlayacağınız açıklanmaktadır. Aynı kavramlar, API'ye diğer dillerden ve ortamlardan erişim için de geçerlidir.

Not: REST API, tüm kullanıcılar için uygun olmayabilecek yeni ve ileri seviye özellikler içerir. Earth Engine'i kullanmaya yeni başladıysanız lütfen JavaScript kılavuzunu inceleyin.

Başlamadan önce

Aşağıdaki işlemleri yapmak için bu talimatları uygulayın:

Colab not defterinizi ayarlama

Bu hızlı başlangıç kılavuzunu sıfırdan başlatıyorsanız Colab başlangıç sayfasından YENİ NOT DEFTERİ'ni tıklayarak yeni bir Colab not defteri oluşturabilir ve aşağıdaki kod örneklerini yeni bir kod hücresine girebilirsiniz. Colab'de Cloud SDK zaten yüklüdür. Bu SDK, Cloud hizmetlerini yönetmek için kullanabileceğiniz gcloud komut satırı aracını içerir. Alternatif olarak, bu sayfanın başındaki düğmeyi kullanarak demo not defterini çalıştırabilirsiniz.

Google Cloud'da kimlik doğrulama

İlk olarak, Google Cloud'a kimliği doğrulanmış istekler gönderebilmek için giriş yapmanız gerekir.

Colab'de şunları çalıştırabilirsiniz:

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

(Yerel olarak çalıştırıyorsanız ve Cloud SDK'yı yüklediyseniz komut satırından da çalıştırabilirsiniz:)

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

Google kullanıcı hesabınızı kullanarak giriş yapma seçeneğini kabul edin ve oturum açma işlemini tamamlayın.

Hizmet hesabınız için özel anahtar dosyası alma

Kimlik doğrulamak için hizmet hesabını kullanabilmeniz için önce bir özel anahtar dosyası indirmeniz gerekir. Bunu Colab'de yapmak için not defteri sanal makinesine indirin:

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}

Alternatif olarak komut satırından da yapabilirsiniz:

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

Kimlik bilgilerinize erişme ve bunları test etme

Artık Earth Engine API'ye ilk sorgunuzu göndermeye hazırsınız. Kimlik bilgilerini almak için özel anahtarı kullanın. HTTP istekleri göndermek için yetkili bir oturum oluşturmak üzere kimlik bilgilerini kullanın. Bu kodu Colab not defterinizin yeni bir kod hücresine girebilirsiniz. (Komut satırı kullanıyorsanız gerekli kitaplıkların yüklü olduğundan emin olmanız gerekir).

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

Her şey doğru şekilde yapılandırıldıysa bu komut çalıştırıldığında aşağıdaki gibi bir çıkış elde edilir:

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

Veri kümesi seçme

code.earthengine.google.com adresindeki Earth Engine Kod Düzenleyici'yi kullanarak mevcut veri kümelerini arayabilir ve keşfedebilirsiniz. Şimdi Sentinel 2 verilerini arayalım. (Kod Düzenleyici'yi ilk kez kullanıyorsanız oturum açtığınızda sizin adınıza Earth Engine'e erişmesi için yetkilendirmeniz istenir.) Kod Düzenleyici'nin üst kısmındaki arama kutusunda "sentinel" araması yapın. Birkaç raster veri kümesi görünür:

"Sentinel-2: MultiSpectral Instrument (MSI), Level-1C"yi tıklayın:

Bunun gibi veri kümesi açıklama sayfaları, Earth Engine Genel Veri Kataloğu'ndaki herhangi bir veri kümesini kullanmak için ihtiyacınız olan kritik bilgileri içerir. Bu bilgiler arasında veri kümesinin kısa bir açıklaması, ek ayrıntılar için veri sağlayıcının bağlantıları, veri kümesi için geçerli olabilecek kullanım kısıtlamaları hakkında bilgiler ve veri kümesinin Earth Engine öğe kimliği yer alır.

Bu durumda, pencerenin sağ tarafında bunun yolu COPERNICUS/S2_HARMONIZED olan bir resim koleksiyonu öğesi olduğunu görürüz.

Belirli görselleri sorgulama

Bu Sentinel-2 veri kümesi, 2015'ten günümüze kadar tüm dünyayı kapsayan iki milyondan fazla görüntü içerir. Nisan 2017'ye ait, Mountain View, Kaliforniya'da belirli bir noktayı içeren ve bulut örtüsü düşük olan bazı verileri bulmak için görüntü koleksiyonuna yönelik bir projects.assets.listImages sorgusu gönderelim.

import urllib

coords = [-122.085, 37.422]

project = 'projects/earthengine-public'
asset_id = 'COPERNICUS/S2_HARMONIZED'
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))

Bu komut dosyası, eşleşen görüntüler için koleksiyonu sorgular, elde edilen JSON yanıtının kodunu çözer ve eşleşen her resim öğesi için öğe kimliğini ve bulut örtüsünü yazdırır. Çıkış şu şekilde görünmelidir:

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

Bu ay içinde çekilmiş ve bulutluluk oranı düşük olan iki görüntü var.

Belirli bir resmi inceleme

Eşleşenlerden birinde neredeyse hiç bulut örtüsü yok. Kimliği COPERNICUS/S2_HARMONIZED/20170430T190351_20170430T190351_T10SEG olan bu öğeyi daha yakından inceleyelim. Tüm herkese açık katalog öğelerinin earthengine-public projesine ait olduğunu unutmayın. Aşağıdaki Python snippet'i, belirli bir öğenin ayrıntılarını kimliğe göre almak için projects.assets.get sorgusu gönderir, mevcut veri bantlarını yazdırır ve ilk bant hakkında daha ayrıntılı bilgi verir:

asset_id = 'COPERNICUS/S2_HARMONIZED/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))

Çıkış şu şekilde görünmelidir:

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"
}

Veri bantlarının listesi, daha önce veri kümesi açıklamasında gördüğümüzle aynıdır. Bu veri kümesinde EPSG:32610 koordinat sisteminde veya UTM Bölgesi 10N'de 16 bit tam sayı verileri olduğunu görebiliriz. Bu ilk bandın kimliği B1 ve çözünürlüğü piksel başına 60 metredir. Resmin orijini, bu koordinat sisteminde (499980,4200000) konumundadır.

affineTransform.scaleY değerinin negatif olması, başlangıç noktasının genellikle olduğu gibi görüntünün kuzeybatı köşesinde olduğunu gösterir: y piksel dizinlerinin artması, y uzamsal koordinatlarının azalmasına (güneye doğru) karşılık gelir.

Piksel değerleri getiriliyor

Bu görüntünün yüksek çözünürlüklü bantlarından veri almak için bir projects.assets.getPixels sorgusu gönderelim. Veri kümesi açıklama sayfasında B2, B3, B4 ve B8 bantlarının piksel başına 10 metre çözünürlüğe sahip olduğu belirtiliyor. Bu komut dosyası, bu dört banttan sol üstteki 256x256 piksellik veri karosunu getirir. Verileri numpy NPY biçiminde yüklemek, yanıtın Python veri dizisine dönüştürülmesini kolaylaştırır.

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)

Çıkış şu şekilde görünmelidir:

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

Bu görüntüden farklı bir piksel grubu seçmek için affineTransform değerini buna göre belirtmeniz yeterlidir. affineTransform değerinin, görüntünün uzamsal koordinat referans sisteminde belirtildiğini unutmayın. Başlangıç noktasının konumunu piksel koordinatı koordinatlarında ayarlamak istiyorsanız şu basit formülü kullanın:

request_origin = image_origin + pixel_scale * offset_in_pixels

Küçük resim oluşturma

Bu görüntünün RGB küçük resmini oluşturmak için benzer bir mekanizma kullanabiliriz. Verileri doğal çözünürlüğünde istemek yerine, bir bölgeyi ve görüntü boyutlarını açıkça belirteceğiz. Görüntünün tamamının küçük resmini almak için görüntünün ayak izi geometrisini istek bölgesi olarak kullanabiliriz. Son olarak, kırmızı, yeşil ve mavi görüntü bantlarını ve uygun bir veri değerleri aralığını belirterek ilgi çekici bir RGB küçük resim elde edebiliriz.

Tüm bunları bir araya getirdiğimizde Python snippet'i aşağıdaki gibi görünür (Colab IPython resim görüntüleme widget'ı kullanılarak):

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)

Oluşturulan küçük resim şu şekildedir: