とらりもんHOME  Index  Search  Changes  Login

GMT

作成者

  • 2004/10/31, 2004/07/08, 2004/3/14, 奈佐原(西田)顕郎 (Vine Linux 3.0)
  • 2008/10/15 本岡。古かったので、全体的に書き直し。
  • 2010/03/12 本岡。
  • 2011/04/22 松吉。
  • 2016/01/27 牧野。古かったので、主にインストールに関する部分を書き直し。
  • 2016/12/13 Jin Katagi

GMTとは

GMTは、すごくきれいな地図を描くためのフリーソフトです。 たとえばこんなのとかを、ふつうのパソコンで、無料で、描けます。

参考になるページ

インストール

Ubuntu 16.04

ガリガリ使う予定がない人はaptからどうぞ。

sudo apt install gmt
sudo apt install gmt-gshhg-high gmt-gshhg-low

aptでインストールされるGMTは5系なので、 各種コマンド(例:pscoast)を使う場合は

gmt pscoast ...

のようにgmtを先頭につける。

Ubuntu 14.04の場合

  • 注: Ubuntu 14.04でapt-getでインストールするGMTはバグがあるのでやめよう。ソースからインストールすべし! 参考
  • 端末を起動し、関連ライブラリをインストール。
$ sudo apt-get install libnetcdf-dev
$ sudo apt-get install gdal-bin
$ sudo apt-get install libgdal-dev
  • GMTソースをダウンロードしてインストールする。
$ wget "ftp://ftp.scc.u-tokai.ac.jp/pub/gmt/gmt-4.5.12-src.tar.bz2"
$ tar xf gmt-4.5.12-src.tar.bz2
$ cd gmt-4.5.12/
$ ./configure --prefix=/usr/local/GMT-4.5.12 
$ make all
$ sudo make install-all
  • /usr/local/GMT-4.5.12を/usr/local/GMTにシンボリックリンクを貼る。(他のバージョンもインストールする場合)
$ sudo ln -s /usr/local/GMT{-4.5.12,}

海岸線データの整備

  • apt-getでは、粗い解像度の海岸線しか手に入らない。これはあまりにもかっこわるいので、高解像度の海岸線を整備しよう。
  • 海岸線データをダウンロードしてきて、展開。
$ wget http://pen.agbi.tsukuba.ac.jp/~RStiger/test_data/gshhs-2.1.1-full.tar.bz2
$ http://pen.agbi.tsukuba.ac.jp/~RStiger/test_data/gshhs-2.1.1-high.tar.bz2
$ bunzip2 gshhs-2.1.1-full.tar.bz2
$ bunzip2 gshhs-2.1.1-high.tar.bz2
$ tar xvf gshhs-2.1.1-full.tar
$ tar xvf gshhs-2.1.1-high.tar
$ sudo mv share/coast/*.cdf /usr/share/gmt/coast

-------松吉 追記 (2011/04/22)--------------

GMT 4.5.2 の場合、バージョン2.0.2のデータが必要。(GMT 4.5.3ではバージョン2.1.0。)

インストール用のコマンドがあります。

$sudo gmt-coastline-download [high|full|high-full|low|all] [version] 

ダウンロード元を選ぶ。(*に古いバージョンがある。2011/04/22 現在)

 1) ftp://ftp.soest.hawaii.edu/gmt
 2) ftp://ibis.grdl.noaa.gov/pub/gmt
*3) ftp://ftp.iris.washington.edu/pub/gmt
 4) ftp://ftp.iag.usp.br/pub/gmt
 5) ftp://ftp.geologi.uio.no/pub/gmt
 6) ftp://gd.tuwien.ac.at/pub/gmt
*7) ftp://ftp.scc.u-tokai.ac.jp/pub/gmt
 8) ftp://mirror.geosci.usyd.edu.au/pub/gmt

-------------------------------------------

県境データの整備

例1

県境データをここからダウンロード。

これを、/usr/share/gmt/以下に移動する。

標高データの整備

標高データとして、GTOPO30を整備しよう。(参考:http://home.hiroshima-u.ac.jp/kojiok/wingmt/gtopo.html

データを取得する

  • GTOPO30のFTPサイト: そしてここからダウンロード。解凍すると、拡張子.DEMなどのファイルができる。
  • 日本を含めた範囲のダウンロードには、以下のコマンド。
# ダウンロード
wget ftp://edcftp.cr.usgs.gov/pub/data/gtopo30/global/e100n90.tar.gz
wget ftp://edcftp.cr.usgs.gov/pub/data/gtopo30/global/e100n40.tar.gz
wget ftp://edcftp.cr.usgs.gov/pub/data/gtopo30/global/e140n90.tar.gz
wget ftp://edcftp.cr.usgs.gov/pub/data/gtopo30/global/e140n40.tar.gz

# 解凍
tar zxvf e100n90.tar.gz
tar zxvf e100n40.tar.gz
tar zxvf e140n90.tar.gz
tar zxvf e140n40.tar.gz

データをGMT用に変換する

  • DEMファイルを、GMT用のラスターファイル(拡張子.grd)に変換する。日本のデータだと、以下のような感じ。
xyz2grd E100N40.DEM -Dm/m/m/1/0/=/= -Ge100n40.grd -R100/140/-10/40 -I30c -N-9999 -V -ZTLhw -F
xyz2grd E140N40.DEM -Dm/m/m/1/0/=/= -Ge140n40.grd -R140/180/-10/40 -I30c -N-9999 -V -ZTLhw -F
xyz2grd E100N90.DEM -Dm/m/m/1/0/=/= -Ge100n90.grd -R100/140/40/90 -I30c -N-9999 -V -ZTLhw -F
xyz2grd E140N90.DEM -Dm/m/m/1/0/=/= -Ge140n90.grd -R140/180/40/90 -I30c -N-9999 -V -ZTLhw -F
  • xyz2grdは、GMT用のラスターファイル(専用のヘッダーがついてる?)に変換してくれるGMTのコマンド。
xyz2grd 元データ -G作成されるgrdデータ名 -Rデータの範囲 -Iデータの格子間隔(解像度)-Nnull値の値 -Zデータのタイプ

  • なお、バイトスワップ(エンディアンの変換)が必要な場合は以下のような感じ。CPUがIntelじゃないときとか。
xyz2grd E100N40.DEM -Se100n40.bin -Zh
xyz2grd e100n40.bin -Dm/m/m/1/0/=/= -Ge100n40.grd -R-180/-140/40/90 -I30c -N-9999 -V -ZTLhw -F

モザイクする(複数のデータをくっつけて1枚にする)

  • 日本の4枚をくっつける場合は、以下のような感じ。
grdpaste e100n40.grd e140n40.grd -Gd1.grd
grdpaste e100n90.grd e140n90.grd -Gd2.grd
grdpaste d1.grd d2.grd -GEastAsia.grd

陰影データを作る

  • 陰影をつけるためのラスターデータ(EastAsia_l.grd)を作成。
grdgradient EastAsia.grd -Nt0.7 -A240 -M -GEastAsia_l.grd

最後に

  • 完成したgrdファイル一式を、/usr/lib/gmt/dbase/に移動。
sudo mv EastAsia.grd EastAsia_l.grd $GMTHOME/share/dbase/

基本的な使い方

例1: シンプルな日本地図

  • 以下のようなシェルスクリプト(test_GMT1.sh)を作る。
    • comvertコマンドは、imagemagickをインストールしないと使えないので注意。
#!/bin/sh
# test_GMT1.sh

pscoast -JM16 -R126/149/28.5/46.5 -Lf145/30/35/500 -Df -Ba5f2.5g5 -P -W2 -Na -G200 -S255 -V -X3 -Y6 > test1.ps

convert -density 100 test1.ps test1.png
  • 実効権限を与えて、動かす。
chmod +x test_GMT1.sh
./test_GMT1.sh
  • pscoastは、海岸線を書くGMTコマンド。いろんなオプションを試してみよう。
-J: 投影法とスケール。
-R: 地図の範囲。ここでは、西、東、南、北の順番に緯度経度で指定している。
-L: スケールを書く。最初の2つの数字は、表示位置(経度/緯度)。
  3つ目は、スケールの基準とする緯度(緯度によって、1度が何kmか変わるよね!)。
  4つ目は、スケールの幅。0kmから何kmまでを書くかということ。
  fは、fancy。白黒の飾りスケールにする指定。
-D: 海岸線の解像度。fはfull。hはhigh。lはlow。
-B: 枠とか、軸とか。a5は、枠外の数字の表示間隔を5度刻みにするということ。
  f2.5は、中目盛の間隔を2.5度刻みにするということ。
  g5は、格子間隔を5度刻みにするということ。
-P: 用紙の向きを縦に。
-W: ラインの太さ。
-N: 国境線。
-G: 陸の色。ここでは、グレースケールで0-255の間の、200くらい。
-S: 海の色。ここでは、255だから、白。
-V:
-X, -Y: 地図の原点位置。

例2: 県境くらいは・・・

  • 上のスクリプトを少し書きかえる。pscoastの-K(次に上書きがまだあることを指定するオプション)を忘れないように注意!
#!/bin/sh
# test_GMT2.sh

pscoast -JM16 -R126/149/28.5/46.5 -Lf145/30/35/500 -Df -Ba5f2.5g5 -P -W2 -G200 -S255 -V -X3 -Y6 -K > test2.ps
psxy $GMTHOME/share/ken.txt -JM -R -M -W2 -O >> test2.ps

convert -density 100 test2.ps test2.png

例3: 自分のサイトくらいは・・・

#!/bin/sh
# test_GMT3.sh

cat <<EOF >site.txt
140.09478 36.11333 TGF
137.42311 36.14617 TKY
141.51858 42.7369 TMK
138.764704 35.443579 FHK
140.026806 36.053889 MSE
135.76683 35.01817 RHN
138.34945 36.52333 SGD
137.37083 36.13972 TKC
135.99444 34.96361 KEW
140.09827 36.22596 MTK
EOF

pscoast -JM16 -R126/149/28.5/46.5 -Lf145/30/35/500 -Df -Ba5f2.5g5 -P -W2 -G200 -S255 -V -X3 -Y6 -K > test3.ps
psxy $GMTHOME/share/ken.txt -JM -R -M -W2 -O -K >> test3.ps
cat site.txt | psxy -JM -Sc0.3 -G255/0/0 -R -P -V -O >> test3.ps

convert -density 100 test3.ps test3.png
  • 備考)赤い点を書く前に、少し大きい白い点を書くと、かっこよくなります。

例4: せっかく整備したんだから、標高くらいは・・・

例5: GRASSとかで作ったラスター画像をきれいな地図にしたい!

  • なんと、GRASSのコマンドで、直接grdファイルを出力できます。
r.out.bin -h input=pochi output=pochi.grd
  • サンプルスクリプト↓
#!/bin/sh

i=${1%.grd}
year=`echo $i | cut -b 1-4`
method=`echo $i | sed 's/_/ /g' | awk '{print $2}'`

scale=16

w=129
e=148
s=30
n=46

cat <<EOF > onset_rainbow.cpt
-9999 255 255 255	80 255 255 255
80   255   0   0	100 255 120   0
100   255 120   0       120 255 255   0
120   255 255   0	140   0 255   0 
140     0 255   0	160   0  80   0
160     0  80   0	180   0  30   0
180     0  30   0       210   0  10   0
210   255 255 255      9999 255 255 255
EOF 

out=${i}.ps
psbasemap -JM${scale} -R${w}/${e}/${s}/${n} -B5f2.5 -X3 -Y6 -P -K -V  > $out
grdimage ${i}.grd -R${w}/${e}/${s}/${n} -JM${scale} -Conset_rainbow.cpt -O -P -K -V >> $out
pscoast -JM -R -Dh -Ba5f2.5 -P -W2 -V -K -Na -S255 -O >> $out
echo "140.4 32.5 16 0 0 0 Day of Year (DOY)" | pstext -JM -R -O -K >> $out
echo "144 34 32 0 0 0 ${year}" | pstext -JM -R -O -K >> $out
cat onset_rainbow.cpt | awk '80<=$1 && $1<180 {print $0}' > dummy.cpt
psscale -Cdummy.cpt -D12c/2c/6.5c/0.4ch -O >> $out 

ps2pdf $out
convert -density 100 -crop 750x770+50+140 $out ${i}.png

GMTのパラメータ設定

gmtsetでできる。

例6:教師点を地図上にプロット(2016/12/13)

training_data.txtは

1,140,36

のように、カテゴリ番号、経度、緯度の順に入っていると仮定します。

#!/bin/sh
# 2016/12/13 Jin Katagi
# plot training_data.txt on the japanese map with color coding. 
# this script can run with GMT 5.2.1.
# usage) $ ./make_training_data_plot.sh

training_data=training_data.txt
map_name=training_data

if [ ! -e ${training_data} ]; then
 echo "Training data file ${training_data} not found."
 exit 1
fi

# plot the japanese map
gmt pscoast -JM16 -R122/149/20/46.5 -Lf145/30/35/500 -Dl -Ba5f2.5g5 -P -W2 -Na -G200 -S255 -V -X3 -Y6 -K > ${map_name}.ps


circle_size=0.1

# set color table
water_color=0/0/100
urban_color=255/0/0
rice_color=0/128/255
crop_color=255/193/191
grass_color=255/255/0
DBF_color=128/255/0
DNF_color=0/255/128
EBF_color=86/172/0
ENF_color=0/172/0
bareland_color=128/100/0

# plot training_data
cat ${training_data} | awk -F"," '$1==1{print $2,$3}' |  gmt psxy -P -JM  -R -Sc${circle_size} -G${water_color} -W -V -O -K >> ${map_name}.ps
cat ${training_data} | awk -F"," '$1==2{print $2,$3}' |  gmt psxy -P -JM  -R -Sc${circle_size} -G${urban_color} -W -V -O -K >> ${map_name}.ps
cat ${training_data} | awk -F"," '$1==3{print $2,$3}' |  gmt psxy -P -JM  -R -Sc${circle_size} -G${rice_color} -W -V -O -K >> ${map_name}.ps
cat ${training_data} | awk -F"," '$1==4{print $2,$3}' |  gmt psxy -P -JM  -R -Sc${circle_size} -G${crop_color} -W -V -O -K >> ${map_name}.ps
cat ${training_data} | awk -F"," '$1==5{print $2,$3}' |  gmt psxy -P -JM  -R -Sc${circle_size} -G${grass_color} -W -V -O -K >> ${map_name}.ps
cat ${training_data} | awk -F"," '$1==6{print $2,$3}' |  gmt psxy -P -JM  -R -Sc${circle_size} -G${DBF_color} -W -V -O -K >> ${map_name}.ps
cat ${training_data} | awk -F"," '$1==7{print $2,$3}' |  gmt psxy -P -JM  -R -Sc${circle_size} -G${DNF_color} -W -V -O -K >> ${map_name}.ps
cat ${training_data} | awk -F"," '$1==8{print $2,$3}' |  gmt psxy -P -JM  -R -Sc${circle_size} -G${EBF_color} -W -V -O -K >> ${map_name}.ps
cat ${training_data} | awk -F"," '$1==9{print $2,$3}' |  gmt psxy -P -JM  -R -Sc${circle_size} -G${ENF_color} -W -V -O -K >> ${map_name}.ps
cat ${training_data} | awk -F"," '$1==10{print $2,$3}' |  gmt psxy -P -JM  -R -Sc${circle_size} -G${bareland_color} -W -V -O -K >> ${map_name}.ps

# add legend
gmt pslegend -R -J -D141/31/4.5c/2.7c/BL -F -O << END >> ${map_name}.ps
N 2
S 0.2c c 0.2C ${water_color} 0.1p 0.3c  Water
S 0.2c c 0.2C ${urban_color} 0.1p 0.3c Urban
S 0.2c c 0.2C ${rice_color} 0.1p 0.3c   Rice
S 0.2c c 0.2C ${crop_color} 0.1p 0.3c   Crop
S 0.2c c 0.2C ${grass_color} 0.1p 0.3c  Grass
S 0.2c c 0.2C ${DBF_color} 0.1p 0.3c    DBF
S 0.2c c 0.2C ${DNF_color} 0.1p 0.3c    DNF
S 0.2c c 0.2C ${EBF_color} 0.1p 0.3c    EBF
S 0.2c c 0.2C ${ENF_color} 0.1p 0.3c    ENF
S 0.2c c 0.2C ${bareland_color} 0.1p 0.3c   Bareland
END

gmt psconvert ${map_name}.ps -P -A
rm ${map_name}.ps 

Last modified:2017/02/01 08:46:25
Keyword(s):
References:[トレーニングコース] [When you don't know how to do it.] [とらりもんHOME]