1. 环境准备与数据获取
第一次接触GMT6.0时,我被它强大的地图绘制能力震撼到了。相比商业GIS软件,这个开源工具不仅能生成出版级的地形图,还能通过简单的命令行实现复杂的地图定制。下面我就以东亚-澳大利亚区域为例,手把手带你完成整个流程。
安装GMT6.1建议直接访问GMT中文社区获取最新版本。这里有个小技巧:如果你用Linux系统,可以通过apt直接安装;Windows用户记得把安装路径添加到系统环境变量。我曾在PATH配置上栽过跟头,导致命令行无法识别gmt命令,后来发现是少了个分号。
地形数据获取推荐使用中科大镜像源,速度比官方源快3-5倍。关键数据earth_relief_30s.grd包含全球30角秒分辨率的地形信息(约1公里精度),完全能满足科研需求。存放路径要注意:
- Linux/macOS用户:~/.gmt/server
- Windows用户:C:\Users\用户名.gmt\server
实测发现,如果目录不存在,直接运行gmt命令会报错。建议先手动创建server目录,再把下载的grd文件放进去。有个细节:文件名必须保持原样,连大小写都不能错,否则系统会提示找不到数据源。
2. 基础地图绘制
先来看最核心的地形绘制命令:
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能模拟傍晚时分的立体效果
3. 站点标注技巧
科研地图少不了站点标记,这段命令堪称经典:
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
这里用到了两个关键文件:
- 1_1.txt 包含站点经纬度(经度 纬度)
- 1.txt 包含站点标注(经度 纬度 名称)
-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
4. 专业图例制作
图例是地图的画龙点睛之笔,这个方案我用了三年:
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符号定义语法包含:
- 0.5c 符号大小
- t 符号类型(t=三角形)
- 0.3c 符号内部尺寸
- red 填充色
- 0.2p,red 边框样式
- 1c 文字间隔
- 最后是图例文字
图例位置参数-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厘米的垂直间距,让图例更易读。
5. 高级优化技巧
完成基础绘图后,这些优化手段能让地图脱颖而出:
色彩方案定制
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起)
6. 实战问题排查
遇到过最棘手的问题是投影变形。有次在北极区域,站点标记全部错位,后来发现是投影类型不匹配。解决方案:
bash复制gmt grdimage ... -JG150/30/15c # 方位投影中心150°E
gmt plot ... -JG150/30/15c # 必须使用相同投影
内存不足报错也很常见。处理大区域高精度数据时,建议:
- 改用低分辨率数据(如05m替换01m)
- 添加
--GMT_TMPDIR=/tmp指定临时目录 - 分块处理后再拼接
性能优化小技巧:
- 使用
@earth_relief自动下载数据 - 对静态区域预先生成grd文件
- 关闭调试信息
-Vq
最后提醒:养成写脚本的习惯。把命令保存为.sh或.bat文件,下次只需修改参数就能复用。我有个项目模板库,包含20多种常用地图配置,新项目5分钟就能出图。