투영

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 투영에 의해 결정됩니다. 이 투영은 일련의 작업을 통해 다시 전파되므로 입력은 지도의 확대/축소 수준에 따라 결정되는 축척으로 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인 기본 투영을 갖습니다. 이 기본 투영이 분석에 적합하지 않은 경우 (예: 너무 대략적이거나 지형 분석과 같은 다운스트림 계산에서 리샘플링 아티팩트를 방지해야 하는 경우) 다른 기본값을 설정할 수 있습니다. image.setDefaultProjection(crs). 이렇게 하면 Earth Engine이 이미지와 관련된 계산의 투영을 선택해야 하는 경우 축척이 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)

고정 투영이 필요한 몇 가지 경우는 다음과 같습니다.

ee.Terrain 패키지의 함수 (예: slope, aspect, hillshade)는 인접 픽셀을 기반으로 값을 계산하며 재투영 중에 도입된 리샘플링 아티팩트에 민감합니다. 계산의 투영이 DEM의 기본 투영과 다른 경우 기본 최근접 리샘플링은 출력에서 인공 패턴을 만들 수 있습니다. 최상의 결과를 얻으려면 DEM의 기본 투영에서 지형 분석을 수행하세요. DEM 타일의 ImageCollection으로 작업하는 경우 기본 투영 섹션에 설명된 대로 모자이크를 만들고 컬렉션의 기본 투영과 함께 setDefaultProjection()을 사용하여 분석이 올바른 그리드에서 실행되도록 합니다.

절대적으로 필요한 경우가 아니면 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 이미지의 재투영에 해당하는 작업의 순서도 곡선은 재투영으로의 정보 흐름, 특히 출력 투영 및 축척을 나타냅니다.