Earth Engine은 계산할 때 지도 투영에 대해 거의 걱정할 필요가 없도록 설계되었습니다. 크기와 마찬가지로 계산이 실행되는 투영은 '가져오기' 기준으로 결정됩니다. 특히 입력은 출력 프로젝션에서 요청됩니다. 출력은 함수 매개변수 (예: crs
), 코드 편집기, geemap 지도 객체 (지도 메르카토르 (EPSG:3857) 투영이 적용됨) 또는 reproject()
호출을 통해 결정될 수 있습니다. Code Editor 또는 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())
projection()
에서 반환된 ee.Projection
에서 nominalScale()
을 호출하면 이미지의 기본 해상도를 확인할 수 있습니다. 기본 해상도는 이미지 피라미드의 최하위 수준의 공칭 픽셀 크기(단위: 미터)입니다. 이미지의 각 밴드에 다른 크기 또는 투영이 있을 수 있으므로 다른 밴드와 투영이 다른 밴드가 하나 이상 있는 이미지에서 projection()
를 호출하면 다음과 같은 오류가 표시될 수 있습니다.
기본 투영
특정 투영에서 계산이 실행되어야 하는 경우가 아니라면 일반적으로 투영을 지정할 필요가 없습니다. 모호한 출력의 경우에만 Earth Engine에서 프로젝션 또는 배율을 지정해야 합니다. 모호성은 다른 투영이 적용된 이미지가 포함된 ImageCollection
를 줄이면 발생할 수 있습니다(즉, 합성 만들기). 서로 다른 투영이 적용된 입력 이미지의 합성물 또는 모자이크인 이미지에는 기본 투영(1도 스케일의 WGS84)이 적용됩니다.
예를 들면 다음과 같습니다.
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에서 자동으로 실행됩니다. 또한 사용할 투영에 관한 정보가 요청에서 입력으로 다시 전파됩니다.
