Thư viện ứng dụng Earth Engine cho Python và JavaScript dịch các phân tích không gian địa lý phức tạp thành các yêu cầu Earth Engine. Mã bạn viết cho thư viện ứng dụng có thể chứa cả tham chiếu đến các đối tượng và biến phía máy khách đại diện cho các đối tượng phía máy chủ.
Bạn cần phân biệt các đối tượng Earth Engine với các đối tượng Python hoặc JavaScript khác hoặc các đối tượng gốc có thể có trong mã của bạn. Bạn có thể thao tác các đối tượng trên máy chủ bằng cách thao tác các đối tượng "proxy" phía máy khách trong tập lệnh. Bạn có thể nhận ra đối tượng proxy là bất kỳ đối tượng nào bắt đầu bằng ee
. Các đối tượng proxy Earth Engine này không chứa bất kỳ dữ liệu thực tế nào và chỉ là tên xử lý cho các đối tượng trên máy chủ. Để bắt đầu, hãy xem xét đối tượng chuỗi phía máy khách (KHÔNG phải là đối tượng proxy):
Trình soạn thảo mã (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
Quan sát kết quả cho thấy ứng dụng (trình duyệt web hoặc sổ tay) đã diễn giải mã này và chạy mã, xác định rằng biến này là loại string
. Bây giờ, giả sử bạn muốn Earth Engine có thể làm một việc gì đó với chuỗi này. Để làm việc đó, bạn cần gói chuỗi trong một vùng chứa phù hợp rồi gửi chuỗi đó đến Google. Vùng chứa đó là đối tượng proxy. Ví dụ:
Trình soạn thảo mã (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
Quan sát kết quả, bạn sẽ thấy ee.String
là object
,
KHÔNG phải là string
. Cụ thể hơn, đó là một ee.computedObject
, nghĩa là một đối tượng proxy cho một nội dung nào đó trên máy chủ. Hãy coi ee.Thing
là cách để đặt một nội dung vào một vùng chứa để gửi đến Google. Ứng dụng của bạn không biết nội dung trong vùng chứa, nhưng bạn có thể tìm hiểu nội dung trong vùng chứa đó bằng cách in:
Trình soạn thảo mã (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
Để xem chính vùng chứa trông như thế nào, hãy in nội dung biểu thị chuỗi của đối tượng:
Trình soạn thảo mã (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!"})
Nếu vì lý do nào đó, bạn cần sử dụng Python hoặc JavaScript chạy trong ứng dụng để thao tác với bất kỳ nội dung nào trong vùng chứa, hãy sử dụng getInfo()
để lấy nội dung của vùng chứa và gán nội dung đó cho một biến:
Trình soạn thảo mã (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?
Lặp lại
Vì ứng dụng không biết nội dung trong các đối tượng ee.Thing
phía máy chủ, nên các thao tác phía máy khách như điều kiện và vòng lặp for sẽ không hoạt động với các đối tượng đó. Vì lý do đó và để tránh các lệnh gọi đồng bộ đến getInfo()
, hãy sử dụng các hàm máy chủ trong phạm vi có thể. Ví dụ: hãy xem xét hai cách sau đây để tạo danh sách:
Không nên — vòng lặp for phía máy khách
Trình soạn thảo mã (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)
Nên dùng – ánh xạ phía máy chủ
Trình soạn thảo mã (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())
Ví dụ về ánh xạ phía máy chủ hơi ngớ ngẩn vì bạn có thể tạo cùng một danh sách bằng ee.List.sequence(1, 8)
, nhưng ví dụ này minh hoạ một số khái niệm quan trọng. Khái niệm đầu tiên là map()
, chỉ áp dụng cùng một hàm cho mọi thứ trong danh sách. Vì hàm này được thực thi trên máy chủ, nên các hàm phía máy khách như getInfo()
và print()
sẽ không hoạt động trong một hàm được liên kết. Vì lý do đó, bạn phải thay thế mã i + 1
bằng mã tương đương phía máy chủ: ee.Number(n).add(1)
. Quan trọng là n
là một đối tượng chỉ tồn tại trên máy chủ. Vì hàm không biết loại đối số của hàm, nên hàm cần được truyền vào ee.Number
.
Cũng cần lưu ý rằng đôi khi chức năng phía máy khách sẽ rất tiện lợi. Ví dụ: bạn có thể sử dụng vòng lặp for trước đó để tạo một danh sách và gói danh sách đó bằng một đối tượng phía máy chủ:
Trình soạn thảo mã (JavaScript)
var toServerList = ee.List(clientList);
import ee import geemap.core as geemap
Colab (Python)
to_server_list = ee.List(client_list)
Xin lưu ý rằng quá trình xử lý phía máy khách được thực hiện trong máy tính xách tay hoặc trình duyệt, CPU của máy chủ lưu trữ, vì vậy, quá trình này có thể kém hiệu quả hơn so với việc sử dụng Earth Engine để thực hiện công việc trên máy chủ. Ngoài ra, để tránh kết quả có thể gây ngạc nhiên, bạn nên tránh kết hợp chức năng máy khách và máy chủ trong tập lệnh. Phần Điều kiện đưa ra ví dụ về các hậu quả có thể không mong muốn.
Điều kiện
Các đối tượng phía máy chủ không nhất thiết phải hoạt động với các hàm phía máy khách và ngược lại. Ví dụ: hãy xem xét trường hợp của biến Boolean phía máy chủ:
Trình soạn thảo mã (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
Như trong ví dụ sau, biến này không hoạt động theo điều kiện phía máy khách vì đây là đối tượng phía máy chủ. Để kiểm tra chính xác boolean phía máy chủ, hãy sử dụng hàm phía máy chủ:
Không nên – có điều kiện phía máy khách
Trình soạn thảo mã (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!
Nên dùng – có điều kiện phía máy chủ
Trình soạn thảo mã (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!
Hàm máy khách và máy chủ
Các phần trước mô tả một số lý do khiến việc kết hợp các đối tượng và hàm của máy khách và máy chủ trở nên không hiệu quả hoặc không hợp lý. Đối tượng và hàm nào ở phía máy khách và đối tượng và hàm nào ở phía máy chủ? Nhìn chung, mọi thứ được khởi tạo dưới dạng ee.Thing
đều là đối tượng máy chủ và mọi phương thức trên đối tượng đó, ee.Thing.method()
, đều là hàm máy chủ. Các đối tượng và hàm xuất hiện trong tài liệu tham khảo Python hoặc JavaScript là phía máy khách. Như đã lưu ý trước đó, bạn có thể sử dụng chức năng phía máy khách để tạo một đối tượng, sau đó gói đối tượng đó bằng cách cung cấp đối tượng phía máy khách cho một hàm khởi tạo Earth Engine, ví dụ: ee.String()
.