Library klien Earth Engine untuk Python dan JavaScript menerjemahkan analisis geospasial yang rumit menjadi permintaan Earth Engine. Kode yang Anda tulis untuk library klien dapat berisi campuran referensi ke objek dan variabel sisi klien yang mewakili objek sisi server.
Penting untuk membedakan objek Earth Engine dari objek atau primitif Python atau JavaScript lainnya yang mungkin ada dalam kode Anda. Anda dapat memanipulasi objek di server dengan memanipulasi objek "proxy" sisi klien dalam skrip Anda. Anda dapat mengenali objek proxy sebagai apa pun yang diawali dengan ee
. Objek proxy Earth Engine ini tidak
berisi data sebenarnya dan hanya merupakan handle untuk objek di server. Untuk memulai, pertimbangkan
objek string sisi klien (yang BUKAN objek proxy):
Editor Kode (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
Amati dari output bahwa klien (browser web atau notebook) telah menafsirkan kode
ini dan menjalankannya, yang menentukan bahwa variabel
adalah jenis string
. Sekarang, misalkan Anda ingin Earth Engine dapat melakukan
sesuatu dengan string ini. Untuk melakukannya, Anda perlu menggabungkan string dalam penampung yang baik
dan mengirimkannya ke Google. Penampung tersebut adalah objek proxy. Berikut contohnya:
Editor Kode (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
Amati dari output bahwa ee.String
adalah object
,
BUKAN string
. Lebih khusus lagi, ini adalah ee.computedObject
, yang
berarti ini adalah objek proxy untuk sesuatu di server. Anggap ee.Thing
sebagai
cara memasukkan sesuatu ke dalam penampung untuk dikirim ke Google. Klien Anda tidak tahu
apa yang ada di dalam penampung, tetapi Anda dapat mengetahui isinya dengan mencetaknya:
Editor Kode (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
Untuk melihat tampilan penampung itu sendiri, cetak representasi string dari objek:
Editor Kode (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!"})
Jika, karena alasan tertentu, Anda perlu menggunakan Python atau JavaScript
yang berjalan di klien untuk memanipulasi apa pun yang ada dalam penampung, gunakan
getInfo()
untuk mendapatkan konten penampung dan menetapkannya ke variabel:
Editor Kode (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?
Pengulangan
Karena klien tidak mengetahui apa yang ada dalam objek ee.Thing
sisi server,
operasi sisi klien seperti kondisional dan loop for tidak berfungsi dengan objek tersebut. Oleh karena itu, dan untuk menghindari panggilan sinkron ke getInfo()
, gunakan fungsi server sebisa mungkin. Misalnya, pertimbangkan dua cara berikut untuk
membuat daftar:
Tidak direkomendasikan — loop for sisi klien
Editor Kode (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)
Direkomendasikan — pemetaan sisi server
Editor Kode (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())
Contoh pemetaan sisi server agak konyol karena Anda dapat membuat daftar yang sama
hanya dengan ee.List.sequence(1, 8)
, tetapi contoh ini mengilustrasikan beberapa konsep
penting. Konsep pertama adalah map()
yang hanya menerapkan fungsi yang sama
ke semua item dalam daftar. Karena fungsi ini dieksekusi di server, fungsi sisi klien seperti getInfo()
dan print()
tidak akan berfungsi dalam fungsi yang dipetakan. Oleh karena itu, kode i + 1
harus diganti dengan kode sisi server yang setara: ee.Number(n).add(1)
. Yang penting, n
adalah objek
yang hanya ada di server. Karena fungsi tidak mengetahui jenis argumennya, fungsi tersebut perlu ditransmisikan ke ee.Number
.
Perlu juga diperhatikan bahwa terkadang fungsi sisi klien lebih praktis. Misalnya, loop for sebelumnya dapat digunakan untuk membuat daftar dan menggabungkannya dengan objek sisi server:
Editor Kode (JavaScript)
var toServerList = ee.List(clientList);
import ee import geemap.core as geemap
Colab (Python)
to_server_list = ee.List(client_list)
Perhatikan bahwa pemrosesan sisi klien dilakukan di notebook atau browser, CPU mesin host, sehingga dapat kurang efisien daripada menggunakan Earth Engine untuk melakukan pekerjaan di server. Selain itu, untuk menghindari hasil yang berpotensi mengejutkan, sebaiknya hindari mencampur fungsi klien dan server dalam skrip Anda. Bagian Kondisi memberikan contoh konsekuensi yang mungkin tidak diinginkan.
Bersyarat
Objek sisi server tidak selalu berfungsi dengan fungsi sisi klien dan sebaliknya. Misalnya, pertimbangkan kasus variabel Boolean sisi server:
Editor Kode (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
Seperti yang ditunjukkan dalam contoh berikut, variabel tidak berperilaku dalam kondisional sisi klien karena merupakan objek sisi server. Untuk memeriksa boolean sisi server dengan benar, gunakan fungsi sisi server:
Tidak direkomendasikan — kondisional sisi klien
Editor Kode (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!
Direkomendasikan — kondisional sisi server
Editor Kode (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!
Fungsi Klien dan Server
Bagian sebelumnya menjelaskan beberapa alasan mengapa tidak efisien atau tidak logis untuk
mencampur objek dan fungsi klien dan server. Objek dan fungsi mana yang bersifat sisi klien dan mana yang bersifat sisi server? Secara umum, apa pun yang diinisialisasi sebagai ee.Thing
adalah objek server dan metode apa pun pada objek tersebut, ee.Thing.method()
, adalah
fungsi server. Objek dan fungsi yang muncul dalam referensi
Python atau
JavaScript
adalah sisi klien. Seperti yang telah disebutkan sebelumnya, Anda dapat menggunakan fungsi sisi klien untuk membuat objek, lalu menggabungkannya dengan menyediakan objek sisi klien ke konstruktor Earth Engine, misalnya ee.String()
.