Earth Engine được thiết kế để bạn hiếm khi phải lo lắng về các phép chiếu bản đồ khi thực hiện các phép tính. Cũng như tỷ lệ, phép chiếu trong đó các phép tính diễn ra được xác định 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. Kết quả có thể được xác định từ tham số hàm (ví dụ: crs
),
Trình soạn thảo mã và đố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 sẽ được yêu cầu ở maps mercator. Hãy xem xét thao tác đơn giản sau đây trên hình ảnh MODIS có phép chiếu sinusoidal:
// 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
# 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 trình bày trong sơ đồ Hình 1. Xin lưu ý rằng hình chiếu của dữ liệu đầu vào được xác định bằng dữ liệu đầu ra, cụ thể là hình chiếu maps mercator của bản đồ hiển thị trong Trình chỉnh sửa mã. Hình chiếu này sẽ truyền trở lại thông qua trình tự các phép toán sao cho dữ liệu đầu vào được yêu cầu trong bản đồ Mercator, ở tỷ lệ do cấp độ thu phóng của bản đồ xác định.

Trong Earth Engine, các phép chiếu được chỉ định bằng 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 hình chiếu của một hình ảnh bằng cách gọi projection()
trên hình ảnh đó:
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
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 của hình ảnh có thể có một tỷ lệ và/hoặc phép chiếu khác nhau, nên nếu gọi projection()
trên một hình ảnh có ít nhất một dải không có cùng phép chiếu với các dải khác, bạn có thể thấy lỗi như:
Hình chiếu mặc định
Trừ phi bạn cần phép tính xảy ra trong một phép chiếu cụ thể, thông thường bạn không cần chỉ định phép chiếu. Earth Engine chỉ yêu cầu bạn chỉ định một phép chiếu và/hoặc tỷ lệ đối với kết quả đầu ra không rõ ràng. Sự mơ hồ có thể là do việc giảm ImageCollection
chứa hình ảnh có nhiều phép chiếu khác nhau (tức là tạo một thành phần kết 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ó nhiều phép chiếu sẽ có phép chiếu mặc định là WGS84 theo tỷ lệ 1 độ.
Ví dụ:
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
collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA') mosaic = collection.filterDate('2018-01-01', '2019-01-01').mosaic() display(mosaic.projection())
Nếu cố gắng sử dụng một hình ảnh như thế này trong quá trình tính toán, bạn có thể thấy lỗi như sau:
Thông thường, bạn không nên hoặc không muốn tổng hợp ở tỷ lệ 1 độ. Vì vậy, Earth Engine sẽ nhắc bạn cung cấp thông số kỹ thuật đầy đủ cho kết quả.
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 "mất" của phép chiếu, nhưng các pixel không thực sự đượ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 thành phần kết hợp.
Trong hầu hết 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ỳ cấp độ thu phóng nào mà không phải chờ 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à kết quả có thể khác nhau ở các mức thu phóng.
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 đầu ra như mô tả trong phần sau.
Chiếu lại
Bạn có thể buộc các phép toán đượ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 cá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 đã chỉ định. Ví dụ: để buộc tạo một thành phần kết hợp trong một phép chiếu cụ thể:
// 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
# 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 cần có phép chiếu cố định:
- Tính toán độ dốc (ví dụ:
ee.Terrain.gradient
hoặcee.Terrain.slope
). reduceResolution
, dành cho trường hợp bạn muốn tổng hợp các pixel có độ phân giải cao hơn vào độ phân giải thấp hơn. (Tìm hiểu thêm về việc giảm độ phân giải).
Có một số lý do bạn nên tránh sử dụng reproject()
trừ trường hợp bạn thực sự cần. Ví dụ: giả sử bạn chiếu lại một đối tượng và thêm đối tượng đó vào bản đồ. Nếu tỷ lệ mà 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 một 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 kết quả cuối cùng ở 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 một phép chiếu lại khác. Đâ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ã. Hãy xem xét ví dụ sau đây, trong đó buộc hình ảnh MODIS phải được chiếu lại lần đầu tiên thành WGS84, sau đó chiếu lại thành bản đồ Mercator để hiển thị trong bản đồ Trình soạn thảo mã:
// 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
# 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 thao tác tương ứng với ví dụ đơn giản về việc chiếu lại này. Xin lưu ý rằng lần chiếu lại đầu tiên là rõ ràng, như đã chỉ định trong lệnh gọi reproject()
. Quá trình chiếu lại thứ hai là ngầm ẩn, do Earth Engine tự động thực hiện để hiển thị kết quả trên bản đồ. Ngoài ra, hãy quan sát rằng thông tin về việc sử dụng phép chiếu nào sẽ được truyền ngược từ yêu cầu đến dữ liệu đầu vào.
