Проекции

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

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

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

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

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

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

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

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

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

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

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

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

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

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