Tần suất ngập lụt (1984 – 2015)

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ẽ:

  1. 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,
  2. cho biết cách truy vấn các giá trị của lớp bản đồ,
  3. thêm kiểu tuỳ chỉnh để cải thiện hình ảnh trực quan,
  4. 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,
  5. đặt những nơi thú vị trên thế giới làm trung tâm bản đồ, và
  6. 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ình ảnh trực quan hoá mặc định
Hình 1. Hình ảnh trực quan mặc định của lớp dữ liệu về sự xuất hiện của nước mặt toàn cầu.

Ở 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.

thẻ trình kiểm tra
Hình 2. Ví dụ về đầu ra của thẻ Trình kiểm tra.

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

Đối số Map.addLayer
Hình 3. Ảnh chụp màn hình cho thấy các đối số của phương thức addLayer.

Các phím tắt cho thấy có 5 đối số có thể được truyền đến Map.addLayer: eeObject, visParams, name, shownopacity. 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" (eeObjectname) đượ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.

Tần suất xuất hiện nước mặt
Hình 4. Ảnh chụp màn hình về sự xuất hiện của nước ở Đồng bằng Paraná gần Buenos Aires, sử dụng màu đỏ trong suốt cho điểm cuối có giá trị tối thiểu là 0% và màu xanh dương đặc cho điểm cuối có giá trị tối đa.

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'
});
90% mặt nạ nước
Hình 5. Ảnh chụp màn hình mặt nạ nước 90% cho vùng châu thổ Paraná gần Buenos Aires.

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.