Số liệu thống kê của một vùng hình ảnh

reduceRegion

Để xem số liệu thống kê về giá trị pixel trong một vùng của ee.Image, hãy sử dụng image.reduceRegion(). Thao tác này sẽ giảm tất cả các pixel trong(các) vùng thành một số liệu thống kê hoặc một dạng biểu diễn nhỏ gọn khác của dữ liệu pixel trong vùng (ví dụ: biểu đồ tần suất). Vùng này được biểu thị dưới dạng Geometry, có thể là một đa giác chứa nhiều pixel hoặc có thể là một điểm duy nhất. Trong trường hợp đó, sẽ chỉ có một pixel trong vùng. Trong cả hai trường hợp, như minh hoạ trong Hình 1, kết quả là một số liệu thống kê được lấy từ các pixel trong vùng.

sơ đồ reduceRegion
Hình 1. Hình minh hoạ về một ee.Reducer được áp dụng cho một hình ảnh và một vùng.

Để xem ví dụ về cách lấy số liệu thống kê về pixel trong một vùng của hình ảnh bằng cách sử dụng reduceRegion(), hãy cân nhắc việc tìm giá trị trung bình của phổ của ảnh ghép Landsat trong 5 năm trong phạm vi Rừng lá kim Sierra Nevada (minh hoạ bằng Hình 2):

// Load input imagery: Landsat 7 5-year composite.
var image = ee.Image('LANDSAT/LE7_TOA_5YEAR/2008_2012');

// Load an input region: Sierra Nevada.
var region = ee.Feature(ee.FeatureCollection('EPA/Ecoregions/2013/L3')
  .filter(ee.Filter.eq('us_l3name', 'Sierra Nevada'))
  .first());

// Reduce the region. The region parameter is the Feature geometry.
var meanDictionary = image.reduceRegion({
  reducer: ee.Reducer.mean(),
  geometry: region.geometry(),
  scale: 30,
  maxPixels: 1e9
});

// The result is a Dictionary.  Print it.
print(meanDictionary);

Để buộc quá trình tính toán, bạn chỉ cần in kết quả. Trình chỉnh sửa mã sẽ hiển thị kết quả dưới dạng Dictionary trong bảng điều khiển. Kết quả sẽ có dạng như sau:

B1: 25.406029716816853
B2: 23.971497014238988
B3: 22.91059593763103
B4: 54.83164133293403
B5: 38.07655472573677
B6_VCID_2: 198.93216428012906
B7: 24.063261634961563
sơ đồ reduceRegion
Hình 2. Ảnh ghép màu giả của dữ liệu hình ảnh Landsat cho California và Nevada. Vùng cần giảm được hiển thị bằng màu trắng.

Xin lưu ý rằng trong ví dụ này, mức giảm được chỉ định bằng cách cung cấp reducer (ee.Reducer.mean()), geometry (region.geometry()), scale (30 mét) và maxPixels cho số lượng pixel tối đa để nhập vào bộ giảm. Bạn phải luôn chỉ định tỷ lệ trong các lệnh gọi reduceRegion(). Điều này là do trong các quy trình xử lý phức tạp (có thể liên quan đến dữ liệu từ nhiều nguồn có tỷ lệ khác nhau), tỷ lệ của kết quả đầu ra sẽ không được xác định rõ ràng từ dữ liệu đầu vào. Trong trường hợp đó, tỷ lệ mặc định là 1 độ, thường cho ra kết quả không đạt yêu cầu. Hãy xem trang này để biết thêm thông tin về cách Earth Engine xử lý tỷ lệ.

Có hai cách để đặt tỷ lệ: bằng cách chỉ định tham số scale hoặc bằng cách chỉ định một CRS và phép biến đổi CRS. (Hãy xem bảng chú giải thuật ngữ để biết thêm thông tin về CRS và phép biến đổi CRS). Ví dụ: mức giảm meanDictionary (ở trên) tương đương với mức giảm sau:

// As an alternative to specifying scale, specify a CRS and a CRS transform.
// Make this array by constructing a 4326 projection at 30 meters,
// then copying the bounds of the composite, from composite.projection().
var affine = [0.00026949458523585647, 0, -180, 0, -0.00026949458523585647, 86.0000269494563];

// Perform the reduction, print the result.
print(image.reduceRegion({
  reducer: ee.Reducer.mean(),
  geometry: region.geometry(),
  crs: 'EPSG:4326',
  crsTransform: affine,
  maxPixels: 1e9
}));

Nhìn chung, việc chỉ định tỷ lệ là đủ và giúp mã dễ đọc hơn. Earth Engine xác định pixel nào cần nhập vào bộ giảm bằng cách trước tiên là chuyển đổi vùng thành raster. Nếu bạn chỉ định tỷ lệ mà không có CRS, thì vùng sẽ được chuyển đổi thành raster trong phép chiếu gốc của hình ảnh được điều chỉnh theo độ phân giải đã chỉ định. Nếu bạn chỉ định cả CRS và tỷ lệ, thì vùng sẽ được chuyển đổi thành raster dựa trên các giá trị đó.

Pixel trong vùng

Pixel được xác định là nằm trong vùng (và được tính trọng số) theo các quy tắc sau, được áp dụng theo tỷ lệ và phép chiếu đã chỉ định:

  • Bộ giảm không có trọng số (ví dụ: ee.Reducer.count() hoặc ee.Reducer.mean().unweighted()): pixel được đưa vào nếu tâm của pixel nằm trong vùng và mặt nạ của hình ảnh khác 0.
  • Bộ giảm có trọng số (ví dụ: ee.Reducer.mean()): pixel được đưa vào nếu ít nhất (xấp xỉ) 1/256 (~0,4%) pixel nằm trong vùng và mặt nạ của hình ảnh khác 0; trọng số của pixel là giá trị tối thiểu của mặt nạ của hình ảnh và phân số (xấp xỉ) của pixel được vùng bao phủ. Trọng số giao điểm pixel được biểu thị nội bộ dưới dạng số nguyên 8 bit (từ 0 đến 255), định lượng mức độ bao phủ phân số thành 256 cấp rời rạc.

Bạn cần tham số maxPixels để quá trình tính toán thành công. Nếu bạn bỏ qua tham số này trong ví dụ, thì hệ thống sẽ trả về một lỗi có dạng như sau:

Có nhiều cách để khắc phục các lỗi này: tăng maxPixels, như trong ví dụ, tăng scale hoặc đặt bestEffort thành true. Thao tác này sẽ tự động tính toán một tỷ lệ mới (lớn hơn) sao cho maxPixels không vượt quá. Nếu bạn không chỉ định maxPixels, thì giá trị mặc định sẽ được sử dụng.