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 градус. Если эта проекция по умолчанию не подходит для вашего анализа (например, она слишком грубая или вам необходимо предотвратить артефакты передискретизации в последующих вычислениях, таких как анализ рельефа), вы можете установить другую проекцию по умолчанию, используя image.setDefaultProjection(crs) . Это гарантирует, что если Earth Engine потребуется выбрать проекцию для вычислений, связанных с изображением, он будет использовать указанную проекцию, а не 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используется, когда необходимо объединить пиксели с более высоким разрешением в пиксели с более низким разрешением. ( Подробнее о снижении разрешения ).
Функции из пакета ee.Terrain (например, slope , aspect , hillshade ) вычисляют значения на основе соседних пикселей и чувствительны к артефактам передискретизации, возникающим во время перепроецирования. Когда проекция вычислений отличается от собственной проекции ЦМР, передискретизация по умолчанию методом ближайших соседей может создавать искусственные узоры на выходе. Для достижения наилучших результатов выполняйте анализ рельефа в собственной проекции ЦМР. При работе с ImageCollection из фрагментов ЦМР создайте мозаику и используйте setDefaultProjection() с собственной проекцией коллекции, чтобы гарантировать выполнение анализа на правильной сетке, как описано в разделе «Проекция по умолчанию» .
Существует несколько причин, по которым следует избегать использования 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 автоматически для отображения результата на карте. Также обратите внимание, что информация о том, какую проекцию использовать, передается обратно от запроса к входным данным.
