Earth Engine разработан таким образом, что вам редко приходится беспокоиться о картографических проекциях при выполнении вычислений. Как и в случае с масштабом, проекция, в которой выполняются вычисления, определяется по принципу «запроса». В частности, входные данные запрашиваются в выходной проекции. Выходные данные могут определяться из параметра функции (например crs ), объектов карт Code Editor и geemap (которые имеют проекцию maps mercator (EPSG:3857) ) или с помощью вызова reproject() . При отображении изображений в Code Editor или geemap входные данные запрашиваются в проекции maps mercator . Рассмотрим следующую операцию над изображением MODIS, которое имеет синусоидальную проекцию:
Редактор кода (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
Последовательность операций в этом примере кода показана на рисунке 1. Обратите внимание, что проекция входных данных определяется выходными данными, а именно проекцией Меркатора карты, отображаемой в редакторе кода. Эта проекция распространяется обратно по последовательности операций таким образом, что входные данные запрашиваются в проекции Меркатора карты в масштабе, определяемом уровнем масштабирования карты.

В Earth Engine проекции задаются системой координат (CRS или параметром crs во многих методах). Проверить проекцию изображения можно, вызвав projection() :
Редактор кода (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())
Обратите внимание, что, вызвав nominalScale() для ee.Projection , возвращаемого функцией projection() , вы можете определить собственное разрешение изображения. Собственное разрешение — это номинальный масштаб пикселей в метрах самого нижнего уровня пирамиды изображений . Поскольку каждый канал изображения может иметь разный масштаб и/или проекцию, если вы вызовете projection() для изображения, у которого хотя бы один канал имеет другую проекцию, вы можете увидеть ошибку, подобную следующей:
Проекция по умолчанию
Если вам не требуется выполнять вычисления в определенной проекции, обычно нет необходимости указывать проекцию. Только для неоднозначных выходных данных Earth Engine потребует указать проекцию и/или масштаб. Неоднозначность может возникнуть при уменьшении размера ImageCollection , содержащей изображения с разными проекциями (т.е. при создании композитного изображения ). Изображение, представляющее собой композит или мозаику из входных изображений с разными проекциями, будет иметь проекцию по умолчанию, которая является WGS84 с масштабом 1 градус. Например:
Редактор кода (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())
Если вы попытаетесь использовать подобное изображение в вычислениях, вы можете увидеть ошибку следующего вида:
Как правило, агрегирование в масштабе 1 градуса нежелательно и не предполагается, поэтому Earth Engine напоминает о необходимости предоставления полной спецификации для выходных данных.
Пользователи часто считают такое поведение непонятным и беспокоятся о «потерянной» информации о проекции, но пиксели фактически вычисляются только тогда, когда они необходимы ( подробнее ), и в этот момент всегда существует выходная проекция, которая сопровождает запрос, определяющий способ вычисления композиции.
В подавляющем большинстве случаев отсутствие проекции не является проблемой и даже представляет собой ценную оптимизацию, поскольку позволяет предварительно просматривать результаты на любом уровне масштабирования, не дожидаясь завершения вычисления полного разрешения. Однако это означает, что результат может выглядеть по-разному на разных уровнях масштабирования.
Если оптимизированного изображения на экране по какой-либо причине недостаточно, вычисления в определенной проекции можно принудительно выполнить путем повторной проекции выходных данных, как описано в следующем разделе.
Репроецирование
С помощью метода reproject() можно принудительно задать выполнение операций в определенной проекции. Использование reproject() приводит к тому, что запрашиваемые входные данные выполняются в проекции, указанной в вызове reproject() . Вычисления в вашем коде до вызова reproject() будут выполняться в указанной проекции. Например, чтобы принудительно создать составной объект в определенной проекции:
Редактор кода (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)
К числу случаев, требующих фиксированной проекции, относятся следующие:
- Вычисление градиентов (например,
ee.Terrain.gradientилиee.Terrain.slope). -
reduceResolutionиспользуется, когда необходимо объединить пиксели с более высоким разрешением в пиксели с более низким разрешением. ( Подробнее о снижении разрешения ).
Существует несколько причин, по которым следует избегать использования reproject() если в этом нет крайней необходимости. Предположим, например, вы перепроецируете что-либо и добавляете это на карту. Если масштаб, указанный в вызове reproject() намного меньше уровня масштабирования карты, Earth Engine запросит все входные данные в очень малом масштабе на очень широкой пространственной области. Это может привести к запросу слишком большого объема данных одновременно и вызвать ошибку.
Если итоговый результат будет получен в проекции, отличной от указанной в вызове reproject() , это приведет к повторной перепроецированию. Это еще одна причина с осторожностью использовать reproject() в вашем коде. Рассмотрим следующий пример, который заставляет изображение MODIS сначала быть перепроецировано в WGS84 , а затем в проекцию Меркатора для отображения на карте в редакторе кода:
Редактор кода (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
На рисунке 2 показана последовательность операций, соответствующих этому простому примеру перепроецирования. Обратите внимание, что первое перепроецирование является явным, как указано в вызове функции reproject() . Второе перепроецирование является неявным, выполняется Earth Engine автоматически для отображения результата на карте. Также обратите внимание, что информация о том, какую проекцию использовать, передается обратно от запроса к входным данным.
