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:
- Earth Engine erişimini yapılandırma
- Hizmet hesabı oluşturma
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:
Google Colab'de çalıştır
Kaynağı GitHub'da görüntüle