투영

Earth Engine은 연산을 수행할 때 지도 투영을 거의 걱정하지 않아도 되도록 설계되었습니다. 크기와 마찬가지로 계산이 이루어지는 투영은 '풀'을 기준으로 결정됩니다. 특히 입력은 출력 프로젝션에서 요청됩니다. 출력은 함수 매개변수 (예: crs), 코드 편집기 및 geemap 지도 객체 (maps mercator (EPSG:3857) 투영이 있음) 또는 reproject() 호출로 결정될 수 있습니다. 코드 편집기 또는 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 설정

Python API 및 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에 나와 있습니다. 입력의 투영은 출력, 특히 코드 편집기의 지도 표시의 maps mercator 투영에 의해 결정됩니다. 이 투영은 입력이 지도의 확대/축소 수준에 따라 결정된 축척으로 지도 메르카토르에서 요청되도록 작업 시퀀스를 통해 다시 전파됩니다.

프로젝션
그림 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 설정

Python API 및 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())

projection()에서 반환된 ee.Projection에서 nominalScale()을 호출하면 이미지의 기본 해상도를 확인할 수 있습니다. 기본 해상도는 이미지 피라미드의 최하위 수준의 명목상 픽셀 스케일(미터)입니다. 이미지의 각 밴드는 서로 다른 스케일 또는 투영을 가질 수 있으므로 다른 밴드와 투영이 다른 밴드가 하나 이상 있는 이미지에서 projection()를 호출하면 다음과 같은 오류가 표시될 수 있습니다.

기본 투영

특정 투영에서 계산이 이루어져야 하는 경우가 아니라면 일반적으로 투영을 지정할 필요가 없습니다. 모호한 출력에 대해서만 Earth Engine에서 투영 및/또는 스케일을 지정하도록 요구합니다. 모호성은 투영이 다른 이미지가 포함된 ImageCollection를 줄여서 발생할 수 있습니다(즉, 컴포지션 만들기). 서로 다른 투영이 있는 입력 이미지의 합성 또는 모자이크인 이미지는 1도 스케일의 WGS84인 기본 투영을 갖습니다. 예를 들면 다음과 같습니다.

코드 편집기(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 설정

Python API 및 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 설정

Python API 및 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)

고정된 투영이 필요한 몇 가지 사례는 다음과 같습니다.

reproject()를 꼭 사용해야 하는 경우가 아니라면 사용하지 않는 것이 좋습니다. 예를 들어 항목을 재투영하고 지도에 추가한다고 가정해 보겠습니다. reproject() 호출에서 지정한 스케일이 지도의 확대/축소 수준보다 훨씬 작은 경우 Earth Engine은 매우 넓은 공간 범위에 걸쳐 매우 작은 스케일로 모든 입력을 요청합니다. 이로 인해 한 번에 너무 많은 데이터가 요청되어 오류가 발생할 수 있습니다.

최종 출력이 reproject() 호출에 지정된 투영과 다른 투영에 있는 경우 다른 재투영이 발생합니다. 따라서 코드에서 reproject()를 사용할 때는 주의해야 합니다. 다음 예에서는 MODIS 이미지를 먼저 WGS84로 재투영한 다음 코드 편집기 지도에 표시하기 위해 maps mercator로 재투영합니다.

코드 편집기(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 설정

Python API 및 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 이미지의 재투영에 해당하는 작업의 흐름도 곡선은 재투영, 특히 출력 투영 및 스케일로의 정보 흐름을 나타냅니다.