Matplotlib 를 이용한 지형 음영 처리

Beginner

This tutorial is from open-source community. Access the source code

소개

이 랩에서는 Matplotlib 을 사용하여 다양한 블렌드 모드 (blend mode) 와 수직 과장을 사용하여 지형 음영 처리 플롯을 만드는 방법을 보여줍니다. 음영 처리의 목적은 2D 지도에서 3D 와 유사한 효과를 시각적으로 생성하는 것입니다. 이 랩에서는 다양한 시각적 효과를 얻기 위해 블렌드 모드와 수직 과장을 변경하는 방법을 배웁니다.

VM 팁

VM 시작이 완료되면 왼쪽 상단을 클릭하여 Notebook 탭으로 전환하여 실습을 위해 Jupyter Notebook에 액세스하십시오.

때로는 Jupyter Notebook 이 로딩을 완료하는 데 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업의 유효성 검사는 자동화할 수 없습니다.

학습 중에 문제가 발생하면 언제든지 Labby 에게 문의하십시오. 세션 후 피드백을 제공해주시면 문제를 즉시 해결해 드리겠습니다.

필요한 라이브러리 가져오기

Matplotlib, NumPy 및 LightSource 를 포함하여 필요한 라이브러리를 가져오는 것으로 시작합니다.

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.cbook import get_sample_data
from matplotlib.colors import LightSource

데이터 로드

다음으로, Matplotlib 의 get_sample_data 함수를 사용하여 샘플 고도 데이터를 로드합니다. 그런 다음 고도 데이터와 그리드의 셀 크기를 추출합니다.

dem = get_sample_data('jacksboro_fault_dem.npz')
z = dem['elevation']
dx, dy = dem['dx'], dem['dy']

셀 크기 지정

지형학적으로 정확한 수직 과장 (vertical exaggeration) 이 필요하거나, vert_exag 값을 추측하고 싶지 않다면, 그리드의 셀 크기 (즉, dxdy 매개변수) 를 지정해야 합니다. 그렇지 않으면, 지정하는 모든 vert_exag 값은 입력 데이터의 그리드 간격에 상대적입니다. 이 단계에서는 미터 단위의 dxdy 값을 계산합니다.

dy = 111200 * dy
dx = 111200 * dx * np.cos(np.radians(dem['ymin']))

광원 및 컬러맵 지정

광원의 방위각 (azimuth) 과 고도 (altitude) 를 설정하여 LightSource 객체를 지정합니다. 또한 플롯에 사용할 컬러맵 (colormap) 을 설정합니다.

ls = LightSource(azdeg=315, altdeg=45)
cmap = plt.cm.gist_earth

플롯 생성

다양한 블렌드 모드 (blend mode) 와 수직 과장 (vertical exaggeration) 을 사용하여 음영 처리된 플롯을 표시하기 위해 4x3 플롯 그리드를 생성합니다. 먼저 첫 번째 행에 음영 처리된 강도 이미지를 표시한 다음, 나머지 행에 다양한 블렌드 모드를 가진 음영 처리된 플롯을 배치합니다. for 루프를 사용하여 서로 다른 수직 과장 값과 블렌드 모드를 반복합니다.

fig, axs = plt.subplots(nrows=4, ncols=3, figsize=(8, 9))
plt.setp(axs.flat, xticks=[], yticks=[])

for col, ve in zip(axs.T, [0.1, 1, 10]):
    col[0].imshow(ls.hillshade(z, vert_exag=ve, dx=dx, dy=dy), cmap='gray')
    for ax, mode in zip(col[1:], ['hsv', 'overlay', 'soft']):
        rgb = ls.shade(z, cmap=cmap, blend_mode=mode,
                       vert_exag=ve, dx=dx, dy=dy)
        ax.imshow(rgb)

플롯 레이블 지정

set_titleset_ylabel 함수를 사용하여 플롯 그리드의 행과 열에 레이블을 지정합니다. 또한 수직 과장 및 블렌드 모드 그룹에 대한 제목을 추가합니다.

for ax, ve in zip(axs[0], [0.1, 1, 10]):
    ax.set_title(f'{ve}', size=18)
for ax, mode in zip(axs[:, 0], ['Hillshade', 'hsv', 'overlay', 'soft']):
    ax.set_ylabel(mode, size=18)

axs[0, 1].annotate('Vertical Exaggeration', (0.5, 1), xytext=(0, 30),
                   textcoords='offset points', xycoords='axes fraction',
                   ha='center', va='bottom', size=20)
axs[2, 0].annotate('Blend Mode', (0, 0.5), xytext=(-30, 0),
                   textcoords='offset points', xycoords='axes fraction',
                   ha='right', va='center', size=20, rotation=90)
fig.subplots_adjust(bottom=0.05, right=0.95)

플롯 표시

마지막으로, show 함수를 사용하여 플롯을 표시합니다.

plt.show()

요약

이 랩에서는 Matplotlib 을 사용하여 지형 음영 처리 플롯을 만드는 방법을 배웠습니다. 다양한 블렌드 모드 (blend mode) 와 수직 과장 (vertical exaggeration) 을 사용하여 다양한 시각적 효과를 얻었습니다. 또한 지형적으로 정확한 수직 과장을 위해 그리드의 셀 크기를 지정하는 방법도 배웠습니다.