第一次接触GMT6.0时,我被它强大的地图绘制能力震撼到了。相比商业GIS软件,这个开源工具不仅能生成出版级的地形图,还能通过简单的命令行实现复杂的地图定制。下面我就以东亚-澳大利亚区域为例,手把手带你完成整个流程。
安装GMT6.1建议直接访问GMT中文社区获取最新版本。这里有个小技巧:如果你用Linux系统,可以通过apt直接安装;Windows用户记得把安装路径添加到系统环境变量。我曾在PATH配置上栽过跟头,导致命令行无法识别gmt命令,后来发现是少了个分号。
地形数据获取推荐使用中科大镜像源,速度比官方源快3-5倍。关键数据earth_relief_30s.grd包含全球30角秒分辨率的地形信息(约1公里精度),完全能满足科研需求。存放路径要注意:
实测发现,如果目录不存在,直接运行gmt命令会报错。建议先手动创建server目录,再把下载的grd文件放进去。有个细节:文件名必须保持原样,连大小写都不能错,否则系统会提示找不到数据源。
先来看最核心的地形绘制命令:
bash复制gmt begin global_relief png
gmt grdimage earth_relief_30s.grd -JQ20c -R130/160/-45/25 -BWSEN -Baf -I+d
这段代码我拆解过无数次,每个参数都有讲究:
-JQ20c 表示使用等距圆柱投影(Q),地图宽度20厘米-R130/160/-45/25 限定经度130°E-160°E,纬度45°S-25°N-BWSEN 在四边添加刻度,-Baf 自动设置刻度间隔-I+d 启用默认光照效果,让地形立体感更强新手常犯的错误是区域范围设置不合理。有次我把经度写成130-160(漏了E),结果地图显示完全错乱。记住:GMT的-R参数必须带方向标识(E/W/S/N)。
光照效果调试是个技术活。通过-I参数可以玩出很多花样:
-I+a45 设置光源方位角45度-I+m0.5 调整光照强度为默认值的50%-I+a45+m0.8 能模拟傍晚时分的立体效果科研地图少不了站点标记,这段命令堪称经典:
bash复制gmt plot 1_1.txt -St0.5c -Wthinner,red -Gred
gmt text 1.txt -F+f15p,1,red+a30 -D-0.8c/-0.15c
这里用到了两个关键文件:
-St0.5c 表示绘制三角形标记(t),大小0.5厘米。我更喜欢用-Si画倒三角形,或者-Sd画钻石形,这样在密集区域更容易区分。
文字标注的-F参数特别强大:
f15p 设置15磅字号1 指定字体(1对应Helvetica)red 文字颜色a30 文字旋转30度-D 调整文字偏移量(负值向左/下)曾经有个项目需要标注200多个站点,我开发了个自动化脚本批量生成标注文件。核心是用awk处理原始数据:
bash复制awk '{print $1,$2}' sites.csv > coordinates.txt
awk '{print $1,$2,$3}' sites.csv > labels.txt
图例是地图的画龙点睛之笔,这个方案我用了三年:
bash复制echo S 0.5c t 0.3c red 0.2p,red 1c 监测站 > legend.dat
gmt legend legend.dat -DjBR+w6.8c+o12.5c/15c -F+p0.5p
S符号定义语法包含:
图例位置参数-DjBR表示右下角(Bottom Right),+w6.8c设置宽度,+o调整偏移量。有个实用技巧:先用-DjTL临时放在左上角调试样式,确定后再移到最终位置。
复杂图例可以分层设计:
bash复制{
echo G 0.2c
echo S 0.5c t 0.3c red 0.2p,red 1c 气象站
echo S 0.5c c 0.3c blue 0.2p,blue 1c 地震台
} > legend.dat
G 0.2c插入0.2厘米的垂直间距,让图例更易读。
完成基础绘图后,这些优化手段能让地图脱颖而出:
色彩方案定制
bash复制gmt makecpt -Cgeo -T-8000/8000/500 -Z > topo.cpt
gmt grdimage earth_relief_30s.grd -Ctopo.cpt
-Cgeo调用GMT内置的地理色标,-T设置高程范围,-Z启用连续渐变。我常备几个预设:
-Cdem1 适合陆地突出-Cglobe 海陆对比明显-Crelief 强调地形起伏多图叠加技术
bash复制gmt grdimage @earth_relief_10m -JM15c -Rg -Ctopo.cpt
gmt coast -Wthinnest -Df
先用低分辨率数据(10弧分)绘制全球底图,再叠加高精度局部数据。-Df选择全分辨率海岸线,避免锯齿。
输出格式优化
bash复制gmt end show
gmt end ? # 查看支持格式
除了默认PNG,建议尝试:
-Tf 输出PDF(矢量图更清晰)-Tg 输出透明背景PNG-A 设置DPI(印刷用300dpi起)遇到过最棘手的问题是投影变形。有次在北极区域,站点标记全部错位,后来发现是投影类型不匹配。解决方案:
bash复制gmt grdimage ... -JG150/30/15c # 方位投影中心150°E
gmt plot ... -JG150/30/15c # 必须使用相同投影
内存不足报错也很常见。处理大区域高精度数据时,建议:
--GMT_TMPDIR=/tmp指定临时目录性能优化小技巧:
@earth_relief自动下载数据-Vq最后提醒:养成写脚本的习惯。把命令保存为.sh或.bat文件,下次只需修改参数就能复用。我有个项目模板库,包含20多种常用地图配置,新项目5分钟就能出图。