Tập dữ liệu GSW chứa nhiều lớp dữ liệu trình bày dữ liệu về nước mặt theo nhiều cách. Chúng ta sẽ bắt đầu bằng cách trực quan hoá lớp xuất hiện nước, cung cấp thông tin tóm tắt về vị trí và tần suất xuất hiện nước trên bề mặt trong toàn bộ khoảng thời gian từ tháng 3 năm 1984 đến tháng 10 năm 2015.
Phần này của hướng dẫn sẽ:
- thêm một lớp bản đồ để trực quan hoá sự xuất hiện của nước trên bề mặt,
- cho biết cách truy vấn các giá trị của lớp bản đồ,
- thêm kiểu tuỳ chỉnh để cải thiện hình ảnh trực quan,
- tạo một lớp mặt nạ nước nhị phân bằng cách sử dụng giá trị ngưỡng,
- đặt những nơi thú vị trên thế giới làm trung tâm bản đồ, và
- cho biết cách tái cấu trúc tập lệnh để giúp tập lệnh dễ đọc và dễ duy trì hơn.
Tạo một hình ảnh trực quan cơ bản
Bắt đầu bằng cách sao chép các câu lệnh sau vào Trình chỉnh sửa mã:
Trình soạn thảo mã (JavaScript)
var gsw = ee.Image('JRC/GSW1_0/GlobalSurfaceWater'); var occurrence = gsw.select('occurrence'); Map.addLayer(occurrence);
Câu lệnh đầu tiên tham chiếu đến đối tượng Hình ảnh của Earth Engine cho tập dữ liệu GSW và lưu trữ đối tượng đó trong một biến có tên là gsw
.
Câu lệnh thứ hai chọn một lớp duy nhất của tập dữ liệu GSW và lưu trữ lớp đó trong một biến có tên là occurrence
.
Câu lệnh thứ ba thêm hình ảnh về sự xuất hiện vào bản đồ tương tác của Trình chỉnh sửa mã.
Nhấp vào nút "Run" (Chạy) của Trình chỉnh sửa mã và sau vài giây, bạn sẽ thấy một bản đồ có màu xám dọc theo đường bờ biển, tương tự như Hình 1.

Ở hầu hết các khu vực, tập dữ liệu GSW xuất hiện trong suốt, vì những vị trí không thu thập được hình ảnh Landsat (tức là các khu vực đại dương) hoặc những vị trí không phát hiện được nước trong 32 năm đều được che đi.
Kiểm tra giá trị
Để khám phá các giá trị của lớp xuất hiện nước, chúng ta sẽ sử dụng thẻ trình kiểm tra của Trình chỉnh sửa mã. Trước tiên, hãy nhấp vào thẻ trình kiểm tra, sau đó nhấp vào bản đồ để chọn một vị trí. Thẻ trình kiểm tra sẽ hiển thị thông tin về từng lớp có ở vị trí bạn nhấp vào.

Trong ví dụ trên, giá trị của lớp có tên value
là 98. Đơn vị là điểm phần trăm, vì vậy, khoảng 98% thời gian, vị trí được phân loại là có nước.
Giá trị này là giá trị trung bình của từng giá trị xuất hiện nước mặt hằng tháng, được chuẩn hoá theo biến động theo mùa, như mô tả trong
Hướng dẫn sử dụng dữ liệu (phiên bản 2)
.
Tái cấu trúc để cải thiện mã
Tập lệnh của chúng ta chỉ chứa 2 câu lệnh, nhưng chúng ta đã có cơ hội tái cấu trúc mã để tập lệnh cuối cùng sẽ dễ đọc và duy trì hơn theo thời gian.
Hiện tại, câu lệnh Map.addLayer()
truyền một đối số duy nhất occurrence
, đó là đối tượng hình ảnh Earth Engine mà chúng ta muốn hiển thị trên bản đồ. Tuy nhiên, phương thức Map.addLayer()
cũng cho phép truyền các đối số bổ sung vào phương thức này. Để nhanh chóng xem những đối số có sẵn, hãy đặt con trỏ sau dấu ngoặc đơn mở và nhấn phím tắt "Hiện đề xuất mã" để hiển thị tài liệu trợ giúp cho phương thức addLayer
. (Bạn có thể xem phím tắt bằng cách chọn trình đơn Trợ giúp -> Phím tắt.)

Các phím tắt cho thấy có 5 đối số có thể được truyền đến Map.addLayer
: eeObject
, visParams
, name
, shown
và opacity
.
Trong tập lệnh hiện tại, chúng ta đang truyền một biến duy nhất occurrence
được diễn giải là đối số đầu tiên, eeObject
.
Để truyền cả đối tượng biến và một đối số bổ sung đặt tên cho lớp, chúng ta có thể tái cấu trúc mã để sử dụng "đối số được đặt tên" (eeObject
và name
) được truyền vào phương thức từ bên trong
cấu trúc dữ liệu JSON
như minh hoạ bên dưới:
Trình soạn thảo mã (JavaScript)
Map.addLayer({eeObject: occurrence, name: 'Water Occurrence (1984-2015)'});
Chạy lại mã để đảm bảo mã vẫn hoạt động sau khi thay đổi tái cấu trúc. Bản đồ kết quả sẽ không thay đổi.
Thêm tham số trực quan hoá
Tiếp theo, chúng ta sẽ cải thiện các thông số trực quan hoá mặc định, khiến nước có màu xám. Thêm một câu lệnh mới tạo ra một biến VIS_OCCURRENCE
và truyền biến đó làm đối số bổ sung cho phương thức addLayer.
Trình soạn thảo mã (JavaScript)
var VIS_OCCURRENCE = { min: 0, max: 100, palette: ['red', 'blue'] };
Trình soạn thảo mã (JavaScript)
Map.addLayer({ eeObject: occurrence.updateMask(occurrence.divide(100)), name: 'Water Occurrence (1984-2015)', visParams: VIS_OCCURRENCE });
Các tham số trực quan hoá được lưu trữ trong cấu trúc JSON VIS_OCCURRENCE
cho biết rằng màu đỏ sẽ được dùng cho giá trị tối thiểu là 0% và màu xanh dương cho giá trị tối đa là 100%.
Việc thêm .updateMask(occurrence.divide(100))
sẽ khiến độ mờ/độ trong suốt của các pixel được đặt dựa trên giá trị xuất hiện.
Chạy lại tập lệnh và xem kết quả đã sửa đổi từ các thay đổi về kiểu của chúng ta.

Các vùng nước hiện có màu xanh dương! Tiến bộ!
Tạo lớp ngưỡng
Hình ảnh về sự xuất hiện của nước chứa thông tin về tần suất dự kiến của nước bằng cách sử dụng một phạm vi giá trị từ 0 đến 100%. Tuy nhiên, bạn nên xác định một lớp nước nhị phân (tức là "nước" so với "không phải nước") dựa trên một tỷ lệ phần trăm nhất định của sự xuất hiện (tức là giá trị ngưỡng). Chúng ta sẽ sử dụng lớp nhị phân đơn giản này làm lớp nền sạch sẽ mà các lớp GSW khác có thể được đặt lên trên. Bạn có thể tạo lớp ngưỡng này bằng cách sử dụng các câu lệnh sau. Các câu lệnh này sử dụng giá trị ngưỡng là 90% để phân tách nước và không phải nước.
Trước tiên, chúng ta xác định một biến trực quan mới VIS_WATER_MASK
để lưu giữ thông tin về kiểu cho mặt nạ nước:
Trình soạn thảo mã (JavaScript)
var VIS_WATER_MASK = { palette: ['white', 'black'] };
Sau đó, chúng ta tính toán một lớp mặt nạ nước bằng cách sử dụng toán tử so sánh lớn hơn .gt(90)
rồi đặt các vùng được che trước đó thành 0 bằng phương thức .unmask()
:
Trình soạn thảo mã (JavaScript)
// Create a water mask layer, and set the image mask so that non-water areas // are opaque. var water_mask = occurrence.gt(90).unmask(0);
Cuối cùng, hãy thêm lớp vào bản đồ. Để lớp này hiển thị bên dưới tất cả các lớp khác, hãy đặt câu lệnh sau trước bất kỳ câu lệnh Map.addLayer
nào khác.
Trình soạn thảo mã (JavaScript)
Map.addLayer({ eeObject: water_mask, visParams: VIS_WATER_MASK, name: '90% occurrence water mask' });

Khám phá những nơi thú vị trên thế giới
Thật thú vị khi khám phá thế giới bằng cách di chuyển và thu phóng, nhưng thế giới rất rộng lớn và đôi khi bạn cần chuyển trực tiếp đến một vị trí cụ thể. Dưới đây là một loạt các câu lệnh cung cấp một mẫu nhỏ về các vị trí thú vị, xét về nước mặt. Chỉ cần bỏ chú thích một trong các câu lệnh tại một thời điểm và tập lệnh của bạn sẽ chuyển đến vị trí đó khi chạy.
Trình soạn thảo mã (JavaScript)
// Uncomment one of the following statements to center the map. // Map.setCenter(-90.162, 29.8597, 10); // New Orleans, USA // Map.setCenter(-114.9774, 31.9254, 10); // Mouth of the Colorado River, Mexico // Map.setCenter(-111.1871, 37.0963, 11); // Lake Powell, USA // Map.setCenter(149.412, -35.0789, 11); // Lake George, Australia // Map.setCenter(105.26, 11.2134, 9); // Mekong River Basin, SouthEast Asia // Map.setCenter(90.6743, 22.7382, 10); // Meghna River, Bangladesh // Map.setCenter(81.2714, 16.5079, 11); // Godavari River Basin Irrigation Project, India // Map.setCenter(14.7035, 52.0985, 12); // River Oder, Germany & Poland // Map.setCenter(-59.1696, -33.8111, 9); // Buenos Aires, Argentina Map.setCenter(-74.4557, -8.4289, 11); // Ucayali River, Peru
Đây chỉ là một số ít địa điểm thú vị. Bạn có thể thoải mái thêm các câu hỏi của riêng mình!
Tái cấu trúc, một lần nữa...
Trước khi chuyển sang lớp tiếp theo của tập dữ liệu GSW, chúng ta sẽ thực hiện thêm một chút tái cấu trúc mã. Cụ thể, chúng ta sẽ nhóm các câu lệnh tương tự với nhau và thêm một số nhận xét để chia mã thành các phần cho tài sản, hằng số, phép tính, căn giữa bản đồ và thêm các lớp bản đồ.
Sau đây là tập lệnh được tái cấu trúc cuối cùng:
Trình soạn thảo mã (JavaScript)
////////////////////////////////////////////////////////////// // Asset List ////////////////////////////////////////////////////////////// var gsw = ee.Image('JRC/GSW1_0/GlobalSurfaceWater'); var occurrence = gsw.select('occurrence'); ////////////////////////////////////////////////////////////// // Constants ////////////////////////////////////////////////////////////// var VIS_OCCURRENCE = { min: 0, max: 100, palette: ['red', 'blue'] }; var VIS_WATER_MASK = { palette: ['white', 'black'] }; ////////////////////////////////////////////////////////////// // Calculations ////////////////////////////////////////////////////////////// // Create a water mask layer, and set the image mask so that non-water areas // are opaque. var water_mask = occurrence.gt(90).unmask(0); ////////////////////////////////////////////////////////////// // Initialize Map Location ////////////////////////////////////////////////////////////// // Uncomment one of the following statements to center the map. // Map.setCenter(-90.162, 29.8597, 10); // New Orleans, USA // Map.setCenter(-114.9774, 31.9254, 10); // Mouth of the Colorado River, Mexico // Map.setCenter(-111.1871, 37.0963, 11); // Lake Powell, USA // Map.setCenter(149.412, -35.0789, 11); // Lake George, Australia // Map.setCenter(105.26, 11.2134, 9); // Mekong River Basin, SouthEast Asia // Map.setCenter(90.6743, 22.7382, 10); // Meghna River, Bangladesh // Map.setCenter(81.2714, 16.5079, 11); // Godavari River Basin Irrigation Project, India // Map.setCenter(14.7035, 52.0985, 12); // River Oder, Germany & Poland // Map.setCenter(-59.1696, -33.8111, 9); // Buenos Aires, Argentina Map.setCenter(-74.4557, -8.4289, 11); // Ucayali River, Peru ////////////////////////////////////////////////////////////// // Map Layers ////////////////////////////////////////////////////////////// Map.addLayer({ eeObject: water_mask, visParams: VIS_WATER_MASK, name: '90% occurrence water mask', shown: false }); Map.addLayer({ eeObject: occurrence.updateMask(occurrence.divide(100)), name: 'Water Occurrence (1984-2015)', visParams: VIS_OCCURRENCE });
Trong phần tiếp theo, bạn sẽ khám phá xem sự xuất hiện của nước đã thay đổi như thế nào theo thời gian.