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

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