PyGMTで日本付近の立体段彩図を描きたい

三多気の桜 未分類

はじめに

高等学校の地学の教科書や図説には、日本付近の地形が分かりやすい立体段彩図が載っている。そんな立体段彩図をPyGMTで描いてみたいと思っていたが、なかなかうまくできなかった。最近になって、やっとある程度満足できるものが描けるようになったので、ここでその手順を紹介する。

立体段彩図を描くことが目的なので、PyGMTのコマンドおよびオプションの説明は、プログラムの中にコメントで記述する程度にとどめている。

海岸線を描く

まずは簡単な日本付近の海岸線を描いてみる。メルカトール図法を用いて、北緯28°~50°、東経128°~150°の範囲を描く。

PyCharmを起動し、メニューの①ファイルから➁新規を選択する。

PyCharmの画面01

新規ウィンドウが開いたら、Pythonファイルを選ぶ。

PyCharmの画面02

新規Pythonファイルのウィンドウで、ファイル名を入力する。ここではpygmt01とする。拡張子.pyは自動的に付けられるので、入力する必要はない。

PyCharmの画面03

次のコードをコピペ。

import pygmt
# 地図を描く範囲の設定
reg = [128, 150, 28, 50]
fig = pygmt.Figure()
# 基図を描く
fig.basemap(
    region=reg,
    # メルカトール図法により横幅を15cmで描く
    projection = "M15c",
    # 5度ごとに緯度経度線、10度ごとに数値、白黒パターンの枠を描く
    frame = ["g5a10f"]
)
# 海岸線を描く
fig.coast(
    # 海岸線のみを0.5ポイントの黒実線で描く
    shorelines="1/0.5p,black"
)
# png形式でファイルを出力
fig.savefig("japan01.png")

①がpygmt01になっていなければ、押して➁現在のファイルに変更する。

③実行をクリック。

プログラムが終了したら、実行ウィンドウが開いてメッセージが表示される。このとき、”④プロセスは終了コード0で終了しました”、になっていれば成功である。

PyCharmの画面04

次のような地図が、PyGMTフォルダの中にjapan01.pngというファイル名で作成される。

日本付近の海岸線図

次に、海と陸を指定した色で塗分ける。

新規にpythonファイルを作成する。ここではpygmt02とする。

次のコードをコピペして実行する。

import pygmt
# 地図を描く範囲の設定
reg = [128, 150, 28, 50]
fig = pygmt.Figure()
# 基図を設定
fig.basemap(
    region=reg,
    # メルカトール図法により横幅を15cmで描く
    projection="M15c",
)
# 陸と海を塗分け海岸線を描く
fig.coast(
    # 陸をlightgrayで塗る
    land="lightgray",
    # 水域をlightcyanで塗る
    water="lightcyan",
    # 海岸線のみを0.1ポイントの黒実線で描く
    shorelines="1/0.5p,black"
)
fig.basemap(
    # 5度ごとに緯度経度線、10度ごとに数値、白黒パターンの枠を描く
    frame=["g5a10f"]
)
fig.savefig("japan02.png")

次のような地図が、PyGMTフォルダの中にjapan02.pngというファイル名で作成される。

日本付近の彩色地図

平面段彩図を描く

日本付近の平面段彩図を描く。

必要になる標高のデータは、ネットを通して自動的に得られる。データ間隔を狭くすると、読み込むのに時間がかかるので、適当な値にする。

次のコードをコピペして実行する。

import pygmt
reg = [128, 150, 28, 50]
fig = pygmt.Figure()
# 標高データを取得
grid_data = pygmt.datasets.load_earth_relief(
    region=reg,
    # 1分間隔でデータを取得
    resolution="01m"
)
fig.grdimage(
    # メルカトール図法により横幅を15cmで描く
    projection = "M15c",
    grid = grid_data,
    # 影なしの地図
    shading = False,
    # 10度ごとに数値、白黒パターンの枠を描く
    frame=["a10f"],
    # カラーマップとしgeoを使用
    cmap = "geo"
)
fig.coast(
    # 海岸線のみを0.1ポイントの黒実線で描く
    shorelines = "1/0.5p,black"
)
fig.savefig("japan03.png")

次のような地図がjapan03.pngというファイル名で作成される。

日本付近の平面段彩図01

地形の凹凸があまり明瞭ではない。もう少し地形の凹凸が表現されるように陰影をつける。

次のコードをコピペして実行する。

import pygmt
reg = [128, 150, 28, 50]
fig = pygmt.Figure()
# 標高データを取得
grid_data = pygmt.datasets.load_earth_relief(
    region=reg,
    # 1分間隔でデータを取得
    resolution="01m"
)
fig.grdimage(
    # メルカトール図法により横幅を15cmで描く
    projection = "M15c",
    grid = grid_data,
    # 影ありの地図
    shading = True,
    # 10度ごとに数値、白黒パターンの枠を描く
    frame=["a10f"],
    # カラーマップとしgeoを使用
    cmap = "geo"
)
fig.coast(
    # 海岸線のみを0.1ポイントの黒実線で描く
    shorelines = "1/0.5p,black"
)
fig.savefig("japan03-1.png")

次のような地図がjapan03-1.pngというファイル名で作成される。だいぶ見栄えがよくなった。

日本付近の平面段彩図02

より凝った段彩図の描き方がTakuto Maedaさんのページに載っていたので、参考にさせて頂いた。

PyGMT-HOWTO — pygmt-howto

次のコードをコピペして実行する。

import pygmt
reg = [128, 150, 28, 50]
fig = pygmt.Figure()
# 標高データを取得
grid_data = pygmt.datasets.load_earth_relief(
    region=reg,
    # 1分間隔でデータを取得
    resolution="01m"
)
# 斜度データの作成
gradient_data = pygmt.grdgradient(
    grid = grid_data,
    # 方位
    azimuth = [45,145],
    normalize = "e0.7"
)
fig.grdimage(
    # メルカトール図法により横幅を15cmで描く
    projection = "M15c",
    grid = grid_data,
    # 影ありの地図
    shading = gradient_data,
    # 10度ごとに数値、白黒パターンの枠を描く
    frame=["a10f"],
    # カラーマップとしgeoを使用
    cmap = "geo"
)
# 海岸線描画と海域を半透明シェーディング
fig.coast(
    area_thresh = '100',
    water = 'black@80',
)
# 海岸線の再描画
fig.coast(
    # 海岸線のみを0.1ポイントの黒実線で描き直す
    shorelines = "1/0.5p,black"
)
fig.savefig("japan03-2.png")

次のような地図がjapan03-2.pngというファイル名で作成される。

日本付近の平面段彩図03

2つの地図を比較すると、japan03-2.pngのほうが細かい地形まで表現されている。

違いがよく分かるのは、富山湾から日本海の海底に延びる海底谷だ。japan03-2.pngには、海底谷がよりはっきりと表現されている。

立体段彩図を描く

いよいよ日本付近の立体段彩図を描く。

次のコードをコピペして実行する。

import pygmt
reg = [128, 150, 28, 50]
reg_3d = [128, 150, 28, 50, -10000, 5000]
fig = pygmt.Figure()
# 標高データを取得
grid_data = pygmt.datasets.load_earth_relief(
    region=reg,
    # 1分間隔でデータを取得
    resolution = "01m"
)
fig.grdview (
    region=reg_3d,
    # メルカトール図法により横幅を15cmで描く
    projection="M15c",
    grid = grid_data,
    # 見る方位と仰角
    perspective = [150, 30],
    # 高さは2cm
    zsize="2c",
    # 地形の表面を塗色
    surftype="s",
    # 10度ごとに数値、白黒パターンの枠を描く
    frame=["a10f"],
    # カラーマップとしgeoを使用
    cmap = "geo",
    # -10000m~0mの範囲の壁面をgrayで描く
    plane = "-10000+ggray"
)
# 海岸線の再描画
fig.coast(
    perspective = [150, 30, 0],
    shorelines = "1/0.5p,black"
)
fig.savefig("japan04.png")

次のような地図がjapan04.pngというファイル名で作成される。

日本付近の立体段彩図01

地形の凹凸が強調されるように陰影をつける。

次のコードをコピペして実行する。

import pygmt
reg = [128, 150, 28, 50]
reg_3d = [128, 150, 28, 50, -10000, 5000]
fig = pygmt.Figure()
# 標高データを取得
grid_data = pygmt.datasets.load_earth_relief(
    region=reg,
    # 1分間隔でデータを取得
    resolution = "01m"
)
fig.grdview (
    region=reg_3d,
    # メルカトール図法により横幅を15cmで描く
    projection="M15c",
    grid = grid_data,
    # 見る方位と仰角
    perspective = [150, 30],
    # 影あり
    shading=True,
    # 高さは2cm
    zsize="2c",
    # 地形の表面を塗色
    surftype="s",
    # 10度ごとに数値、白黒パターンの枠を描く
    frame=["a10f"],
    # カラーマップとしgeoを使用
    cmap = "geo",
    # -10000m~0mの範囲の壁面をgrayで描く
    plane = "-10000+ggray"
)
# 海岸線の再描画
fig.coast(
    perspective = [150, 30, 0],
    shorelines = "1/0.5p,black"
)
fig.savefig("japan04-1.png")

次のような地図がjapan04-1.pngというファイル名で作成される。

日本付近の立体段彩図02