Nhập Môn Về các Hàm Google Earth Engine

Điều này thực sự hữu ích để tạo ra mã hiệu quả hơn!

This introductory training is part of the official training materials prepared by the United States Department of Agriculture.

Code Editor cho phép người dùng thực hiện được tất cả các chức năng của Earth Engine, tuy nhiên, cần có hiểu biết cơ bản về lập trình và JavaScript. Trong bài tập này, chúng ta sẽ tiếp tục học về ngôn ngữ lập trình Java và các khái niệm mới về dữ liệu không gian trong Earth Engine. Bạn sẽ tiếp tục những gì được học ở bài tập 2 về đối tượng ảnh; tuy nhiên trong bài học này bạn sẽ tập trung nhiều hơn vào các tập hợp hoặc chồng lớp của các đối tượng ảnh có tính chất tương tự. Trong bài học này, bạn sẽ tập trung vào các khái niệm cơ bản và phương pháp liên quan đến các tập hợp ảnh trong Earth Engine. Đây là hướng dẫn giúp người sử dụng có thể viết được các sript đơn giản trong JavaScript.

Nhập Môn Về các Hàm

Khi bạn phát triển code, các câu lệnh có thể bắt đầu trở nên khá dài. Để code được sắp xếp trật tự và để tạo thêm nhiều code có hiệu quả cao khi sử dụng, bạn có thể tận dụng lại các code mình đã thiết lập từ trước. Bạn hãy chia nhỏ code thành các phần, tách riêng các phần này, đặt tên để có thể sử dụng khi bạn cầu sau này. Các hàm là là phần nhỏ hơn của code. Ví dụ, chúng ta có một hàm để lấy dữ liệu mà mình quan tâm, một hàm để phân tích tích dữ liệu, và một hàm để xuất dữ liệu. Chúng ta cần chia nhỏ code thành 3 phần- mỗi phần tương ứng với một hàm.
Các hàm cũng rất hữu dụng khi chúng ta có một loạt lệnh mà bạn muốn sử dụng lại nhiều lần trong tập code. Ví dụ, có thể ta muốn tính mean của dữ liệu hoặc NDVI của tập raster, chúng ta có thể tạo một hàm mà có thể sử dụng/gọi lại, hơn là phải viết mới từ đầu

A. Cấu trúc

Đây là cách các hàm được thiết lập :

I. Code/Mã Lệnh: Bạn lấy code mình muốn sử dụng (một dòng lệnh hoặc hàng trăm dòng lệnh), đưa chúng vào trong dấu ngoặc móc {} để biết được hàm bắt đầu và kết thúc ở đâu. Trong ví dụ dưới đây, các dòng chú giải màu xanh lá cây đang nằm trong khối mã lệnh/code block.

II. function: Bắt đầu bằng từ function (ngôn ngữ Javascript), in thường, trước dấu ngoặc cong đầu tiên

III. name_of_function (tên hàm): sau function là tên mà chúng ta muốn đặt cho hàm/function đó. Chúng ta có thể đặt tên hàm/function theo ý mình, quy luật và gợi ý đặt tên giống như khi đặt tên biến (không bắt đầu bằng chữ số, thể hiện đúng chức năng của hàm…)

IV. Thông số đầu vào (input): Giữa tên hàm và ngoặc móc {} đầu tiên, chúng ta thêm một dấu ngoặc đơn (). Trong phần dấu ngoặc đơn, chúng ta sẽ điền các thông số đầu vào (input) mà người sử dùng muốn cung cấp cho hàm/function, nếu không có, chúng có thể được để trống. Thông số đầu vào là một phần thông tin (Nó có thể được chứa trong một biến) mà được đưa vào hàm khi được gọi. Nếu bạn có nhiều thông số muốn đưa vào hàm, đơn giản ngăn cách chúng bằng dấu phẩy. Ví dụ khi tạo ra hàm tính NDVI của ảnh, chúng ta sẽ đưa vào hàm một ảnh mà chúng ta muốn tính NDVI.

V. Gọi hàm: một khi bạn đã tạo một hàm, nó sẽ không được thực hiện cho tới khi bạn gọi hàm đó. Để sử dụng hàm trong code của mình, bạn viết tên hàm, tiếp theo là dấu ngoặc đơn, sau đó là điền thông số vào bên trong ngoặc đơn, kết thúc bằng dấu chấm phẩy.

function name_of_function (parameter_1, parameter_2) {
// code to execute
// more code to execute
// …
}

// call the function
name_of_function(input_1, input_2);

Đây là cấu trúc cơ bản của một hàm. Nếu bạn thấy chúng có vẻ hơi phức tạp, đừng lo lắng, bạn sẽ thấy dễ dàng hơn khi tự viết chúng. Sau đây, bạn sẽ thực tập để tạo một hàm đơn giản calculate_sum

Ghi chú: Quy tắc chung là khai báo và định rõ tất cả các hàm trước, sau đó gọi chúng ra trong script. Điều này là không bắt buộc nhưng sẽ code dễ đọc hơn

D. Tạo hàm để tính tổng số

1. Mở một cửa sổ làm việc mới bằng cách click/nhấn vào biểu tượng đầu mũi tên cạnh Reset. Sau đó chọn Clear Script.

2. Xem kỹ phần code bên dưới. Đây là ví dụ về hàm giúp tính tổng hai giá trị.

function calculate_Sum (in_value1, in_value2) {
var Sum = ee.Number(in_value1).add(ee.Number(in_value2)); // code that calculates the sum
    print(Sum);
}
// call the function
calculate_Sum(75, 82);
Ghi chú: Cho tới nay, chúng ta đã thực hiện chạy các code theo thứ tự. Các hàm hơi khác nhau ở điểm chúng có thể được định nghĩa ở bất cứ đâu trong chuỗi code, nhưng chỉ thực hiện chạy khi chúng được gọi. Ví dụ dưới đây cũng giống với ví dụ ở trên. Rất nhiều lập trình viên sẽ nhóm tất cả các hàm của họ lại ngay khi bắt đầu một script, tuy nhiên hàm đó chỉ chạy khi được gọi về sau.

3. Ngay trong hàm vừa tạo, gõ/type hai giá trị khác vào calculate_Sum () để tính tổng và chạy code. Dòng lệnh ví dụ như sau:

calculate_Sum(99, 106);
// copy the call statement (above), below the creation of the function
function calculate_Sum (in_value1, in_value2) {
var Sum = ee.Number(in_value1).add(ee.Number(in_value2)); // code that calculates the sum
    print(Sum);
}
Ghi chú: Nếu bạn thấy quen với lệnh gọi các hàm này, rất tốt! Chúng ta đã dùng các hàm JavaScript trong bài tập này rồi. Một ví dụ là print()

4. Một khi hàm đã được tạo, bạn có thể gọi hàm bao nhiêu lần bạn muốn. Hãy gọi gàm này một lần nữa với các tham số mới. Lần này tự thêm hai giá trị bạn muốn

calculate_Sum(790, 1.555);
calculate_Sum(133, 765);

E. Biến toàn cục và biến cục bộ

1. Làm thế nào khi chúng ta muốn lưu kết quả tính tổng vừa thực hiện như một biến để sử dụng trong mã code sau này, chúng ta có thể thực hiện được không? Chúng ta tạo và định nghĩa một biến gọi là Sum trong hàm. Thử in biến này sau khi gọi hàm để kiểm tra giá trị kết quả. Gõ dòng lệnh tạo hàm sau và chạy script/tập lệnh.

 // call the function
calculate_Sum(75, 82);
print(Sum);

ii. Bạn nhận được gì? Bạn sẽ nhận được báo lỗi trên console “Sum is not defined in the global scope”, có nghĩa là Sum không được định nghĩa trong phạm vi toàn cục.

2. Câu lệnh trên không thực hiện được. Thử lưu nó dưới một định dạng khác. Hãy xóa dòng code bạn vừa thực hiện ở bước vừa rồi. Xem kỹ dòng code dưới đây. Đưa vào script và Chạy/Run code

//call the function and save it as a variable called Sum_test
var Sum_test = calculate_Sum(75, 82);
// Try to call the variable we created in the function,
// outside of the function call
print(Sum_test);

iii. Chuyện gì xảy ra? Chúng ta không còn thấy báo lỗi nữa, tuy nhiên lưu nó dưới dạng một biến lại không thực hiện được. Tôi nhận được một thông báo rằng “a property cannot be read” – Thuộc tính không được xác định

3. Cho tới bây giờ, chúng ta vẫn chưa thành công để truy nhập vào kết quả của hàm. Đó là bởi vì biến Sum là một biến cục bộ, một biến chỉ tồn tại và khi được nằm trong hàm của nó. Trong JavaScript, bất kỳ var nào được dùng trong một hàm, biến kết quả là một biến cục bộ chỉ có thể truy cập được trong hàm đó.

Thế nào là biến cục bộ? Thế nào là biến toàn cục?
Biến cục bộ là một biến được khai báo trong một hàm. Không giống như biến toàn cục, biến cục bộ chỉ có thể sử dụng dưới hàm mà nó được khai báo.
Các biến được khai báo bên ngoài hàm được gọi là biến toàn cục và có thể đọc được ở bất kì vị trí nào trong script, kể cả trong hay ngoài các hàm. Cho tới nay, tất cả những gì chúng ta được học là về biến toàn cục, mặc dù chúng ta vẫn chưa gọi chúng là biến toàn cục. Một biến toàn cục là biến mà được khai báo bên ngoài của bất kỳ hàm nào. Các biến này có thể sử dụng bất kỳ lúc nào trong code và có thể sử dụng cả bên trong các hàm.

F. Sử dụng “return” để lưu kết quả của hàm dưới dạng một biến

Làm thế nào để chúng ta có thể chuyển kết quả cục bộ của một hàm thành một biến toàn cục? JavaScript sử dụng câu lệnh “return” để chuyển một giá trị cục bộ về chương trình chính. Bằng cách khai báo một biến toàn cục và định nó tương đương với một phép gọi hàm, chúng ta gán kết quả của hàm cho một biến mà có thể sử dụng ở bất cứ đâu trong script

1. Đọc kỹ những dòng lệnh sau. Đưa các dòng lệnh này vào code editor script của bạn và click Run

function calculate_Sum (in_value1, in_value2) {
var Sum = ee.Number(in_value1).add(ee.Number(in_value2)); // code that calculates the sum
    print("Local variable, Sum, = ", Sum);
    return Sum; // here we use return
}
// Now call and save the output of the function.
// Save it as a variable, Sum_test.
var Sum_test = calculate_Sum(75, 82);

// Try to call the variable we created in the function, outside of the
// function call
print("The global variable, Sum_test, = ",Sum_test);

2. Bạn thấy gì xảy ra? Bây giờ, dòng lệnh đã thực hiện thành công! Tôi thấy giá trị 157 được in ra trong cửa dổ Console của mình 2 lần:
i. Lần một là một biến cục bộ sau khi kết quả được in ra từ hàm
ii. Lần thứ hai là sau khi gọi hàm print biến toàn bộ mà tôi vừa tạo, Sum_test.

p5_1

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s