Giới Thiệu
Code Editor cho phép thực hiện toàn bộ chức năng của Earth Engine, tuy nhiên, cần có hiểu biết cơ bản về lập trình và JavaScript. Trong bài tập này, chúng ta sẽ học về ngôn ngữ JavaScript và một vài khái niệm cơ bản về dữ liệu không gian của Earth Engine. Bài tập này sẽ tập trung vào các đặc tính và phương pháp, các hàm tính toán khi làm việc với các dữ liệu ảnh trong Earth Engine. Bên cạnh đó, bạn cũng sẽ được giới thiệu ngắn gọn về các dạng đối tượng không gian khác trong Earth Engine. Bài tập này sẽ giúp bạn viết một script/tập lệnh đơn giản trong JavaScript. Bạn cũng sẽ được học về Fusion Tables.
Mục Lục
Phần 1: Thiết lập không gian làm việc 2
Phần 2: Tìm Hiểu Các Hàm Xử Lý Ảnh 2
Phần 3: (Không bắt buộc) Truy nhập Metadata / siêu dữ liệu 5
Phần 4: (Đọc thêm) Một Số Khái Niệm Cơ Bản Về Đối Tượng 6
Phần 1: Thiết Lập Không Gian Làm Việc
- Mở một script mới
- Mở Code Editor trong Google Chrome:
- Click vào biểu tượng đầu mũi tên bên cạnh nút Reset và chọn Clear script.
- Tạo một biến đại diện cho một ảnh Landsat 8
- Dùng dòng code dưới đây để tạo một biến đại diện đối tượng ee.Image cho một ảnh Landsat 8.
- Copy và paste dòng code dưới đây vào Code Editor.
// Get an image and display in map window.
var LC8_image = ee.Image('LANDSAT/LC8_L1T_TOA/LC81290502013110LGN01');
Map.addLayer(LC8_image, {min:0.05, max: 0.8, bands: 'B6, B5, B4'}, "Landsat 8 Scene");
Map.centerObject(LC8_image, 8);
Phần 2: Tìm Hiểu Các Hàm Xử Lý Ảnh hiện có
Code Editor có sẵn một tập hợp đầy đủ các công cụ phục vụ cho phân tích và xử lý các đối tượng ảnh mà bạn đã và đang làm việc. Những công cụ này ở dưới dạng các hàm của Earth Engine
- Tính NDVI cho ảnh Landsat của bạn
- Bạn có thể tính Chỉ Số Thực Vật (NDVI) cho ảnh của mình, sử dụng hàm normalizedDifference(). Copy những dòng lệnh dưới đây và paste chúng vào dưới phần sript/tập lệnh của bạn. Click Run. Những dòng lệnh này sẽ tính giá trị NDVI cho ảnh của bạn.
// Create an NDVI image using bands the nir and red bands (5 and 4)
var NDVI = LC8_image.normalizedDifference(['B5','B4']);
// Display the NDVI image - Use a grayscale stretch for display
Map.addLayer(NDVI,{min: -0.2, max:0.5, palette: ['FFFFFF', '339900']},"NDVI");
- Tách vùng mây/ Mask coulds
- Xóa script/tập lệnh của bạn từ Phần 4A, trừ những dòng dưới đây
// Get the image.
var LC8_image = ee.Image('LANDSAT/LC8_L1T_TOA/LC81290502013110LGN01');
Map.addLayer(LC8_image, {min:0.05, max: 0.8, bands: 'B6, B5, B4'}, "Landsat 8 Scene");
Map.centerObject(LC8_image, 8);
- Run/Chạy script. Chú ý những vùng mây xuất hiện ở nửa bên phải của ảnh? Tiếp theo bạn sẽ tiến hành việc loại bỏ những vùng mây này ra khỏi ảnh.
- Trước tiên, bạn sẽ tạo một biến, cloud_thresh. Biến này sẽ lưu giá trị ngưỡng của vùng mây. Sau khi bạn soạn xong script, bạn có thể dễ dàng thay đổi giá trị của biến này. Thay đổi giá trị và chạy lại script để tìm ra giá trị ngưỡng hợp lý cho vùng mây trong khu vực nghiên cứu
//Specify the cloud likelihood threshold -
var cloud_thresh = 40;
Sau đây, bạn sẽ sử dụng thuật toán trong Earth Engine giúp tính ngưỡng giá trị vùng mây đơn giản bằng cách kết hợp độ sáng, nhiệt đồ và Chỉ số Tuyết NDSI (Normalized Snow Index). Khoảng giá trị của vùng được thể hiện trong khoảng từ 0 đến 100, trong đó giá trị càng lớn thì khả năng pixel đó là mây càng cao. Bạn có thể đọc thêm tại Tab Docs (hoặc tham khảo hình dưới đây)
- Copy những dòng lệnh dưới đây và paste xuống dưới script của mình. Dòng lệnh này sẽ giúp tạo một lớp raster có giá trị pixel trong khoảng 0-100, các pixel có giá trị cao hơn thì khả năng là mây cao hơn
//use add the cloud likelihood band to the image
var CloudScore = ee.Algorithms.Landsat.simpleCloudScore(LC8_image);
- (Không bắt buộc) Thêm lớp raster vừa tạo (CloudScore) vào cửa sổ xuất kết quả bản đồ bằng cách copy những dòng lệnh sau xuống dưới cùng script/tập lệnh của bạn. Click Run
- Những giá trị nào được gán cho vùng mây? (Gợi ý: dùng công cụ inspector để xem các giá trị tại các vị trí khác nhau trong ảnh kết quả)
- Bạn có thấy sự khác nhau giữa các kết quả của hai dòng lệnh Map.addLayer()? (Gợi ý: sử dụng tab inspector và tắt bật các lớp/layer để so sánh)
- Sau khi bạn kiểm tra xong raster CloudScore raster, remove/xóa (hoặc viết ghi chú lên trước) những dòng code này trong sript/tập lệnh của mình.
// Add the cloud image to the map.
// This will add the first three layers
Map.addLayer(CloudScore,{}, 'Cloud Likelihood, all bands');
// but you are interested in the cloud layer.
// you can specify the band you would like displayed in the input
// parameters of the Map.addLayer statement:
Map.addLayer(CloudScore,{bands:'cloud'}, 'Cloud Likelihood');
- Raster sau khi được tạo ra từ hàm ee.Algorithms.Landsat.simpleCloudScore() là một ảnh có 13 band, trong đó: 12 band là của ảnh Landsat và band mới thứ 13 – giá trị của mỗi pixel thể hiện khả năng pixel đó có thể là mây hoặc không (cloud score/likelihood). Bạn cần tách biệt band này để lọc mây/mask cho ảnh Landsat. Copy dòng lệnh dưới đây và paste xuống dưới cùng phần sript của bạn. Dòng lệnh này giúp định nghĩa band ‘mây’/’clound band’ thành một biến gọi là quality.
//isolate the cloud likelihood band
var quality = CloudScore.select('cloud');
- Copy những dòng lệnh dưới đây và paste xuống dưới cùng phần script của bạn. Trong những dòng lệnh này có sử dụng hàm gt() để tạo ra một raster nhị phân/binary raster gán cho mỗi pixel một giá trị:
- Giá trị sẽ là 1 nếu biến quality (khả năng thuộc vùng mây/cloud likelihood) lớn hơn ngưỡng giá trị của mây;
- Giá trị sẽ là 0 nếu biến quality (khả năng thuộc vùng mây/cloud likelihood) nhỏ hơn ngưỡng giá trị của mây
//get pixels above the threshold
var cloud01 = quality.gt(cloud_thresh);
//Add the image to the map.
Map.addLayer(cloud01,{}, 'Cloud Mask step 1');
- Run/Chạy code và kiểm tra các giá trị ở các vị trí khác nhau trên kết quả (gợi ý: sử dụng công cụ inspector)
- Copy dòng lệnh dưới đây và paste xuống phía dưới cùng script của bạn
- Sử dụng hàm mask() để loại bỏ các giá trị có khả năng là mây cao (giá trị cloud likelihood cao) khỏi ảnh Landsat. Hàm mask() loại bỏ các pixel trong ảnh Landsat mà pixel tương ứng trong ảnh (cloud01) có giá trị 0.
- Nhớ rằng, trong ảnh cloud01, các pixel có thể là mây có giá trị 1, không phải 0. Vì vậy cần có hàm not(). Hàm này quay lại 0 nếu tham số đầu vào khác 0, và là 1 cho các giá trị khác.
- Để trống thông số đầu vào của hàm mask () và dùng hàm and() để liên kết với hàm not() tạo ra một mặt nạ lọc mây là sự kết hợp từ ảnh Landsat và ảnh cloud01. Run/ code và kiểm tra kết quả
//create a mask from high likelihood pixels
var cloudmask = LC8_image.mask().and(cloud01.not());
Map.addLayer(cloudmask,{}, 'Cloud Mask step 2');
- Bây giờ bạn đã sẵn sàng sử dụng mặt nạ lọc mây/mask, cloudmask để tách mây khỏi ảnh Landsat. Copy dòng lệnh sau và paste xuống dưới cùng script của bạn. Click Run code và kiểm tra kết quả
//mask those pixels from the image
var LC8_imageNoClouds = LC8_image.mask(cloudmask);
//Review the result
Map.addLayer(LC8_imageNoClouds, {bands:['B6','B5','B4'], min:0.1, max:0.5},'Landsat8scene_cloudmasked');
Ghi chú- Masking pixel là loại bỏ những pixel đó trong ảnh bằng cách chuyển chúng thành giá trị 0. Xác định được pixel trong ảnh Landsat có khả năng là mây, bạn có thể tạo một mặt nạ lọc/mask để loại bỏ các pixel này trong ảnh gốc. Hàm đó có thể được dùng với cú pháp chung:
LandsatImage.mask(cloudMaskImage).
Ghi chú: Cũng có thể áp dụng một mặt nạ lọc/mask cho một ảnh đã được lọc, bạn có thể thấy khó hiểu- vì vậy hãy bảo đảm rằng bạn có một sơ đồ lý thuyết và các bước thực hiện rõ ràng
- Chỉnh sửa script để loại bỏ vùng hơi nước bao quanh mây
- Ảnh Landsat 8 nguyên gốc đang được tắt chế độ hiển thị, phóng to đến mép biên của mây trong ảnh. Bạn có nhìn thấy sương mù/hơi nước trong ảnh đã được lọc mây.
- Bạn có thể thử loại bỏ sương mù bằng cách giảm ngưỡng của khoảng mây/cloud likelihood threshold. Tìm lại biến cloud_thresh và đổi giá trị từ 40 xuống 20. Click Run và xem kết quả
- Ngưỡng của khoảng giá trị mây/likelihood từ 40 xuống đến 20 có thể hạn chế đáng kể sự có mặt của các pixel mây và hơi nước trong ảnh- các pixel còn lại hiển thị rõ và sáng,
- Bạn có nghĩ đây là giá trị phù hợp cho ngưỡng của khoảng giá trị mây hay không? / cloud likelihood?
- Sử dụng công cụ viewer để tìm hiểu các ảnh kết quả và thử các ngưỡng giá trị khác mà bạn muốn
Ghi chú: Bóng mây không được loại bỏ trong ảnh trên
Phần 3: (Không bắt buộc) Truy Nhập Metadata / Siêu Dữ Liệu
Biết cách truy nhập vào metadata/siêu dữ liệu của ảnh là rất quan trọng khi bạn tạo các srcript của mình
Ghi chú: Những ví dụ này là từ Hướng Dẫn của Earth Engine, có thể đọc tại: https://developers.google.com/earth-engine/image_info
- Xóa các script trước trong code editor
- Đọc kỹ các dòng lệnh dưới đây. Sau đó copy và paste vào code editor. Chạy/Run script và kiểm tra kết quả sau mỗi lệnh print/in.
// Get the image.
var LC8_image = ee.Image('LANDSAT/LC8_L1T_TOA/LC81290502015036LGN00');
//Add the image to the map as a false color composite.
Map.addLayer(LC8_image,{bands:'B6,B5,B4', min: 0.05, max: 0.8,gamma: 1.6}, 'Landsat8scene');
//center map on the tile
Map.centerObject(LC8_image, 9);
// Get information about the bands as a list.
var bandNames = LC8_image.bandNames();
print('Band names: ', bandNames); // ee.List of band names
// Get projection information from band 1.
var b1proj = LC8_image.select('B1').projection();
print('Band 1 projection: ', b1proj); // ee.Projection object
// Get scale (in meters) information from band 1.
var b1scale = LC8_image.select('B1').projection().nominalScale();
print('Band 1 scale: ', b1scale); // ee.Number
// Note that different bands can have different projections and scale.
var b8scale = LC8_image.select('B8').projection().nominalScale();
print('Band 8 scale: ', b8scale); // ee.Number
// Get a list of all metadata properties.
var properties = LC8_image.propertyNames();
print('Metadata properties: ', properties); // ee.List of metadata properties
// Get a specific metadata property.
var cloudiness = LC8_image.get('CLOUD_COVER');
print('CLOUD_COVER: ', cloudiness); // ee.Number
// Get the timestamp and convert it to a date.
var date = ee.Date(LC8_image.get('system:time_start'));
print('Timestamp: ', date); // ee.Date
Phần 4: (Đọc thêm) Một Số Khái Niệm Cơ Bản Về Đối Tượng
- Các Đối Tượng
Một đối tượng trong JavaScript là gì?
“JavaScrip là ngôn ngữ lập trình được thiết kế dựa trên đối tượng. Một đối tượng là một tập hợp các thuộc tính, và một thuộc tính là sự liên kết giữa tên (chìa khóa) và giá trị. Giá trị của thuộc tính có thể là một hàm, trong trường hợp đó thuộc tính được biết đến như một hàm. Cùng với các đối tượng được định nghĩa trước trong trình duyệt, bạn có thể định nghĩa đối tượng cho riêng mình (Mozilla Developer Network website)
Đọc thêm về đối tượng trong JavaScript tại đây: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects hoặc đây: http://eloquentjavascript.net/06_object.html.
Earth Engine cũng có các đối tượng. Đó là các đối tượng tồn tại trong Earth Engine nhưng không nhất thiết là một ứng dụng của JavaScript. Ví dụ đối tượng trong Earth Engine bao gồm ảnh (ví dụ: các cảnh ảnh Landsat), và danh mục ảnh (tập hợp các cảnh ảnh Landsat). Trong khóa học này, chúng ta sẽ tập trung chủ yếu vào các đối tượng của Earth Enghine và các phương pháp xử lý liên quan.
- Thuộc tính của đối tượng và các phương pháp liên quan
Thuộc tính: các đối tượng có chung các thuộc tính. Mỗi thuộc tính có tên (name) và giá trị (value). Cặp tên và giá trị cho bạn biết về đặc tính riêng của đối tượng. Ví dụ, một đối tượng ảnh có thuộc tính cụ thể cho đối tượng đó, ví dụ một cảnh Landsat là một ảnh có dạng dữ liệu, 12 band/kênh phổ và một lượng lớn metadata / siêu dữ liệu (về ngày bay, hệ tọa độ, etc …)
Phương pháp: các hàm được lập cho từng dạng đối tượng được gọi là phương pháp. Chúng có thể thu nhận dữ liệu, sắp xếp dữ liệu, cập nhật giá trị thuộc tính của một đối tượng. Chúng ta không nhất thiết lúc nào cũng cần biết máy tính làm thế nào để thực hiện các lệnh, tuy nhiên bạn cần biết cần cách hỏi và yêu cầu máy tính và kiểm tra những kết quả nhận được. Ví dụ, bạn đã sử dụng NormalizedDifference là một chức năng phân tích đối tượng ảnh.
- Các Đối Tượng Ảnh Earth Engine
Trong GEE Code Editor, dữ liệu raster có thể được thể hiện dưới hai dạng đối tượng: đối tượng ảnh, hoặc tập hợp ảnh.
Ảnh: dữ liệu raster được biểu diễn dưới dạng đối tượng ảnh trong Earth Engine. Một đối tượng ảnh thể hiện một ảnh raster độc lập, ví dụ một cảnh ảnh Landsat được thu nhận trong một ngày nhất định, một ảnh Landsat tổ hợp bằng phép lọc trung bình (median), hoặc các tập dữ liệu địa hình (DEM). Các ảnh được tổ hợp từ một hay nhiều band/kệnh phổ, mỗi band có tên, dạng dữ liệu, độ phân giải pixel và lưới chiếu. Mỗi ảnh cũng có metadata bao gồm thư mục các các thuộc tính. Xem thêm tại đây - https://developers.google.com/earth-engine/image_info
Tập hợp ảnh : là một tập hợp hoặc nhóm các ảnh. Ví dụ tập hợp ảnh Landsat 8 TOA Reflectance (LANDSAT/LC8_L1T_TOA) gồm toàn bộ các ảnh Landsat 8 được thu nhận từ 11 Tháng 4, 2013, được nắn chỉnh và quy đổi theo Hệ số phản xạ từ bề mặt khí quyển (Top of Atmosphere reflectance). Những tập ảnh rất có ích cho phân tích theo thời gian hoặc tạo ra tổ hợp ảnh ít mây sử dụng các ảnh có được từ một vài phép thu nhận ảnh khác nhau
- Các đối tượng Vector trong Earth Engine
Earth Engine sử dụng các dữ liệu dạng hình học (như GeoJSON hoặc GeoJSONGeometryCollection) để lưu trữ các dữ liệu vector; gồm có điểm (point), chuỗi đường thẳng (line string), đường vòng (linear rings), và dạng vùng (polygon). Bạn có thể tạo các đối tượng hình học sử dụng công cụ draw hoặc với dạnh sách của các hệ tọa độ. Một đối tượng có một dạng hình học, cũng như ảnh, kèm theo thư mục của các thuộc tính.
Bạn có thể tạo một đối tượng hình học trong Earth Engine, GeoJSON Feature hoặc tập hợp các đối tượng, Shapefile có thể được chuyển đổi thành Fusion Table và được truy nhập qua Earth Engine như một tập hợp đối tượng
Bài tập 2: Đối tượng ảnh trong Earth Engine và các hàm |