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
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
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
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!")
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?
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);
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);
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.
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);
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
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!
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!
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.