Matplotlibを使った地形ヒルシェード表示

PythonPythonBeginner
今すぐ練習

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

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Matplotlibを使って、さまざまな合成モードと垂直拡大率を使って地形のヒルシェーディングプロットを作成する方法を示します。ヒルシェーディングの目的は、視覚的な目的で2次元の地図に3次元のような効果を与えることです。この実験では、異なる視覚的な効果を得るために合成モードと垂直拡大率をどのように変更するか学びます。

VMのヒント

VMの起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、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']

セルサイズを指定する

地形的に正確な垂直拡大率が必要な場合、またはvert_exagが何であるべきかを当てる必要がない場合、グリッドのセルサイズ(つまり、dxdyパラメータ)を指定する必要があります。そうでない場合、指定する任意のvert_exag値は、入力データのグリッド間隔に対して相対的になります。このステップでは、dxdyの値をメートルで計算します。

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

光源とカラーマップを指定する

光源の方位角と高度を設定することで、LightSourceオブジェクトを指定します。また、プロットで使用するカラーマップも設定します。

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

プロットを作成する

異なるブレンドモードと垂直拡大率を持つヒルシェードプロットを表示するために、4x3のプロットグリッドを作成します。最初に、1行目にヒルシェード強度画像を表示し、その後、残りの行に異なるブレンドモードを持つヒルシェードプロットを配置します。異なる垂直拡大率の値とブレンドモードを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_title関数とset_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を使って地形ヒルシェードプロットを作成する方法を学びました。異なるブレンドモードと垂直拡大率を使って、さまざまな視覚的な効果を実現しました。また、地形的に正確な垂直拡大率のためにグリッドのセルサイズを指定する方法も学びました。