Earth Engine được thiết kế để bạn hiếm khi phải lo lắng về phép chiếu bản đồ khi
tính toán. Tương tự như tỷ lệ, phép chiếu mà các phép tính diễn ra được
xác định dựa trên cơ sở "kéo". Cụ thể, dữ liệu đầu vào được yêu cầu trong phép chiếu đầu ra. Dữ liệu đầu ra có thể được xác định từ một tham số hàm (ví dụ: crs),
Trình soạn thảo mã và các đối tượng bản đồ geemap (có phép chiếu maps
mercator (EPSG:3857)) hoặc bằng lệnh gọi reproject(). Khi bạn
hiển thị hình ảnh trong Trình soạn thảo mã hoặc geemap, dữ liệu đầu vào được yêu cầu trong
mercator bản đồ. Hãy xem xét thao tác sau trên hình ảnh MODIS có phép chiếu hình sin:
Trình soạn thảo mã (JavaScript)
// The input image has a SR-ORG:6974 (sinusoidal) projection. var image = ee.Image('MODIS/061/MOD13A1/2014_05_09').select(0); // Normalize the image and add it to the map. var rescaled = image.unitScale(-2000, 10000); var visParams = {min: 0.15, max: 0.7}; Map.addLayer(rescaled, visParams, 'Rescaled');
import ee import geemap.core as geemap
Colab (Python)
# The input image has a SR-ORG:6974 (sinusoidal) projection. image = ee.Image('MODIS/061/MOD13A1/2014_05_09').select(0) # Normalize the image and add it to the map. rescaled = image.unitScale(-2000, 10000) vis_params = {'min': 0.15, 'max': 0.7} m = geemap.Map() m.add_layer(rescaled, vis_params, 'Rescaled') m
Thứ tự các thao tác cho mã mẫu này được minh hoạ trong Hình 1. Xin lưu ý rằng phép chiếu của dữ liệu đầu vào được xác định bởi dữ liệu đầu ra, cụ thể là phép chiếu mercator bản đồ của màn hình bản đồ trong Trình soạn thảo mã. Phép chiếu này lan truyền ngược lại thông qua chuỗi thao tác để dữ liệu đầu vào được yêu cầu trong mercator bản đồ, ở tỷ lệ được xác định bởi mức thu phóng của bản đồ.
Trong Earth Engine, phép chiếu được chỉ định theo Hệ toạ độ tham chiếu (CRS hoặc
tham số crs của nhiều phương thức). Bạn có thể kiểm tra phép chiếu của một
hình ảnh bằng cách gọi projection() trên hình ảnh đó:
Trình soạn thảo mã (JavaScript)
var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318').select(0); print('Projection, crs, and crs_transform:', image.projection()); print('Scale in meters:', image.projection().nominalScale());
import ee import geemap.core as geemap
Colab (Python)
image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318').select(0) display('Projection, crs, and crs_transform:', image.projection()) display('Scale in meters:', image.projection().nominalScale())
Xin lưu ý rằng bằng cách gọi nominalScale() trên ee.Projection do projection() trả về, bạn có thể xác định độ phân giải gốc của hình ảnh. Độ phân giải gốc là tỷ lệ pixel danh nghĩa tính bằng mét của cấp thấp nhất trong
kim tự tháp hình ảnh. Vì mỗi dải tần của hình ảnh có thể có
tỷ lệ và/hoặc phép chiếu khác nhau, nên nếu bạn gọi projection() trên một hình ảnh
có ít nhất một dải tần không có cùng phép chiếu với các dải tần khác, bạn có thể thấy lỗi
như sau:
Phép chiếu mặc định
Trừ phi bạn cần phép tính diễn ra trong một phép chiếu cụ thể, còn không thì thường
không cần chỉ định phép chiếu. Chỉ đối với dữ liệu đầu ra không rõ ràng, Earth Engine
mới yêu cầu bạn chỉ định phép chiếu và/hoặc tỷ lệ. Sự không rõ ràng có thể là do
việc giảm ImageCollection chứa hình ảnh có các phép chiếu khác nhau
(tức là tạo một hình ảnh tổng hợp). Hình ảnh là hình ảnh
tổng hợp hoặc hình ảnh ghép của các hình ảnh đầu vào có các phép chiếu khác nhau sẽ có phép chiếu
mặc định là WGS84 với tỷ lệ 1 độ.
Nếu phép chiếu mặc định này không phù hợp với phân tích của bạn (ví dụ: quá thô hoặc bạn cần ngăn chặn các cấu phần giả tạo do lấy mẫu lại trong các phép tính xuôi dòng như phân tích địa hình), bạn có thể đặt một giá trị mặc định khác bằng cách sử dụng image.setDefaultProjection(crs). Điều này đảm bảo rằng nếu Earth
Engine cần chọn một phép chiếu cho phép tính liên quan đến hình ảnh,
thì hệ thống sẽ sử dụng phép chiếu được chỉ định thay vì WGS84 ở tỷ lệ 1 độ.
Ví dụ:
Trình soạn thảo mã (JavaScript)
var collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA'); var mosaic = collection.filterDate('2018-01-01', '2019-01-01').mosaic(); print(mosaic.projection());
import ee import geemap.core as geemap
Colab (Python)
collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA') mosaic = collection.filterDate('2018-01-01', '2019-01-01').mosaic() display(mosaic.projection())
Nếu bạn cố gắng sử dụng một hình ảnh như thế này trong một phép tính, bạn có thể thấy lỗi như sau:
Thông thường, bạn không muốn hoặc không có ý định tổng hợp ở tỷ lệ 1 độ, vì vậy, Earth Engine đưa ra lời nhắc thân thiện này để cung cấp thông số kỹ thuật hoàn chỉnh cho dữ liệu đầu ra.
Người dùng thường thấy hành vi này gây nhầm lẫn và lo lắng về thông tin phép chiếu "bị mất" , nhưng các pixel thực sự không được tính toán cho đến khi cần (tìm hiểu thêm) và tại thời điểm đó, luôn có một phép chiếu đầu ra đi kèm với yêu cầu chỉ định cách tính toán hình ảnh tổng hợp.
Trong phần lớn các trường hợp sử dụng, việc không có phép chiếu không phải là vấn đề và thực sự là một phương pháp tối ưu hoá có giá trị, vì nó cho phép xem trước kết quả ở bất kỳ mức thu phóng nào mà không cần phải đợi quá trình tính toán độ phân giải đầy đủ hoàn tất. Tuy nhiên, điều này có nghĩa là dữ liệu đầu ra có thể xuất hiện khác nhau ở các mức thu phóng khác nhau.
Nếu hình ảnh hiển thị được tối ưu hoá không đủ, bạn có thể buộc tính toán trong một phép chiếu cụ thể bằng cách chiếu lại dữ liệu đầu ra như mô tả trong phần sau.
Chiếu lại
Bạn có thể buộc các thao tác được thực hiện trong một phép chiếu cụ thể bằng phương thức
reproject() Việc sử dụng reproject() sẽ dẫn đến việc dữ liệu đầu vào
được yêu cầu trong phép chiếu được chỉ định trong lệnh gọi reproject().
Các phép tính trong mã của bạn trước lệnh gọi reproject() sẽ được thực hiện
trong phép chiếu được chỉ định. Ví dụ: để buộc tạo một hình ảnh tổng hợp trong một
phép chiếu cụ thể:
Trình soạn thảo mã (JavaScript)
// Some projection that is suitable for your area of interest. var proj = ee.Projection(...); var output = collection.reduce(...).reproject(proj);
import ee import geemap.core as geemap
Colab (Python)
# Some projection that is suitable for your area of interest. proj = ee.Projection(...) output = collection.reduce(...).reproject(proj)
Sau đây là một số trường hợp yêu cầu phép chiếu cố định:
- Tính toán độ dốc (ví dụ:
ee.Terrain.gradienthoặcee.Terrain.slope). reduceResolution, khi bạn muốn tổng hợp các pixel có độ phân giải cao hơn thành độ phân giải thấp hơn. (Tìm hiểu thêm về giảm độ phân giải).
Các hàm trong gói ee.Terrain (ví dụ: slope,
aspect, hillshade) tính toán các giá trị dựa trên các pixel lân cận
và nhạy cảm với các cấu phần giả tạo do lấy mẫu lại được đưa vào trong
quá trình chiếu lại. Khi phép chiếu của phép tính khác với phép chiếu gốc của DEM, việc lấy mẫu lại theo phương pháp láng giềng gần nhất mặc định có thể tạo ra các mẫu nhân tạo trong dữ liệu đầu ra. Để có kết quả tốt nhất, hãy phân tích địa hình
trong phép chiếu gốc của DEM. Nếu làm việc với một
ImageCollection của các ô DEM, hãy tạo một hình ảnh ghép và sử dụng
setDefaultProjection() với
phép chiếu gốc của bộ sưu tập để đảm bảo quá trình phân tích chạy trên lưới chính xác, như mô tả
trong phần Phép chiếu mặc định.
Có một số lý do khiến bạn nên tránh sử dụng reproject() trừ phi bạn
thực sự cần thiết. Ví dụ: giả sử bạn chiếu lại một nội dung nào đó và thêm nội dung đó vào bản đồ. Nếu tỷ lệ bạn chỉ định trong lệnh gọi reproject() nhỏ hơn nhiều
so với mức thu phóng của bản đồ, thì Earth Engine sẽ yêu cầu tất cả dữ liệu đầu vào ở tỷ lệ rất nhỏ
trên phạm vi không gian rất rộng. Điều này có thể dẫn đến việc yêu cầu quá nhiều dữ liệu cùng một lúc
và gây ra lỗi.
Nếu dữ liệu đầu ra cuối cùng nằm trong một phép chiếu khác với phép chiếu được chỉ định trong lệnh gọi
reproject(), thì điều đó sẽ dẫn đến việc chiếu lại một lần nữa. Đây là
một lý do khác khiến bạn phải thận trọng khi sử dụng reproject() trong mã của mình. Hãy xem xét
ví dụ sau, ví dụ này buộc hình ảnh MODIS phải được chiếu lại thành
WGS84 trước, sau đó chiếu lại thành
mercator bản đồ để hiển thị trong bản đồ Trình soạn thảo mã:
Trình soạn thảo mã (JavaScript)
// The input image has a SR-ORG:6974 (sinusoidal) projection. var image = ee.Image('MODIS/061/MOD13A1/2014_05_09').select(0); // Operations *before* the reproject call will be done in the projection // specified by reproject(). The output results in another reprojection. var reprojected = image .unitScale(-2000, 10000) .reproject('EPSG:4326', null, 500); Map.addLayer(reprojected, {min: 0.15, max: 0.7}, 'Reprojected');
import ee import geemap.core as geemap
Colab (Python)
# The input image has a SR-ORG:6974 (sinusoidal) projection. image = ee.Image('MODIS/061/MOD13A1/2014_05_09').select(0) # Operations *before* the reproject call will be done in the projection # specified by reproject(). The output results in another reprojection. reprojected = image.unitScale(-2000, 10000).reproject('EPSG:4326', None, 500) m = geemap.Map() m.add_layer(reprojected, {'min': 0.15, 'max': 0.7}, 'Reprojected') m
Hình 2 minh hoạ quy trình các thao tác tương ứng với ví dụ chiếu lại đơn giản này. Xin lưu ý rằng lần chiếu lại đầu tiên là rõ ràng, như được chỉ định trong lệnh gọi
reproject(). Lần chiếu lại thứ hai là ngầm ẩn, được
Earth Engine tự động thực hiện để hiển thị kết quả trên bản đồ. Ngoài ra, hãy lưu ý rằng thông tin về phép chiếu cần sử dụng sẽ lan truyền ngược lại từ yêu cầu đến dữ liệu đầu vào.