Earth Engine được thiết kế để bạn hiếm khi phải lo lắng về phép chiếu bản đồ khi thực hiện các phép tính. Giống như tỷ lệ, phép chiếu mà các phép tính diễn ra được xác định trên cơ sở "kéo". Cụ thể, các đầu vào được yêu cầu trong phép chiếu đầu ra. Đầu ra có thể được xác định từ một tham số hàm (ví dụ: crs), Trình chỉnh sửa 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 chỉnh sửa mã hoặc geemap, các đầu vào sẽ được yêu cầu trong mercator bản đồ. Hãy xem xét thao tác sau trên một 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ự hoạt động của mã mẫu này được minh hoạ trong Hình 1. Xin lưu ý rằng phép chiếu của thông tin đầu vào được xác định bằng đầu ra, cụ thể là phép chiếu maps mercator của màn hình bản đồ trong Trình chỉnh sửa mã. Phép chiếu này lan truyền ngược lại thông qua chuỗi các thao tác sao cho các đầu vào được yêu cầu trong Mercator của bản đồ, ở tỷ lệ do mức thu phóng của bản đồ xác định.
Trong Earth Engine, phép chiếu được chỉ định bằng Hệ thống tham chiếu toạ độ (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 cấu trúc phân cấp hình ảnh. Vì mỗi dải của một hình ảnh có thể có 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 một lỗi như:
Phép chiếu mặc định
Trừ phi cần tính toán trong một phép chiếu cụ thể, nếu không thì bạn thường không cần chỉ định phép chiếu. Chỉ đối với đầ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ự mơ hồ có thể xuất phát từ việc giảm một ImageCollection chứa hình ảnh với các phép chiếu khác nhau (tức là tạo một hình ảnh kết hợp). Một 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 độ.
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 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 một lỗi như:
Thông thường, bạn không muốn hoặc không có ý định thực hiện một phép tổng hợp ở tỷ lệ 1 độ, vì vậy Earth Engine sẽ đưa ra lời nhắc thân thiện này để cung cấp thông số kỹ thuật đầy đủ cho đầ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 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 thành phần.
Trong đa số 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 tế là một hoạt động tối ưu hoá có giá trị, vì nó cho phép xem trước kết quả ở mọi mức thu phóng mà không phải đợi quá trình tính toán độ phân giải đầy đủ hoàn tất. Nhưng điều này có nghĩa là đầ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 đầu ra như mô tả trong phần sau.
Đang 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 các đầ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 một thành phần kết hợp được tạo 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 thành độ phân giải thấp hơn. (Tìm hiểu thêm về cách giảm độ phân giải).
Có một số lý do khiến bạn nên tránh sử dụng reproject() trừ trường hợp thực sự cần thiết. Giả sử, chẳng hạn như 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ả các đầ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 đầ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 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ã của mình. Hãy xem xét ví dụ sau đây, ví dụ này buộc hình ảnh MODIS phải được chiếu lại trước tiên thành WGS84, sau đó chiếu lại thành maps mercator để hiển thị trong bản đồ Trình chỉnh sửa 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 hoạt động tương ứng với ví dụ đơn giản về việc chiếu lại này. Xin lưu ý rằng việc chiếu lại đầu tiên là rõ ràng, như được chỉ định trong lệnh gọi reproject(). Quá trình chiếu lại thứ hai là quá trình ngầm, đượ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ẽ truyền ngược từ yêu cầu đến thông tin đầu vào.