Earth Engine REST API를 사용한 이미지 계산

참고: REST API에는 일부 사용자에게 적합하지 않을 수 있는 새롭고 고급 기능이 포함되어 있습니다. Earth Engine을 처음 사용하는 경우 JavaScript 가이드로 시작하세요.

Earth Engine REST API 빠른 시작에서는 Earth Engine 애셋에서 픽셀 블록에 액세스하는 방법을 보여줍니다. 결과를 얻기 전에 픽셀에 계산을 적용한다고 가정해 보겠습니다. 이 가이드에서는 클라이언트 라이브러리 중 하나를 사용하여 계산을 프로토타입으로 만들고, 계산 그래프를 직렬화하고, REST API를 사용하여 계산된 결과를 가져오는 방법을 보여줍니다. REST API를 통해 컴퓨팅 요청을 실행하는 것은 컴퓨팅 엔드포인트(예: computePixels, computeFeatures 또는 일반 value.compute) 중 하나에 대한 POST 요청에 해당합니다. 특히 이 예에서는 작은 지역에서 Sentinel-2 이미지의 중간 복합을 가져오는 방법을 보여줍니다.

시작하기 전에

이 안내에 따라 다음 작업을 할 수 있습니다.

  1. Earth Engine 신청
  2. Google Cloud 프로젝트 만들기
  3. 프로젝트에서 Earth Engine API 사용 설정
  4. 서비스 계정 만들기
  5. 서비스 계정에 Earth Engine 계산을 실행할 수 있는 프로젝트 수준 권한 부여

참고: 이 튜토리얼을 완료하려면 Earth Engine 액세스 권한이 등록된 서비스 계정이 필요합니다. 계속하기 전에 이 안내를 참고하여 서비스 계정을 등록하세요.

Google Cloud에 인증

가장 먼저 해야 할 일은 Google Cloud에 인증된 요청을 할 수 있도록 로그인하는 것입니다. 이때 프로젝트도 설정합니다. 출력의 안내에 따라 로그인을 완료합니다.

# INSERT YOUR PROJECT HERE
PROJECT = 'your-project'

!gcloud auth login --project {PROJECT}

서비스 계정의 비공개 키 파일 가져오기

Earth Engine을 사용하기 위해 등록된 서비스 계정이 이미 있어야 합니다. 계정이 없는 경우 이 안내에 따라 계정을 만드세요. 서비스 계정의 이메일 주소를 다음 셀에 복사합니다. (서비스 계정이 Earth Engine을 사용하도록 이미 등록되어 있어야 함) 다음 셀에서는 gsutil 명령줄을 사용하여 서비스 계정의 키 파일을 생성합니다. 키 파일이 노트북 VM에 생성됩니다.

# INSERT YOUR SERVICE ACCOUNT HERE
SERVICE_ACCOUNT='your-service-account@your-project.iam.gserviceaccount.com'
KEY = 'key.json'

!gcloud iam service-accounts keys create {KEY} --iam-account {SERVICE_ACCOUNT}

AuthorizedSession를 시작하고 사용자 인증 정보를 테스트합니다.

사용자 인증 정보를 가져오는 데 비공개 키를 사용하여 비공개 키를 테스트합니다. 사용자 인증 정보를 사용하여 HTTP 요청을 수행할 승인된 세션을 만듭니다. 세션을 통해 GET 요청을 실행하여 사용자 인증 정보가 작동하는지 확인합니다.

from google.auth.transport.requests import AuthorizedSession
from google.oauth2 import service_account

credentials = service_account.Credentials.from_service_account_file(KEY)
scoped_credentials = credentials.with_scopes(
    ['https://www.googleapis.com/auth/cloud-platform'])

session = AuthorizedSession(scoped_credentials)

url = 'https://earthengine.googleapis.com/v1beta/projects/earthengine-public/assets/LANDSAT'

response = session.get(url)

from pprint import pprint
import json
pprint(json.loads(response.content))

계산 직렬화

무언가를 계산하도록 요청하려면 먼저 계산을 Earth Engine 표현식 그래프 형식으로 변환해야 합니다. 다음은 표현식 그래프를 가져오는 방법을 보여줍니다.

Earth Engine에 인증

서비스 계정에서 Earth Engine 범위가 지정된 사용자 인증 정보를 가져옵니다. 이를 사용하여 Earth Engine을 초기화합니다.

import ee

# Get some new credentials since the other ones are cloud scope.
ee_creds = ee.ServiceAccountCredentials(SERVICE_ACCOUNT, KEY)
ee.Initialize(ee_creds)

계산 정의

클라이언트 API를 사용하여 간단한 계산을 프로토타입으로 만듭니다. 계산 결과는 Image입니다.

coords = [
  -121.58626826832939,
  38.059141484827485,
]
region = ee.Geometry.Point(coords)

collection = ee.ImageCollection('COPERNICUS/S2')
collection = collection.filterBounds(region)
collection = collection.filterDate('2020-04-01', '2020-09-01')
image = collection.median()

표현식 그래프 직렬화

이렇게 하면 Earth Engine 표현식 그래프 (특히 Expression)를 나타내는 객체가 생성됩니다. 일반적으로 클라이언트 API 중 하나를 사용하여 이러한 객체를 빌드해야 합니다.

serialized = ee.serializer.encode(image)

원하는 스케일 (Sentinel-2의 경우 10미터)로 원하는 투영 (WGS84)을 만듭니다. 이는 투영의 단위인 도 단위로 원하는 스케일을 파악하기 위한 것입니다. 이러한 스케일은 요청에서 어파인 변환을 지정하는 데 사용됩니다.

# Make a projection to discover the scale in degrees.
proj = ee.Projection('EPSG:4326').atScale(10).getInfo()

# Get scales out of the transform.
scale_x = proj['transform'][0]
scale_y = -proj['transform'][4]

요청 전송

computePixels 엔드포인트에 POST 요청을 실행합니다. 요청에는 직렬화된 계산인 Expression이 포함됩니다. PixelGrid도 포함됩니다. PixelGrid에는 원하는 출력의 dimensions와 요청된 좌표계의 단위로 된 AffineTransform가 포함됩니다. 여기서 좌표계는 지리적 좌표계이므로 변환은 도 단위의 스케일과 요청된 이미지 패치의 왼쪽 상단 모서리의 지리적 좌표로 지정됩니다.

import json

url = 'https://earthengine.googleapis.com/v1beta/projects/{}/image:computePixels'
url = url.format(PROJECT)

response = session.post(
  url=url,
  data=json.dumps({
    'expression': serialized,
    'fileFormat': 'PNG',
    'bandIds': ['B4','B3','B2'],
    'grid': {
      'dimensions': {
        'width': 640,
        'height': 640
      },
      'affineTransform': {
        'scaleX': scale_x,
        'shearX': 0,
        'translateX': coords[0],
        'shearY': 0,
        'scaleY': scale_y,
        'translateY': coords[1]
      },
      'crsCode': 'EPSG:4326',
    },
    'visualizationOptions': {'ranges': [{'min': 0, 'max': 3000}]},
  })
)

image_content = response.content

노트북에서 이를 실행하는 경우 IPython 이미지 표시 위젯을 사용하여 결과를 표시할 수 있습니다.

# Import the Image function from the IPython.display module.
from IPython.display import Image
Image(image_content)