Проекции

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');

настройка Python

Информацию об API Python и использовании geemap для интерактивной разработки можно найти на странице «Среда Python» .

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. Обратите внимание, что проекция входных данных определяется выходными данными, а именно проекцией Меркатора карты, отображаемой в редакторе кода. Эта проекция распространяется обратно по последовательности операций таким образом, что входные данные запрашиваются в проекции Меркатора карты в масштабе, определяемом уровнем масштабирования карты.

проекция
Рисунок 1. Блок-схема операций, соответствующих отображению изображения MODIS на карте редактора кода. Проекции (левая часть блок-схемы) каждой операции определяются на основе выходных данных. Изогнутые линии показывают поток информации для перепроецирования: в частности, выходную проекцию и масштаб.

В 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());

настройка Python

Информацию об API Python и использовании geemap для интерактивной разработки можно найти на странице «Среда Python» .

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());

настройка Python

Информацию об API Python и использовании geemap для интерактивной разработки можно найти на странице «Среда Python» .

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);

настройка Python

Информацию об API Python и использовании geemap для интерактивной разработки можно найти на странице «Среда Python» .

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');

настройка Python

Информацию об API Python и использовании geemap для интерактивной разработки можно найти на странице «Среда Python» .

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 автоматически для отображения результата на карте. Также обратите внимание, что информация о том, какую проекцию использовать, передается обратно от запроса к входным данным.

репроекция
Рисунок 2. Блок-схема операций, соответствующих перепроецированию изображения MODIS на карту редактора кода. Изогнутые линии показывают поток информации для перепроецирования: в частности, выходную проекцию и масштаб.