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:
- Earth Engine erişimini yapılandırma
- Hizmet hesabı oluşturun.
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:
