Bạn đang gặp phải lỗi "Layer error: reduce.median: 'Can't apply calendarRange filter to objects without a timestamp'" trong quá trình làm việc với **Google Earth Engine**? Đừng lo lắng, bài viết này sẽ cung cấp cho bạn giải pháp chi tiết và dễ hiểu để khắc phục vấn đề này. Chúng ta sẽ cùng nhau tìm hiểu nguyên nhân gốc rễ của lỗi và cách áp dụng các biện pháp sửa chữa hiệu quả, giúp bạn tiếp tục công việc phân tích dữ liệu một cách suôn sẻ. Đây là lỗi thường gặp khi bạn làm việc với dữ liệu Landsat và các bộ sưu tập ảnh khác trong GEE, đặc biệt khi bạn muốn lọc dữ liệu theo khoảng thời gian cụ thể.
Lỗi này thường xảy ra khi bạn cố gắng áp dụng bộ lọc `calendarRange` lên một đối tượng (thường là một ảnh hoặc một bộ sưu tập ảnh) mà không có thông tin **timestamp** (dấu thời gian) hợp lệ. Hàm `calendarRange` trong **Google Earth Engine JavaScript API** yêu cầu mỗi ảnh phải có thuộc tính `system:time_start` để xác định thời điểm chụp ảnh. Nếu thuộc tính này bị thiếu hoặc không đúng định dạng, bộ lọc sẽ không thể hoạt động chính xác và gây ra lỗi.
Bước đầu tiên là kiểm tra xem bộ sưu tập ảnh của bạn có thuộc tính `system:time_start` hay không. Bạn có thể sử dụng hàm `getInfo()` để xem thông tin chi tiết của một ảnh trong bộ sưu tập. Nếu thuộc tính này bị thiếu, bạn cần tìm cách thêm nó vào.
Nếu thuộc tính `system:time_start` bị thiếu, bạn có thể sử dụng hàm `map()` để thêm nó vào mỗi ảnh trong bộ sưu tập. Điều này thường xảy ra sau khi bạn thực hiện các phép biến đổi ảnh (ví dụ: sử dụng `focal_mean` hoặc `blend`) vì các phép biến đổi này có thể làm mất các thuộc tính gốc của ảnh. Ví dụ:
var fill = function(image) {
var filled1a = image.focal_mean(2, 'square', 'pixels', 1).blend(image);
return filled1a.set('system:time_start', image.get('system:time_start'));
};
var L7coll = ee.ImageCollection('LANDSAT/LE07/C01/T1_TOA')
.filterBounds(region)
.filterDate(startDateL7, endDateL7)
.map(fDeleteClouds)
.map(landMask)
.map(fill);
Trong đoạn code trên, hàm `fill` được sử dụng để thêm lại thuộc tính `system:time_start` sau khi thực hiện các phép biến đổi ảnh. Việc sử dụng hàm `set()` để gán lại thuộc tính `system:time_start` từ ảnh gốc sang ảnh đã được xử lý là rất quan trọng. Điều này đảm bảo rằng thông tin thời gian không bị mất trong quá trình xử lý.
Sau khi đảm bảo rằng tất cả các ảnh trong bộ sưu tập đều có thuộc tính `system:time_start`, bạn có thể sử dụng hàm `calendarRange` để lọc dữ liệu theo tháng, năm, hoặc ngày trong năm. Ví dụ:
var wet_2001 = L7coll.filter(ee.Filter.calendarRange(10, 3, 'month'));
var dry_2001 = L7coll.filter(ee.Filter.calendarRange(4, 9, 'month'));
Đoạn code này lọc bộ sưu tập `L7coll` để lấy các ảnh chụp trong mùa mưa (tháng 10 đến tháng 3) và mùa khô (tháng 4 đến tháng 9) của năm 2001. Lưu ý rằng, nếu `end` nhỏ hơn `start`, bộ lọc sẽ tự động hiểu là bạn đang muốn lọc dữ liệu qua năm (ví dụ: từ tháng 12 đến tháng 2).
Nếu bạn muốn nhập dữ liệu cho nhiều giai đoạn (ví dụ: từ tháng 3 đến tháng 10 cho nhiều năm), bạn có thể kết hợp `calendarRange` để chọn các khoảng thời gian định kỳ:
ee.ImageCollection(...)
.filter(ee.Filter.calendarRange(2016, 2020, 'year'))
.filter(ee.Filter.calendarRange(3, 10, 'month'))
Hy vọng bài viết này đã giúp bạn hiểu rõ hơn về lỗi "Can't apply calendarRange filter to objects without a timestamp" và cách khắc phục nó trong **Google Earth Engine**. Chúc bạn thành công trong các dự án phân tích dữ liệu không gian của mình!
Bài viết liên quan