0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GMTをWindowsで使う - #5 地図を2つ並べる

Posted at

はじめに

地図をいくつか並べて描きたいということもあるかと思います。もちろん、別々に画像ファイルを作ってもいいのですが、今回は1つの画像ファイルの中に地図を2つ並べるスクリプトを紹介したいと思います。

入力データの作成

2019年と2020年のそれぞれの年の全台風の経路図を横に並べて描いてみたいと思います。そのために必要なデータは#3で使った気象庁の台風位置表のデータから作成します。#3では台風1つだけの経路図を描きましたが、今回は1つのファイルの中に複数の台風のデータを書いておいて、それらの経路図を一度で描けるようにしたいと思います。

plotに入力する複数の線のデータを1つのファイルの中に書き込みたいときは、各線のデータの先頭に「>」を書けばOKです。次に示す「track2019.dat」は2019年の各台風の緯度・経度を書き込んだファイルです。最初の「>」に続くデータがその年の台風1号のデータで、次の「>」に続くデータが台風2号のデータになります。

track2019.dat
>
111.9 7.6
111.3 7.3
111.1 7.0
  ︙
>
162.5 4.7
161.2 4.8
159.8 5.2
  ︙

スクリプトの解説

スクリプト

rem --- GMT parameters ---
gmt set MAP_FRAME_TYPE inside
gmt set FONT_ANNOT_PRIMARY 6p,Helvetica,black
rem --- files ---
set track2019=track2019.dat
set track2020=track2020.dat
rem --- settings ---
set area=100/170/1/49
set size=M10
set frame=wESn
set xbase=xa10f2
set ybase=ya10f2
set gcol=lightgreen
set scol=skyblue
set border=1/0.1,darkred
rem --- draw maps ---
gmt begin output png
  gmt basemap -R%area% -J%size% -Bwesn
  gmt coast -G%gcol% -S%scol% -N%border%
  gmt plot %track2019% -Sc0.05 -Gblack
  gmt plot %track2019% -W0.25
  echo 2019 | gmt text -F+cLT+jLT+f12p,Helvetica-Bold -D0.3/-0.3
  gmt basemap -B%frame% -B%xbase% -B%ybase%
  gmt basemap -R%area% -J%size% -Bwesn -X10.5
  gmt coast -G%gcol% -S%scol% -N%border%
  gmt plot %track2020% -Sc0.05 -Gblack
  gmt plot %track2020% -W0.25
  gmt basemap -B%frame% -B%xbase% -B%ybase%
  echo 2020 | gmt text -F+cLT+jLT+f12p,Helvetica-Bold -D0.3/-0.3
gmt end show
pause

出力結果

今回のスクリプトではファイル名だけでなく、各モジュールのオプションの設定もsetで変数として指定しています。例えば、描画する範囲は「area」とし、図法とサイズは「size」としています。同じ設定がスクリプトの中で何度も出てくる場合は、このように書いておくことで設定を変更する際に書き換えるのが楽になりますし、設定がまとめて書いてあることでスクリプトが見やすくなるという効果もあると思います。

basemap

今回初めて出てきたモジュールとしてbasemapがあります。これは図の枠を描くモジュールです。これまでのスクリプトでは、枠に関してはcoastgrdimageの中で-Bのオプションを使って指定していました。今回もcoastの中で-Bのオプションを使ってもいいのですが、スクリプトが長くなってくると、basemapを使う方が各モジュールの役割が明確になっていいのではないかと思います。今回のように、まずbasemapで図の描画する範囲、サイズ、枠の設定(+後述する原点の位置)といった大枠を指定し、そこにcoastplotで情報を足していくというイメージです。

ただ、このように最初にbasemapを使って枠を描き、そこにいろいろ足していくとすると、後で足したものが枠にすこし重なって描かれてしまいます。そこで、情報を足し終わったら最後にもう一度basemapを使って枠を描くようにしています。この際、最初のbasemapでの-Bのオプションは「wesn」のみとし単に枠の四角い線を描くだけとしています。

ちなみに、#4で-Bのオプションを最初に出てくるgrdimageではなく次に出てくるcoastにつけたのも、これに関連しています。grdimage-Bのオプションをつけるとその後のcoastで描画される陸域が枠にすこし重なってしまいます。

図の位置の指定

GMTでは、-X-Yのオプションを使うことで、図の原点の位置を移動させることができます。今回は幅10cmの図を横に2つ並べたかったので、-Xで2つ目の図の原点を1つ目の図の原点からx方向に10.5cm移動させています。同じ要領で、縦に図を並べたい場合は-Yを使って原点をy方向に移動させればOKです。数字が正であれば正方向に、負であれば負方向に移動します。

ちなみに、-Bのオプションと同じく、-X-Yのオプションもbasemapの中だけでなく、coastgrdimageの中で使うことができます。

枠の目盛りの線と数字を内側に表示する

#4で図の枠の種類を示すパラメータである「MAP_FRAME_TYPE」をデフォルトの「fancy」から「plain」に変更してみましたが、今回は「inside」というのに変更しています。こうすると、枠の目盛りの線と数字が図の外側でなく内側に表示されるようになります。

さらに今回は、枠の目盛りの数字のフォントを指定するパラメータである「FONT_ANNOT_PRIMARY」もデフォルトより小さいフォントに変更しています。

文字を図の隅に表示する

それぞれの図では、2019や2020といった年が図の左上に表示されています。このように、文字を図の隅に表示したい場合には、textのモジュールの-Fのオプションの中で「+c」を使うとよいです。今回は「+cLT」としており、これは図の左上に文字を表示することを指定しています。今回はさらに、-Fのオプションの中で「+jLT」とし、オフセットを指定する-Dのオプションを使っているので、図の左上(+cで指定)から文字の左上(+jで指定)までx方向に0.3cm
、y方向に-0.3cmオフセットをとって表示してください、という意味になっています。

ちなみに、文字の位置を指定する座標を図の枠の外側にすると文字は表示されませんが、text-Nのオプションを記載すると外側でも表示されるようになります。今回は文字を図の左上の内側に表示しましたが、例えば、これを図の左上の外側に表示したいという場合は、このオプションを記載すればOKです。

おわりに

「GMTをWindowsで使う」と題して投稿した5つの記事で、GMTを使って地図を描く際の最も基本的なモジュールを説明できたかなと思います。具体的には次のモジュールを扱ってきました。

  • coast
  • grdimage
  • makecpt
  • colorbar
  • plot
  • text
  • basemap

また、スクリプトを書く際にはバッチファイルで使えるsetとechoもあわせて使うと便利かと思いますので、これらを使ったスクリプトを紹介しました。

使い出のあるGMTのモジュールは他にもたくさんあるので(例えば、grdcontour、grdvector、surfaceなど)、どこかで整理できたらと思っています。

参考文献

#1~#4はこちら

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?