Quickstart

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

Not: REST API, tüm kullanıcılar için uygun olmayabilecek yeni ve gelişmiş özellikler içerir. Earth Engine'i ilk kez kullanıyorsanız lütfen JavaScript kılavuzu ile başlayın.

Başlamadan önce

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

Colab not defterinizi ayarlama

Bu hızlı başlangıca sıfırdan başlıyorsanız Colab başlangıç sayfasında 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. Buna, Cloud hizmetlerini yönetmek için kullanabileceğiniz gcloud komut satırı aracı dahildir. Alternatif olarak, bu sayfanın başındaki düğmeyi kullanarak demo not defterini çalıştırın.

Google Cloud'da kimlik doğrulama

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

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

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

(Veya yerel olarak çalıştırıyorsanız Cloud SDK'nın yüklü olduğunu varsayarak komut satırından:)

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ı edinme

Hizmet hesabını kimlik doğrulamak için kullanmadan önce bir özel anahtar dosyası indirmeniz gerekir. Colab'de bunu yapmak için not defteri sanal makinesine indirme:

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:

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 Kimlik Bilgilerinizi 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. Bunu Colab not defterinizin yeni bir kod hücresine girebilirsiniz. (Komut satırını kullanıyorsanız gerekli kitaplıkların yüklendiğinden 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ılmışsa bu komut çalıştırıldığında aşağıdaki gibi bir çıktı oluşturulur:

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

Veri kümesi seçme

code.earthengine.google.com adresindeki Earth Engine Code Editor'ı 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şmek için yetkilendirmeniz istenir.) Kod Düzenleyici'de üstteki arama kutusuna "sentinel" yazarak arama yapın. Birkaç raster veri kümesi görünür:

"Sentinel-2: MultiSpectral Instrument (MSI), Level-1C" seçeneğini tıklayın:

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

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

Belirli Görüntüler İçin Sorgu

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

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

Bu komut dosyası, koleksiyonda eşleşen resimleri sorgular, sonuçtaki 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/20170420T184921_20170420T190203_T10SEG : 4.3166
COPERNICUS/S2/20170430T190351_20170430T190351_T10SEG : 0

Bu noktada, bu ay çekilmiş ve bulut örtüsü az olan iki görüntü olduğu anlaşılıyor.

Belirli bir resmi inceleme

Eşleşenlerden birinde bulut örtüsü neredeyse hiç yok. Kimliği COPERNICUS/S2/20170430T190351_20170430T190351_T10SEG olan bu öğeyi daha yakından inceleyelim. Herkese açık katalogdaki tüm öğelerin earthengine-public projesine ait olduğunu unutmayın. Aşağıda, kimliğe göre belirli bir öğenin ayrıntılarını getirmek, kullanılabilir veri bantlarını yazdırmak ve ilk bant hakkında daha ayrıntılı bilgiler yazdırmak için projects.assets.get sorgusu yayınlayacak bir Python snippet'i verilmiştir:

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

Çı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ı listesi, daha önce veri kümesi açıklamasında gördüğümüzle aynıdır. Bu veri kümesinin EPSG:32610 koordinat sisteminde (UTM Bölgesi 10N) 16 bitlik tam sayı verileri içerdiğini görüyoruz. Bu ilk bant, B1 kimliğine ve piksel başına 60 metre çözünürlüğe sahiptir. Resmin başlangıç noktası, bu koordinat sisteminde (499980,4200000) konumundadır.

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

Piksel Değerlerini Getirme

Bu görüntünün yüksek çözünürlüklü bantlarından bazı verileri getirmek için 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ı, söz konusu dört banttan 256x256 piksellik sol üst veri parçasını getirir. Verilerin numpy NPY biçiminde yüklenmesi, yanıtın Python veri dizisine kodunu çözmeyi 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 resimden farklı bir piksel grubu seçmek için affineTransform değerini buna göre belirtmeniz yeterlidir. affineTransform değerinin, resmin uzamsal koordinat referans sisteminde belirtildiğini unutmayın. Başlangıç noktasının konumunu piksel 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 resmin RGB küçük resmini oluşturmak için benzer bir mekanizma kullanabiliriz. Verileri doğal çözünürlüğünde istemek yerine, bölgeyi ve görüntü boyutlarını açıkça belirteceğiz. Resmin tamamının küçük resmini almak için istek bölgesi olarak resmin ayak izi geometrisini kullanabiliriz. Son olarak, kırmızı, yeşil ve mavi görüntü bantlarını ve uygun bir veri değeri aralığını belirterek çekici bir RGB küçük resmi elde edebiliriz.

Tüm bunları bir araya getirdiğimizde Python snippet'i şu şekilde 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)

Sonuç olarak elde edilen küçük resim: