GMTをWindowsで使う - #2 地形図を描く

## はじめに
今回はGEBCO (General Bathymetric Chart of the Oceans)の地形データ（標高・水深のデータ）を使って地形図を描いてみたいと思います。

## 地形データのダウンロード
GEBCOの[このページ](https://download.gebco.net/)に行き、地形データをダウンロードします。今回はデータの範囲を南北方向には北緯33度から38度、東西方向には東経138度から142度とします。ファイルの形式は「2D netCDF」の「Grid」を選択します。

ダウンロードしたファイルを解凍すると、中に「.nc」という拡張子のついたnetCDFという形式のファイルがあると思います。GMTではこのnetCDFなどのバイナリのグリッドファイル（格子状のデータが格納されているファイル）をそのまま読み込んで扱うことができます。

## スクリプトの解説
地形データをダウンロードできたら、作業をするフォルダに上記のnetCDFのファイルと次のスクリプトが書かれたバッチファイルを保存して、バッチファイルを実行します。

```
set gebco=gebco_2024_n38.0_s33.0_w138.0_e142.0.nc
set cpt=color.cpt
gmt makecpt -Cgeo > %cpt%
rem gmt grdinfo %gebco%
gmt begin output png
  gmt grdimage %gebco% -R138:05/141:35/33:55/37:25 -JM12 -BWeSn -Bxa1f10m -Bya1f10m -C%cpt%
  gmt colorbar -C%cpt% -DJRM+o0.5/0+e -B1000
gmt end
pause
```

実行すると次のような地形図ができていると思います。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576166/b4687635-ddc6-31c8-befb-6d6b366c77c6.png">

### setについて
`set`を使うとバッチファイル内で使用できる変数を設定することができます。例えば、上記のスクリプト内の「set cpt=color.cpt」は、このバッチファイル内で「%cpt%」（`set`で設定した変数を使う際には変数名を「%」で囲みます）と書かれた部分を「color.cpt」として扱うということを意味します。ファイル名や複数箇所で出てくる設定などは、このようにあらかじめ設定しておくと便利ではないかと思います。

### makecpt
`makecpt`はGMTで用いるカラーパレットテーブル（CPT）のファイルを作成するモジュールです。今回のようにデータの値に基づいて色をつける場合には、どの値をどの色に対応させるのかを示すCPTファイルを用意する必要があります。`makecpt`の行の末尾を「> CPTファイルのファイル名」とすることでCPTファイルが作成されます。

`-C`のオプション：GMTであらかじめ用意されているCPTのうち、どれをベースに使うかを指定します。ここでは地形を表すのによさそうなCPTである「geo」を使っています。

※参考：[GMTで用意されているCPT](https://docs.generic-mapping-tools.org/latest/reference/cpts.html)

### grdimage
`grdimage`はグリッドファイルを読んで、各格子の値に応じた色を描画するモジュールです。上記のスクリプトでは、「%gebco%」（＝「～.nc」）に記載されている地形データを読み込み、`-C`のオプションで指定したCPTファイルに基づいて、カラーの地形図を描画しています。

ちなみに、今回のスクリプトでは、描画する範囲を指定する`-R`のオプションに「138:05」や「141:35」と書いてありますが、これらは東経138度05分や東経141度35分を表しています。緯度経度は度分秒を使って表したい場合には、GMTでは「度:分:秒」とコロンを使って記述します。

### colorbar
`colorbar`はカラースケールバー（色の凡例）を描画するモジュールです。`-C`のオプションで指定したCPTファイルを読み込んでカラースケールバーを描画します。

`-D`のオプション：カラースケールバーの配置とサイズを指定します。まず、「JRM」で本体の図の「RM」（右側中央）の外側にバーを配置することを指定しています。加えて、「+o0.5/0」で本体の図からバーへのx方向とy方向のオフセット（単位：cm）を、「+e」でCPTの最小値より小さい値と最大値より大きい値に対する色を三角でバーに追記することをそれぞれ指定しています。サイズの指定がありませんが、その場合は、長さは図の大きさの80％（今回はタテのバーなので図のタテの大きさの80％）、幅は長さの4％、最小値と最大値の外の部分の長さは幅の半分、として描画してくれます。これらのサイズは好みの値にひとつひとつ設定することもできるのですが、特にこだわりがなければこのように自動でサイズを決めてもらうとよいかもしれません。

`-B`のオプション：カラースケールバーの枠の見た目を指定します。ここでは目盛の間隔を「1000」としています。

## おまけ
上記のスクリプトで解説していない箇所が1行あります。4行目の`grdinfo`というモジュールが書かれているる行です。バッチファイルでは行の先頭に`rem`があるとその行はコメントとして扱われるので、上記のスクリプトのままではこの行は実行されません。`rem`を削除して実行してみると、コマンドプロンプトのウィンドウに何やら現れると思います。

実は、`grdinfo`はグリッドファイルの情報を表示するモジュールなので、今回使っているGEBCOのファイルの情報が表示されています。途中の行に「x_min: 138 x_max: 142」や「y_min: 33 y_max: 38」と表示されているかと思います。これはファイルに入っているデータの範囲を示しています。今回は特にこれを実行する必要はありませんが、グリッドファイルの中身がわからなくなってしまったときにはこれで中身にどんなデータが入っているのか確認することができます。

このように、GMTの中にはファイルから情報を抜き出したり、ファイルの中のデータを編集したりするモジュールも用意されています。

## 参考文献
- [The General Bathymetric Chart of the Oceans (GEBCO)](https://www.gebco.net/)
- [makecpt - GMT documentation](https://docs.generic-mapping-tools.org/latest/makecpt.html)
- [grdimage - GMT documentation](https://docs.generic-mapping-tools.org/latest/grdimage.html)
- [colorbar - GMT documentation](https://docs.generic-mapping-tools.org/latest/colorbar.html)

## #1はこちら

https://qiita.com/dosukoi_1/items/d9e1f99f5f8e83dbca64