Post

Google Earth Engine 시작하기

본 문서는 Google Earth Engine에 대한 설명을 담고 있다.

Google Earth Engine

Google Earth Engine은 지구의 위성 이미지를 시각화하고 분석할 수 있는 클라우드 기반 지리공간 분석 플랫폼이다. Earth Engine 공식문서가 잘 정리되어 있다.

1. 작동 방식

코드 편집기를 사용해 명령을 작성하면, 클라우드(서버 측)에서 병렬 처리를 위해 Google에 명령을 보낸다. 사용자는 이 코드 편집기를 통해 지도, 차트, 통계 등을 포함한 다양한 동작으로 요청하고 브라우저(클라이언트 측)에서 그 결과를 확인할 수 있다.

  • 엄청난 양의 위성이미지 데이터 다운로드 없이 지리공간 분석
  • 코드 저장, 공유, 버전 관리 용이
  • JavaScript, Python API 제공
    • Google Earth Engine 웹의 Code Editor에서 JavaScript를 기본으로 제공
    • Google Colab 또는 로컬에서 earthengine-api 설치 후 사용 가능
  • 필요한 데이터 업로드 가능
    • 개인의 tif, csv 등의 파일 업로드 가능

그림1

2. 제공 데이터셋

Earth Engine Datasets에서 제공하는 데이터셋을 확인할 수 있다.

그림1

원하는 데이터셋을 선택하고, ee.ImageCollection을 복사하여 코드에서 사용할 수 있다. Description, Bands에서 데이터에 대한 설명과 Bands, Units, Color 등을 확인할 수 있다.

3. Code Editor

그림1

4. 직접 해보기 - NDVI

저장하지 않으면 실수로 코드가 날라갈 수 있기 때문에 작업 중간중간 저장(Save 버튼/Crtl + S)해주는 것이 좋다.

4-1. 원하는 지점 지정하기

빨간색 박스 안에 있는 도구를 사용하여 점, 선, 사각형, 다각형으로 지점을 생성할 수 있다. 알아서 위경도를 담은 객체를 만들어 준다. 각 객체의 색깔, 변수명도 자유롭게 변경할 수 있다. 원하는 지점을 검색할 수도 있고, 손을 지도를 움직이면서 찾아갈 수도 있다.

그림1

4-2. 위성영상데이터 Import

상단의 검색창에 Sentinel-2 MSI: MultiSpectral Instrument, Level-1C을 검색하여 Import한다.

  • level은 처리 수준을 의미
    • level1: 지구표면에서 반사값을 보는 것
    • level2: 지형까지 고려해 지구표면에서 반사되는 값을 보정(방사보정), 대기권의 영향을 제거하고 지표면의 값을 보기 때문에 좀 더 정밀

그림1

코드 편집기의 상단을 확인하면 이렇게 지점과 위성영상이 Import되어 있는 상태이다.

4-3. Sentinel-2 영상 Map에 추가

1
2
3
4
// centers the map view on seoul
Map.centerObject(seoul, 12);
// adds a given EE object to the map as a layer
Map.addLayer(st2, {}, 'Sentinel-2 Base');

지도의 중심을 seoul(point)로 잡고, 지도에 st2(Sentinel)을 추가하였다. 수천장의 Sentinel-2(ImageCollection) 위성영상을 전세계에 그리고 있기 때문에 시간이 오래 걸리고 화면이 보이지 않는다.

filter를 적용해서 해당 지점의 가장 최근의 이미지만 그려본다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// centers the map view on campus
Map.centerObject(seoul, 12);
// adds a given EE object to the map as a layer
// Map.addLayer(st2, {}, 'Sentinel-2 Base');
// Map.addLayer(st2, {}, 'Sentinel-2 Base')

var image = ee.Image(st2
// filter to get only Images in the date range we are interested
    .filterDate('2023-01-01', '2023-12-31')
// include a geographic filter to narrow the search to images at the location of our point
    .filterBounds(seoul)
// sort the collection by a metadata property, in our case cloud cover is very useful one
    .sort('CLOUD_COVERAGE_ASSESSMENT')
// select the first image out of this collection    
    .first());
    
// print the image to the console
print("Sentinel-2 image", image)

var trueColor = {bands: ['B4', 'B3', 'B2'], min: 0, max: 3000};
Map.addLayer(image, trueColor, 'True Colour Image');

image를 만드는 과정이다.

  • 2023년의 Sentinel-2 영상만 가져옴
  • seoul의 영상만 가져옴
  • 구름이 없는 순으로 정렬함
  • 정렬했을 때 가장 첫번째 이미지를 가져옴

4번, 3번, 2번 밴드를 각각 RGB로 설정하고, 밝기값은 레벨 0~3000까지 집중적으로 분류하였다. 밴드값은 데이터셋의 설명에서 더 자세하게 알 수 있다.

Sentinel-2 이미지를 RGB로 지도에 추가한 결과이다.

그림1

근적외선으로 지도에 추가한 결과이다.

1
2
var falseColor = {bands: ['B8','B4', 'B3'], min: 0, max: 3000};
Map.addLayer(image, falseColor, 'False Color Image');

그림1

이렇게 지도에 trueColorfalseColor, 두 개의 layer가 추가되었다. 지도에서 확인할 때 체크박스를 사용하여 각각을 확인하면 이미지를 다시 불러오게 되기 때문에 시간이 많이 걸린다. 빨간색 박스 안의 드래그바를 사용하면 각 레이어의 투명도를 조절하기 때문에 초기에만 시간이 소요된다.

그림1

4-4. NDVI: 밴드 조합을 통해 Index 도출

1
2
3
4
5
6
7
8
// define variable NDVI from equation
var NDVI = image.expression(
  "(NIR - RED) / (NIR + RED)",{
    RED: image.select("B4"),
    NIR: image.select("B8")
// rename band name
}).rename('ndvi');
Map.addLayer(NDVI, {min: 0, max: 1}, 'NDVI Image');

image.expression를 사용해 NDVI 산술 표현식을 지정하고 NDVI 값을 얻어낸다. .rename('ndvi')으로 밴드 이름을 ndvi로 지정해준다.

NDVI가 까맣게 지도에 추가되었다.

그림1

NDVI 값은 0에서 1사이의 값을 나타내고 1에 가까울수록 광합성이 활발한 식생이다. 색상 팔렛트를 추가해서 식생이 활발한 정도를 확인해본다.

그림1

나는 파이썬이 더 익숙하다…

Google Earth Engine 시작하기 with Python

This post is licensed under CC BY 4.0 by the author.