REMOTE SENSING

geemap: 10m급 토지피복지도 Dynamic World 사용법 소개

유병혁 2023. 7. 28. 22:24

안녕하세요? 이번 글은 geemap에서 준실시간으로 전세계 10m급 토지피복지도를 제공하는 Dynamic World 사용법을 간략히 정리해 보겠습니다. 해당 내용은 geemap: 114 dynamic world 튜토리얼에 일부 코드를 추가 작성하여 보완한 것입니다.

 

114 dynamic world - geemap

114 dynamic world In [ ]: import ee import geemap In [ ]: Map = geemap.Map() Map.add_basemap('HYBRID') Map Map = geemap.Map() Map.add_basemap('HYBRID') Map In [ ]: # Set the region of interest by simply drawing a polygon on the map region = Map.user_

geemap.org

geemapDynamic World에 관한 소개는 앞서 정리한 다음 링크를 참고하시면 좋겠습니다.

 

geemap: Google Earth Engine 대화형 매핑용 Python 패키지 소개

안녕하세요? 이번 글은 Google Earth Engine과 ipyleaflet을 사용한 대화형 매핑용 Python 패키지, geemap(지맵)에 관해 간략히 소개해 보겠습니다. geemap의 개발자는 녹스빌 테네시 대학교 지리 및 지속가능

foss4g.tistory.com

 

Dynamic World: 딥러닝 활용, 준 실시간 전세계 10m급 토지피복 분류

안녕하세요? 이번 글은 준실시간(near real-time)으로 전세계 10m급 토지이용/피복 지도화를 제공하는 Dynamic World에 관해 간략히 소개해 보겠습니다. Dynamic World(다이내믹 월드) 논문 바로가기: https://ww

foss4g.tistory.com

 

geemap 지도 객체 생성

자, 그러면 시작해볼까요?! 먼저 Earth Engine과 geemap 라이브러리를 파이썬 스크립트에서 사용하기 위해 가져옵니다.

import ee
import geemap

Earth Engine 객체를 초기화합니다. 이 함수를 호출하면 Google Earth Engine Python API와 Google Earth Engine 서버 사이의 연결이 설정되며, 이후 Earth Engine을 사용할 수 있게 됩니다.

# Earth Engine 객체 초기화
ee.Initialize()

get_boundary() 함수를 정의합니다. 이 함수는 Earth Engine 데이터베이스의 WDPA(World Database on Protected Areas) 데이터셋에서 이름이 "Byeonsanbando(변산반도국립공원)"인 지역만 필터링해서 해당 지오메트리를 추출합니다. 해당 함수로 변산반도국립공원 경계를 추출하여 'region' 변수에 할당합니다.

# 변산반도국립공원 영역을 추출하는 함수 정의
def get_boundary():
    roi = ee.FeatureCollection("WCMC/WDPA/current/polygons") \
        .filter(ee.Filter.eq("NAME", "Byeonsanbando")) \
        .geometry()
    return roi

# 변산반도국립공원 경계 추출
region = get_boundary()

geemap.Map()을 사용하여 지도 객체를 생성합니다. 지도의 중심을 'region' 변수에 저장된 변산반도국립공원 경계 중심으로 이동시키고 지도를 12레벨로 확대합니다. Map.addLayer()를 사용하여 변산반도국립공원 경계를 지도에 추가하고, 경계는 'region' 변수에 저장된 지오메트리 객체로, 레이어 이름은 "Byeonsanbando National Park"로 표현합니다. Map은 최종적으로 생성된 지도 객체를 출력합니다.

# 지도 생성
Map = geemap.Map()

# 지도에 경계 표시
Map.centerObject(region, 12) # 경계 중심으로 지도 확대
Map.addLayer(region, {}, "Byeonsanbando National Park")

# 지도 출력
Map

 

Dynamic World 생성

먼저 시작 날짜(start_date)와 종료 날짜(end_date)를 설정합니다. 이 코드는 Earth Engine을 사용하여 데이터를 조회하고 분석할 때 사용할 시간 범위를 정의하는 데 사용됩니다.

# 날짜 범위 설정
start_date = '2022-01-01'
end_date = '2023-01-01'

지정된 변산반도국립공원(region) 영역과 시작 날짜(start_date)부터 종료 날짜(end_date)까지의 Sentinel-2 이미지들을 합성하여 하나의 영상을 만들어봅니다. vis_params 변수에는 합성영상을 시각화할 때 사용할 밴드(B4는 Red, B3는 Green, B2는 Blue에 해당)와 최소/최대 픽셀 값을 설정합니다.  geemap을 사용하여 지도에 추가하고 시각화합니다.

# Sentinel-2 영상 합성(image composite)
image = geemap.dynamic_world_s2(region, start_date, end_date)
vis_params = {'bands': ['B4', 'B3', 'B2'], 'min': 0, 'max': 3000}
Map.addLayer(image, vis_params, 'Sentinel-2 image')

# 지도 출력
Map

지정된 변산반도국립공원(region) 영역과 시작 날짜(start_date)부터 종료 날짜(end_date)까지의 Dynamic World 토지피복 데이터들을 합성하여 하나의 영상을 만듭니다. 이를 통해 해당 지역의 토지피복을 살펴볼 수 있습니다. Dynamic World는 각 픽셀에서 가장 높은 확률(highest probability) 값을 보이는 클래스 확률에서 계산된 음영기복(hillshade)을 사용합니다. 따라서 클래스의 신뢰도가 높을수록 고도가 높게 표현되고 신뢰도가 낮을 수록 고도가 낮음을 나타냅니다.

# Dynamic World 토지피복 합성(land cover composite)
landcover = geemap.dynamic_world(region, start_date, end_date, return_type='hillshade')
Map.addLayer(landcover, {}, 'Land Cover')
Map

Dynamic World 지도에 범례를 추가해 봅니다. 여기서는 범례 제목과 미리 정의된 내장 범례 스타일을 지정할 수 있습니다.

# 지도에 범례 추가
Map.add_legend(title="Dynamic World Land Cover", builtin_legend='Dynamic_World')
Map

return_type을 'probability'로 변경하면 Dynamic World 토지피복 클래스에 대한 확률 값이 픽셀 기준 이미지로 반환됩니다.

# Dynamic World 토지피복 확률(probability)
landcover = geemap.dynamic_world(region, start_date, end_date, return_type='probability')
Map.addLayer(landcover, {}, 'Land Cover probability')
Map.remove_legend() # 범례 삭제
Map

return_type을 'visualize'로 변경하면 음영기복을 제외한 토지피복지도를 가시화할 수 있습니다.

# Dynamic World 토지피복 가시화(visualize)
landcover = geemap.dynamic_world(region, start_date, end_date, return_type='visualize')
Map.addLayer(landcover, {}, 'Land Cover visualize')
Map

이번에는 클래스 데이터를 GeoTIFF 형식으로 저장해 보겠습니다. 저장할 GeoTIFF 파일의 경로와 이름을 output_path 변수로 지정하고, return_type을 'class'로 설정하여 클래스 데이터를 레이블 형태로 가져옵니다.

 

geemap.ee_export_image() 함수를 사용하여 landcover 변수에 저장된 클래스 데이터를 GeoTIFF 형식으로 저장합니다. 함수 인자로 저장할 데이터(landcover), 저장할 파일 경로(output_path), 해상도(scale), 영역(region), 밴드 당 파일 생성여부(file_per_band) 등을 지정합니다. 여기서는 해상도를 10m급으로 설정하고, file_per_band를 False로 설정하여 모든 밴드를 하나의 파일로 저장합니다.

# 클래스 데이터를 GeoTIFF 형식으로 저장
output_path = 'D:/GEODATA/landcover.tif'
landcover = geemap.dynamic_world(region, start_date, end_date, return_type='class')
geemap.ee_export_image(landcover, filename=output_path, scale=10, region=region, file_per_band=False)

이제 GeoTIFF로 저장된 클래스 데이터는 QGIS에서 활용 가능합니다. 여기까지 geemap에서 Dynamic World 사용법을 간략히 정리해 봤습니다.

1905_geemap_Dynamic World 10m급 토지피복지도 사용법 소개.ipynb
0.01MB