GMT(The Generic Mapping Tools) 主要有 4, 5, 6 三个版本。GMT4 在2018年7月发布最终版本后,停止维护。为紧跟时代,打算学习 GMT6 绘图。本篇博客主要记录本人在 ubuntu 系统下从 GMT4 迁移到 GMT6 现代模式的学习过程。

1. GMT6 安装

为了在 GMT 6 使用熟悉之前保证能顺利画图,先不卸载 GMT4,然后安装 GMT6 过程中通过对环境变量的设置加以区分。

有三种安装方式。第一种只针对于 Ubuntu 20.04 用户,以下命令即可实现安装:

$ sudo apt-get install gmt gmt-dcw gmt-gshhg
$ sudo apt-get install ghostscript gdal-bin graphicsmagick ffmpeg

# 分别查看 GMT4 和 GMT 6 是否安装成功
$ gmt --version
$ psxy -

如果 GMT4 和 GMT6 只安装成功了一个,请参考下面 GMT4&6 共存

第二种通过 conda 安装,详细参考: 跨平台GMT安装方案

第三种通过编译 GMT 源码安装(以下)。

1.1 安装依赖软件

# 安装编译所需软件包
$ sudo apt-get install build-essential cmake libcurl4-gnutls-dev libnetcdf-dev

# 安装可选软件包
$ sudo apt install ghostscript gdal-bin libgdal-dev libglib2.0-dev libpcre3-dev libfftw3-dev liblapack-dev

# 安装制作动画所需的软件包
$ sudo apt install graphicsmagick ffmpeg

1.2 下载源码及数据

GMT4 安装路径为 /opt/GMT-4.5.14/,在 /opt/GMT-4.5.14/share/coast/ 中可以找到海岸线数据 GSHHG: gshhg-gmt-2.3.7.tar.gz。或者直接下载:

# GMT 6.0.0 源码 (可替换至 GMT6 的最新版)
$ wget http://mirrors.ustc.edu.cn/gmt/gmt-6.0.0-src.tar.gz -P ~/Downloads/

# 全球海岸线数据GSHHG
$ wget http://mirrors.ustc.edu.cn/gmt/gshhg-gmt-2.3.7.tar.gz -P ~/Downloads/

# 全球数字图表DCW
$ wget http://mirrors.ustc.edu.cn/gmt/dcw-gmt-1.1.4.tar.gz -P ~/Downloads/

1.3 解压缩

$ cd ~/Downloads
$ tar -xvf gmt-6.0.0-src.tar.gz
$ tar -xvf gshhg-gmt-2.3.7.tar.gz
$ tar -xvf dcw-gmt-1.1.4.tar.gz

$ mv gshhg-gmt-2.3.7 gmt-6.0.0/share/
$ mv dcw-gmt-1.1.4 gmt-6.0.0/share/

1.4 编译

$ cd gmt-6.0.0
$ cp cmake/ConfigUserTemplate.cmake cmake/ConfigUser.cmake
# 将 ConfigUser.cmake 以下句子取消注释,并作修改
set (CMAKE_INSTALL_PREFIX "/opt/GMT-6.0.0")
set (COPY_GSHHG TRUE)
set (COPY_DCW TRUE)
set (GMT_USE_THREADS TRUE)
set (GMT_ENABLE_OPENMP TRUE)

$ mkdir build
$ cd build/
$ cmake ..

如果没有报错,证明系统软件满足 GMT 的依赖关系。

Linux/macOS 下编译GMT源码 提到GMT在配置过程中通常会找到 Anaconda 提供的库文件,进而导致配置、编译或执行过程中出错。解决办法是,在 ~/.bashrc 中将 Anaconda 相关的环境变量注释掉,以保证GMT在配置和编译过程中找到的不是 Anaconda 提供的库文件。待 GMT 安装完成后,再将 Anaconda 相关环境变量改回即可。本人这一步遇到 ~/.pyenv/ 中的文件依赖出现警告信息,注释掉 pyenv 相关环境变量后,仍然无效。于是我彻底清除了 ~/.pyenv 文件夹。

如果碰到 netcdf 等依赖问题,根据报错更新安装(netcdf 要求 >=4.0 且支持 netcdf/hdf5, 可参考 Ubuntu 下安装 netcdf4)。然后删除 build,新建,再进入编译。确保 cmake 没有问题之后,继续:

$ make -j
$ sudo make -j install

2. GMT4&6 共存

打开 ~/.bashrc在 GMT4 环境配置命令前加入

export GMT6HOME=/opt/GMT-6.0.0
export PATH=${GMT6HOME}/bin:$PATH
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${GMT6HOME}/lib64

比如本人的 GMT 环境配置为:

########    GMT6.0.0       ##########
export GMT6HOME=/opt/GMT-6.0.0
export PATH=${GMT6HOME}/bin:$PATH
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${GMT6HOME}/lib64

########    GMT4.5.14       ##########
export GMT4HOME=/opt/GMT-4.5.14
export PATH=${GMT4HOME}/bin:$PATH
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${GMT4HOME}/lib64

$ source ~/.bashrc

# 测试 GMT4 是否运行
$ psxy -
psxy 4.5.14 [64-bit] - Plot lines, polygons, and symbols on maps

# 测试 GMT 6 是否安装成功
$ gmt --version
6.0.0

提示!
查看主目录下面是否有 .gmt 文件存在,如果存在,
则需要删除该文件之后新建一个名为 .gmt 的文件夹,来存放 gmt6 运行时的中间文件。
$ sudo rm -rf ~/.gmt
$ sudo mkdir ~/.gmt
$ sudo chmod 777 ~/.gmt

3. 两种模式

GMT6 引入了一种全新的绘图命令执行模式——现代模式 (Modern mode)。GMT4&5 命令风格称为经典模式 (Classic mode)。GMT6 既支持经典模式也支持现代模式。

/ 经典模式 现代模式
图层顺序 -K 和 -O 选项 不需考虑
重定向 > 和 » 不需考虑
画布摆放方式 -P (-L) 选项 自动摆放
PS文件 需要给定 无需考虑
必选选项 -R 和 -J 对每个命令非必须
其他图片格式 支持,但需单独转换 可直接生成
纸张大小 提前设定,手动裁剪 默认无穷大,自动裁剪白边
子图模式 通过 -X 和 -Y 选项 subplot 和 inset

单个命令示例如下:

# 经典模式 GMT4 脚本:
$ pscoast -Rg -JH15c -Gpurple -Ba60f20 -P > GMT4_classic.ps
$ gs GMT4_classic.ps

# 经典模式 GMT6 脚本:
$ gmt pscoast -Rg -JH15c -Gpurple -Baf -P > GMT6_classic.ps
$ gs GMT6_classic.ps

# 现代模式 GMT6 脚本:
$ gmt coast -Rg -JH15c -Gpurple -Baf -png GMT6_modern

4. 其他

  • 参考资源来自 GMT 中文社区GMT 官方网站 .

  • 如果提示 GSHHG 出问题,可以在 /opt/GMT6.0.0/share/ 中查看是否存在,如果没有,手动移动到此处,将其命名为 coast 。DCW 文件同理,文件夹移动并命名为 dcw

  • 关于 GMT4 到 GMT6 迁移过程中脚本修改新增功能的学习记录请见另一篇博客 GMT from 4 to 6 SUPPLY .

  • GMT 卸载: GMT x (both 4 and 6) 被安装到 /opt/GMT-x.x.x 目录下。若想要卸载GMT,可以直接删除整个 /opt/GMT-x.x.x 。

  • GMT 更新:先下载新版源码再重新编译安装:

# 例如 GMT 6.0 更新到 GMT 6.2

[1]下载新版 6.2.0 源码:
$ wget https://github.com/GenericMappingTools/gmt/releases/download/6.2.0/gmt-6.2.0-src.tar.gz

[2] 解压
$ tar xf gmt-6.2.0-src.tar.gz gmt-6.2.0/
$ cd gmt-6.2.0/

[3] 必要的更新
$ sudo apt-get install build-essential cmake libcurl4-gnutls-dev libnetcdf-dev
$ sudo apt install ghostscript gdal-bin libgdal-dev libglib2.0-dev libpcre3-dev libfftw3-dev liblapack-dev
$ sudo apt install graphicsmagick ffmpeg

[4] 编译
$ cp cmake/ConfigUserTemplate.cmake cmake/ConfigUser.cmake
# 将 ConfigUser.cmake 以下句子取消注释,并作修改
set (CMAKE_INSTALL_PREFIX "/opt/GMT-6.2.0")
set (COPY_GSHHG TRUE)
set (COPY_DCW TRUE)
set (GMT_USE_THREADS TRUE)
set (GMT_ENABLE_OPENMP TRUE)
$ mkdir build
$ cd build/
$ cmake ..
# 检查编译情况是否正常

[5] 安装
$ make -j
$ sudo make -j install

[6] 更改环境变量
$ vi ~/.bashrc
6.0.0 更为 6.2.0
$ source ~/.bashrc

[7] 将旧版本中的 coast 和 dcw 以及 cpt 等文件移动到新版本中,例如
$ sudo rm -rf /opt/GMT-6.2.0/share/cpt
$ sudo mv /opt/GMT-6.0.0/share/cpt /opt/GMT-6.2.0/share/cpt
# 删除旧版本
$ sudo rm -rf /opt/gmt-6.0.0