1
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で使う - #4 地図に情報を追記する

Last updated at Posted at 2024-08-15

はじめに

地図を描いてその上に文字を書き込んだり、注目したい箇所を線で囲んで示したりしたい場合があるかと思います。今回はこのように地図に情報を追記するスクリプトを紹介したいと思います。

スクリプトの解説

スクリプト

gmt set MAP_FRAME_TYPE plain
set gebco=gebco_2024_n38.0_s33.0_w138.0_e142.0.nc
set cpt=color.cpt
set box=box.dat
gmt makecpt -Cbathy > %cpt%
echo 139:30 35:45 > %box%
echo 140:15 35:45 >> %box%
echo 140:15 34:50 >> %box%
echo 139:30 34:50 >> %box%
gmt begin output png
  gmt grdimage %gebco% -R138:35/141:15/33:55/36:15 -JM12 -C%cpt%
  gmt coast -BWeSn -Bxa1f10m -Bya1f10m -Glightgray -LjRT+w30+o0.5
  gmt plot %box% -W1,red,- -L -A
  echo 139:30 35:45 Tokyo Bay | gmt text -F+jLB+f12p,Helvetica-Bold,red -D0/0.2
  gmt colorbar -C%cpt% -DjLT+o0.8/0.5+w4.5/0.2+e0.15+h -B2000+l"Depth (m)"
gmt end show
pause

出力結果

今回は地図中の東京湾の部分を赤い破線で囲み、その近くに「Tokyo Bay」という文字を同じく赤で書き込んでいます。スクリプトも段々長くなってきましたが、多くは前回までに説明したものです。今回新しく出てきたものについては、以下で説明していきます。

GMTでの各種パラメータのデフォルト値について

GMTでは線やフォントなどのデフォルト値があります。例えば、図の枠はデフォルトでは白地と黒地の縞で描画されますし、目盛りの数字のフォントの種類や大きさも決まっています。ただ、これらを自分の好みの設定に変えたいときもあると思います。そのようなときには、setgmtset)というモジュールを使ってデフォルト値を変更します。

今回はスクリプトの冒頭でsetを使って、図の枠の種類を示す「MAP_FRAME_TYPE」というパラメータをデフォルトの白地と黒地の縞(「fancy」)からシンプルな線(「plain」)に変更しています。ちなみに、gmt setと書いてもgmtset(あいだのスペースなし)と書いてもどちらでもOKです。

このようにデフォルト値を変更すると、「gmt.conf」というファイルが作業をしているフォルダに作成されていると思います。このファイルをテキストエディタで開くと、GMTでの各種パラメータのうち変更されたものが記載されていることがわかります。このファイルがある限り変更は反映され続けますので、もし一度変更した後でデフォルト値に戻したくなった場合は、このファイルを削除する必要があります。

※参考:GMTでの各種パラメータ

echoについて

バッチファイル内でechoを使うことで、テキストファイルを作成したり、テキストファイルを介さずに直接GMTのモジュールにテキストデータをわたしたりすることができます。今回は2箇所でechoを使っています。1箇所目は東京湾を囲む線の四隅の座標を記したテキストファイル作成している部分で、2箇所目は文字を書き込むモジュールtextにテキストデータをわたしている部分です。

echoはそれに続くテキストデータを出力するコマンドです。ファイルに出力したい場合は末尾に「> ファイル名」と記載すればOKです。ファイルに複数行のテキストデータを出力したい場合は、まず1行目を「> ファイル名」で出力し、2行目以降は「>> ファイル名」で出力します(「>」は新規作成あるいは上書きを、「>>」は追加書き込みをそれぞれ意味します)。GMTのモジュールにテキストデータをわたしたい場合は「|」(パイプ)でつなぎます。

閉じた線の描画について

#3で説明したように、複数の座標データをplotにわたすことで、それらの座標をつないだ線を描くことができます。これの応用で、4つの座標を与えればそれらをつないだ四角い枠線が描けそうです。ただ、4つの座標を与えただけでは3辺しか描かれません(座標が順に点A、点B、点C、点Dとすると、辺AB、辺BC、辺CDの3編しか描かれません)。これを閉じて4辺すべてを描くためには、-Lのオプションをつける必要があります。

GMTでは地図上に2点間を結ぶ線を描くとき、大圏コース(地球表面上の2点間を結ぶ最も短いコース)で描かれます。ですので、短い距離をつなぐときは気にならないのですが、ある程度長い距離をつなぐときには、地図上で線がカーブするようになります。これを避け、単に2点間を直線でつなぎたい場合には、-Aのオプションをつける必要があります。今回はそんなに長い距離をつないでいるわけではないのでほとんど気にならないのですが、いちおうこのオプションをつけています。

ちなみに、今回は線を破線とするために、線の属性を指定する-Wのオプションの末尾に「-」と書き加えています。何も指定しなければ実線となりますが、「-」で破線、「.」で点線、「.-」で一点鎖線になります。

海域の描画について

今回、#2で使ったGEBCOの地形データを用いて海域にのみ色をつけて描画しています。GMTで用意されているCPTのうち、デフォルトでマイナスの値のみを対象としているCPTがあるので(「bathy」、「ocean」、「seafloor」など)、それらを使うと海域のみを描画することができます(陸域はすべて白になります)。今回は「bathy」のCPTを使って海域を塗った後に、coastで陸域を灰色に塗っています。

ちなみに、今回のスクリプトでは陸域の色として「lightgray」というのを使っています。オーソドックスな色名の前に「light」や「dark」をつけると、やや明るくしたり、やや暗くしたりすることができます。色を少し調整したいときに使えるかもしれません。

text

textは図に文字を書き込むモジュールです。文字を書き込む位置(座標)と書き込む文字自体をわたす必要があります。今回のようにechoでわたしてもいいですし、テキストファイルでわたしてもよいです。テキストファイルの場合は、複数のデータを一度にわたすことができます。

オプションを何もつけなくても文字は書き込まれます。その場合、わたした座標が文字の中心となるように書き込まれます。位置や文字のフォントにこだわりがなければそれでよいですが、今回は東京湾を囲む線の左上に特定のフォントで書き込まれるようにオプションをつけています。

-Fのオプション:文字の位置やフォントを指定します。ここでは、「+jLB」でわたした座標が文字のどこにあたるかを(この場合、文字の左下)、「+f12p,Helvetica-Bold,red」で文字のフォント(順に、サイズ(単位:ポイント)、種類、色)をそれぞれ指定しています。GMTでは30種類以上のフォントを使うことができますが、特に指定しなければ「Helvetica」というフォントが使われます。

※参考:GMTで扱えるフォントの種類

-Dのオプション:わたした座標から指定した文字の位置(今回の場合、文字の左下)へのx方向とy方向のオフセット(単位:cm)を指定します。今回はそのままだと「Tokyo Bay」の「y」の字の下部分が線と重なってしまうので、重ならないようにオフセットを指定しています。

おまけ

今回のスクリプトでは前回までと違い、endのオプションとして「show」というのが記載されています。このオプションを使うとスクリプトが実行された後に、出力された画像ファイルが自動で開かれます。これまでは出力された画像ファイルを手動で開いていたかと思いますが、実はその作業はこれで省略できます。

参考文献

#1~#3はこちら

1
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
1
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?