Klien vs. Server

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

Penyiapan Python

Lihat halaman Lingkungan Python untuk mengetahui informasi tentang Python API dan penggunaan geemap untuk pengembangan interaktif.

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

Penyiapan Python

Lihat halaman Lingkungan Python untuk mengetahui informasi tentang Python API dan penggunaan geemap untuk pengembangan interaktif.

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

Penyiapan Python

Lihat halaman Lingkungan Python untuk mengetahui informasi tentang Python API dan penggunaan geemap untuk pengembangan interaktif.

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!")

Penyiapan Python

Lihat halaman Lingkungan Python untuk mengetahui informasi tentang Python API dan penggunaan geemap untuk pengembangan interaktif.

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?

Penyiapan Python

Lihat halaman Lingkungan Python untuk mengetahui informasi tentang Python API dan penggunaan geemap untuk pengembangan interaktif.

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);

Penyiapan Python

Lihat halaman Lingkungan Python untuk mengetahui informasi tentang Python API dan penggunaan geemap untuk pengembangan interaktif.

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);

Penyiapan Python

Lihat halaman Lingkungan Python untuk mengetahui informasi tentang Python API dan penggunaan geemap untuk pengembangan interaktif.

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.

(Lihat bagian tentang Fungsi Klien dan Server untuk mengetahui deskripsi fungsi yang berjalan di klien.)

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);

Penyiapan Python

Lihat halaman Lingkungan Python untuk mengetahui informasi tentang Python API dan penggunaan geemap untuk pengembangan interaktif.

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

Penyiapan Python

Lihat halaman Lingkungan Python untuk mengetahui informasi tentang Python API dan penggunaan geemap untuk pengembangan interaktif.

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!

Penyiapan Python

Lihat halaman Lingkungan Python untuk mengetahui informasi tentang Python API dan penggunaan geemap untuk pengembangan interaktif.

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!

Penyiapan Python

Lihat halaman Lingkungan Python untuk mengetahui informasi tentang Python API dan penggunaan geemap untuk pengembangan interaktif.

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().