İstemci ve sunucu

Python ve JavaScript için Earth Engine istemci kitaplıkları, karmaşık coğrafi analizleri Earth Engine isteklerine dönüştürür. Bir istemci kitaplığı için yazdığınız kod, istemci tarafındaki nesnelere ve sunucu tarafındaki nesneleri temsil eden değişkenlere yönelik referansların bir karışımını içerebilir.

Earth Engine nesnelerini, kodunuzda bulunabilecek diğer Python veya JavaScript nesnelerinden ya da primitiflerden ayırt etmek önemlidir. Komut dosyanızdaki istemci tarafı "proxy" nesnelerini değiştirerek sunucudaki nesneleri değiştirebilirsiniz. Proxy nesnelerini ee ile başlayan her şey olarak tanıyabilirsiniz. Bu Earth Engine proxy nesneleri gerçek veri içermez ve yalnızca sunucudaki nesnelerin Başlamak için istemci tarafı bir dize nesnesini (proxy nesnesi DEĞİL) düşünün:

Kod Düzenleyici (JavaScript)

var clientString = 'I am a String';
print(typeof clientString);  // string

Python kurulumu

Python API'si ve etkileşimli geliştirme için geemap kullanımı hakkında bilgi edinmek üzere Python Ortamı sayfasına bakın.

import ee
import geemap.core as geemap

Colab (Python)

client_string = 'I am a String'
print(type(client_string))  # str

Çıktıda, istemcinin (web tarayıcısı veya not defteri) bu kodu yorumlayıp çalıştırdığını ve değişkenin string türü olduğunu belirlediğini gözlemleyin. Şimdi Earth Engine'ın bu dizeyle bir işlem yapmasını istediğinizi varsayalım. Bunun için dizeyi güzel bir kapsayıcıya sarmalayarak Google'a göndermeniz gerekir. Bu kapsayıcı, proxy nesnesi olur. Aşağıda bununla ilgili bir örnek verilmiştir:

Kod Düzenleyici (JavaScript)

var serverString = ee.String('I am not a String!');
print(typeof serverString);  // object
print('Is this an EE object?',
    serverString instanceof ee.ComputedObject);  // true

Python kurulumu

Python API'si ve etkileşimli geliştirme için geemap kullanımı hakkında bilgi edinmek üzere Python Ortamı sayfasına bakın.

import ee
import geemap.core as geemap

Colab (Python)

server_string = ee.String('I am not a String!')
print(type(server_string))  # ee.ee_string.String
print(
    'Is this an EE object?', isinstance(server_string, ee.ee_string.String)
)  # True

Çıktıda ee.String değerinin string DEĞİL, object olduğunu görebilirsiniz. Daha ayrıntılı olarak belirtmek gerekirse, ee.computedObject bir ee.computedObject türüdür. ee.Thing'ü, bir öğeyi Google'a göndermek için bir kapsayıcıya yerleştirme yöntemi olarak düşünebilirsiniz. Müşteriniz, kapsülün içinde ne olduğunu bilmez ancak siz yazdırarak ne olduğunu öğrenebilirsiniz:

Kod Düzenleyici (JavaScript)

print(serverString);  // I am not a String

Python kurulumu

Python API'si ve etkileşimli geliştirme için geemap kullanımı hakkında bilgi edinmek üzere Python Ortamı sayfasına bakın.

import ee
import geemap.core as geemap

Colab (Python)

print(server_string.getInfo())  # I am not a String

Kapsayıcının nasıl göründüğünü görmek için nesnenin dize temsilini yazdırın:

Kod Düzenleyici (JavaScript)

print(serverString.toString());  // ee.String("I am not a String!")

Python kurulumu

Python API'si ve etkileşimli geliştirme için geemap kullanımı hakkında bilgi edinmek üzere Python Ortamı sayfasına bakın.

import ee
import geemap.core as geemap

Colab (Python)

print(server_string)  # ee.String({"constantValue": "I am not a String!"})

Kapsayıcıdaki öğeleri değiştirmek için istemcide çalışan Python veya JavaScript'i kullanmanız gerekiyorsa kapsayıcının içeriğini almak ve bir değişkene atamak için getInfo()'ü kullanın:

Kod Düzenleyici (JavaScript)

var someString = serverString.getInfo();
var strings = someString + '  Am I?';
print(strings);  // I am not a String!  Am I?

Python kurulumu

Python API'si ve etkileşimli geliştirme için geemap kullanımı hakkında bilgi edinmek üzere Python Ortamı sayfasına bakın.

import ee
import geemap.core as geemap

Colab (Python)

some_string = server_string.getInfo()
strings = some_string + '  Am I?'
print(strings)  # I am not a String!  Am I?

Döngü şeklinde oynatma

İstemci, sunucu tarafı ee.Thing nesnelerinde ne olduğunu bilmediği için koşullu ifadeler ve for döngüleri gibi istemci tarafı işlemleri bu nesnelerde çalışmaz. Bu nedenle ve getInfo() için eşzamanlı çağrıları önlemek amacıyla mümkün olduğunca sunucu işlevlerini kullanın. Örneğin, liste oluşturmanın aşağıdaki iki yolunu düşünün:

Önerilmeyen: istemci tarafında for döngüsü

Kod Düzenleyici (JavaScript)

var clientList = [];
for(var i = 0; i < 8; i++) {
  clientList.push(i + 1);
}
print(clientList);

Python kurulumu

Python API'si ve etkileşimli geliştirme için geemap kullanımı hakkında bilgi edinmek üzere Python Ortamı sayfasına bakın.

import ee
import geemap.core as geemap

Colab (Python)

client_list = []
for i in range(8):
  client_list.append(i + 1)
print(client_list)

Önerilen: sunucu tarafı eşleme

Kod Düzenleyici (JavaScript)

var serverList = ee.List.sequence(0, 7);
serverList = serverList.map(function(n) {
  return ee.Number(n).add(1);
});
print(serverList);

Python kurulumu

Python API'si ve etkileşimli geliştirme için geemap kullanımı hakkında bilgi edinmek üzere Python Ortamı sayfasına bakın.

import ee
import geemap.core as geemap

Colab (Python)

server_list = ee.List.sequence(0, 7)
server_list = server_list.map(lambda n: ee.Number(n).add(1))
print(server_list.getInfo())

Sunucu tarafı eşleme örneği biraz saçmadır çünkü aynı listeyi yalnızca ee.List.sequence(1, 8) ile oluşturabilirsiniz, ancak bazı önemli kavramları göstermektedir. İlk kavram, listedeki her şeye aynı işlevi uygulayan map()'tür. Bu işlev sunucuda yürütüldüğü için getInfo() ve print() gibi istemci tarafı işlevler, eşlenen bir işlevde çalışmaz. Bu nedenle, i + 1 kodunun eşdeğer sunucu tarafı koduyla (ee.Number(n).add(1)) değiştirilmesi gerekir. Önemli bir nokta, n'ün yalnızca sunucuda bulunan bir nesne olmasıdır. İşlev, bağımsız değişkeninin türünü bilmediği için ee.Number olarak yayınlanmalıdır.

(İstemcide hangi işlevlerin çalıştırıldığına dair açıklama için İstemci ve sunucu işlevleriyle ilgili bölüme bakın.)

Bazen istemci tarafı işlevlerin kullanışlı olduğunu da belirtmek isteriz. Örneğin, önceki for döngüsü bir liste oluşturmak ve bunu sunucu tarafı bir nesneyle sarmalamak için kullanılabilir:

Kod Düzenleyici (JavaScript)

var toServerList = ee.List(clientList);

Python kurulumu

Python API'si ve etkileşimli geliştirme için geemap kullanımı hakkında bilgi edinmek üzere Python Ortamı sayfasına bakın.

import ee
import geemap.core as geemap

Colab (Python)

to_server_list = ee.List(client_list)

İstemci tarafı işlemenin dizüstü bilgisayarınızda veya tarayıcınızda, ana makinenin CPU'sunda yapıldığını unutmayın. Bu nedenle, sunucudaki işi yapmak için Earth Engine'ı kullanmaktan daha az verimli olabilir. Ayrıca, beklenmedik sonuçlarla karşılaşmamak için komut dosyalarınızda istemci ve sunucu işlevlerini karıştırmaktan kaçının. Koşullu ifadeler bölümünde, istenmeyen sonuçlara dair bir örnek verilmiştir.

Koşullu ifadeler

Sunucu tarafı nesneler, istemci tarafı işlevleriyle her zaman birlikte çalışmaz ve bunun tersi de geçerlidir. Örneğin, sunucu tarafı Boole değişkeni durumunu düşünün:

Kod Düzenleyici (JavaScript)

var myList = ee.List([1, 2, 3]);
var serverBoolean = myList.contains(5);
print(serverBoolean);  // false

Python kurulumu

Python API'si ve etkileşimli geliştirme için geemap kullanımı hakkında bilgi edinmek üzere Python Ortamı sayfasına bakın.

import ee
import geemap.core as geemap

Colab (Python)

my_list = ee.List([1, 2, 3])
server_boolean = my_list.contains(5)
print(server_boolean.getInfo())  # False

Aşağıdaki örnekte gösterildiği gibi, değişken sunucu tarafı bir nesne olduğundan istemci tarafı koşullu olarak davranmaz. Sunucu tarafı bir boole değerini doğru şekilde kontrol etmek için sunucu tarafı işlevi kullanın:

Önerilmeyen: istemci tarafı koşullu

Kod Düzenleyici (JavaScript)

var clientConditional;
if (serverBoolean) {
  clientConditional = true;
} else {
  clientConditional = false;
}
print('Should be false:', clientConditional);  // True!

Python kurulumu

Python API'si ve etkileşimli geliştirme için geemap kullanımı hakkında bilgi edinmek üzere Python Ortamı sayfasına bakın.

import ee
import geemap.core as geemap

Colab (Python)

if server_boolean:
  client_conditional = True
else:
  client_conditional = False
print('Should be False:', client_conditional)  # True!

Önerilir: Sunucu tarafı koşullu

Kod Düzenleyici (JavaScript)

var serverConditional = ee.Algorithms.If(serverBoolean, 'True!', 'False!');
print('Should be false:', serverConditional);  // False!

Python kurulumu

Python API'si ve etkileşimli geliştirme için geemap kullanımı hakkında bilgi edinmek üzere Python Ortamı sayfasına bakın.

import ee
import geemap.core as geemap

Colab (Python)

server_conditional = ee.Algorithms.If(server_boolean, 'True!', 'False!')
print('Should be False:', server_conditional.getInfo())  # False!

İstemci ve Sunucu İşlevleri

Önceki bölümlerde, istemci ve sunucu nesnelerini ve işlevlerini karıştırmanın neden verimsiz veya mantıksız olduğuna dair çeşitli nedenler açıklanmaktadır. Hangi nesneler ve işlevler istemci tarafında, hangileri ise sunucu tarafında? Genel olarak, ee.Thing olarak başlatılan her şey bir sunucu nesnesi, bu nesnedeki her yöntem (ee.Thing.method()) ise bir sunucu işlevidir. Python veya JavaScript referansında görünen nesneler ve işlevler istemci taraflıdır. Daha önce de belirtildiği gibi, bir nesne oluşturmak için istemci tarafı işlevini kullanabilir, ardından istemci tarafı nesneyi bir Earth Engine oluşturucusuna (ör. ee.String()) sağlayarak sarmalayabilirsiniz.