Tập dữ liệu GSW chứa nhiều lớp dữ liệu trình bày dữ liệu 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 sự xuất hiện của nước, lớp này cung cấp thông tin tóm tắt về vị trí và tần suất xuất hiện của nước 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 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 bản đồ ở trung tâm những khu vực thú vị trên thế giới và
- hướng dẫn cách tái cấu trúc tập lệnh để dễ đọc và dễ bảo trì hơn.
Tạo 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 soạn thảo 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 soạn thảo mã.
Nhấp vào nút "Run" (Chạy) của Trình soạn thảo mã. Sau vài giây, bạn sẽ thấy một bản đồ có màu xám dọc theo 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 có vẻ 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 thấy nước trong bất kỳ hoạt động quan sát nào trong 32 năm đều bị che.
Kiểm tra giá trị
Để khám phá các giá trị của lớp sự xuất hiện của nước, chúng ta sẽ sử dụng thẻ trình kiểm tra của Trình soạn thảo 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ó mặt tại nơi 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í này được phân loại là có nước bao phủ.
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, giúp 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 hai 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 dễ đọc và dễ 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 thêm các đối số. Để nhanh chóng xem các đối số có sẵn, hãy đặt con trỏ sau dấu ngoặc đơn mở và nhấn phím tắt cho "Show code suggestions" (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.)
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 một
cấu trúc dữ liệu JSON
như minh hoạ dưới đây:
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 bạn thay đổ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 tham số trực quan hoá mặc định, vốn đang khiến nước có màu xám. Thêm một câu lệnh mới để tạo biến VIS_OCCURRENCE và truyền biến đó dưới dạng đố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ố hình ảnh hoá được lưu trữ trong cấu trúc JSON VIS_OCCURRENCE cho biết rằng màu đỏ nên đượ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)) 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ác vùng nước hiện có màu xanh dương! Tiến trình!
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ó nước, sử dụng phạm vi giá trị từ 0 đến 100%. Tuy nhiên, việc xác định một lớp nước nhị phân thường hữu ích (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 xuất hiện nhất định (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 rõ ràng để đặt các lớp GSW khác 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, trong đó 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 hình ảnh mới VIS_WATER_MASK để lưu giữ thông tin định 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 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 này vào bản đồ. Để lớp này hiển thị dưới tất cả các lớp khác, hãy đặt câu lệnh sau trước mọi câu lệnh Map.addLayer khác.
Trình soạn thảo mã (JavaScript)
Map.addLayer({ eeObject: water_mask, visParams: VIS_WATER_MASK, name: '90% occurrence water mask' });
Đi đến 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 kéo và thu phóng, nhưng thế giới rất rộng lớn và đôi khi bạn nên chuyển thẳng đến một vị trí cụ thể. Dưới đây là một loạt câu lệnh cung cấp một mẫu nhỏ về các vị trí thú vị, xét về mặt nước mặt. Chỉ cần bỏ ghi 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 vài địa điểm thú vị. Bạn có thể tự thêm câu hỏi!
Cải tiến, 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ẽ cải tiến mã thêm một chút. Cụ thể, chúng ta sẽ nhóm các câu lệnh tương tự lại 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 lớp bản đồ.
Dưới đây là tập lệnh cuối cùng sau khi tái cấu trúc:
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á cách sự xuất hiện của nước thay đổi theo thời gian.