本文整理并绘制了中国省会城市的分布图,同时展示了如何巧妙地利用 pstext 模块的功能来灵活地放置城市名的位置。

绘图脚本如下:

#!/bin/bash
R=70/138/13/56
J=M105/35/6.5i
PS=CN-capitals.ps

gmt set MAP_GRID_PEN_PRIMARY 0.25p,gray,2_2:1
gmt set FORMAT_GEO_MAP ddd:mm:ssF MAP_FRAME_WIDTH 3p
gmt set FONT_ANNOT_PRIMARY 7p
# 设置比例尺标签为35号中文字体
gmt set FONT_LABEL 8p,35 MAP_LABEL_OFFSET 4p

# 绘制中国地图
gmt pscoast -J$J -R$R -G244/243/239 -S167/194/223 -B10f5g10  -Lg85/17.5+c17.5+w800k+f+u+l'比例尺' -K > $PS
gmt psxy CN-border-La.dat -J$J -R$R -W0.4p,gray50 -K -O >> $PS

# 绘制省会位置
## 此处使用两次 psxy 命令以实现图中所示的空心圆叠加实心圆的效果
gmt psxy CN-capitals.dat -J$J -R$R -Sc0.08c -Gblack -K -O >> $PS
gmt psxy CN-capitals.dat -J$J -R$R -Sc0.15c -W0.2p,black -K -O >> $PS
# 绘制省会名称
gmt pstext CN-capitals.dat -J$J -R$R -F+f7p,35+j -Dj0.15c/0.15c -K -O >> $PS
# 标记北京所在位置
echo 116.46 39.92 | gmt psxy -J$J -R$R -Gred -Sa0.4c -K -O >> $PS

# 绘制南海区域
R=105/123/3/24
J=M1.1i
gmt psbasemap -J$J -R$R -B0 -X5.4i --MAP_FRAME_TYPE=plain --MAP_FRAME_PEN=1p -K -O >> $PS
gmt pscoast -J$J -R$R -N1/0.1p -W1/0.25p -G244/243/239 -S167/194/223 -K -O >> $PS
gmt psxy CN-border-La.dat -J$J -R$R -W0.25p -O -K >> $PS
echo "南海诸岛" | gmt pstext -J$J -R$R -F+f10p,35+cBC -D0c/0.1c -N -Gwhite -O >> $PS

rm gmt.conf gmt.history

pstext-F 选项参数为 -F+f7p,35+j ,即使用大小为 7p 的 35 号字体写城市名。由于使用了 +j 选项,因而输入文件需要有四列,分别是经度、纬度、文本对齐方式以及城市名,具体内容如下(此处为了节省空间,只显示了个别几个城市的数据):

# 经度    纬度   对齐方式  城市名
121.48   31.22    ML    上海
...
112.53   37.87    TC    太原
...
101.74   36.56    MR    西宁
...
117.27   31.86    CB    合肥

pstext 默认会将城市名放在城市所在处,因而要使用 -D<dx>/<dy> 选项将城市名沿着X和Y方向分别移动 <dx><dy>。上面的示例中使用了 -Dj0.15c/0.15c,关键在于其中 j 的使用,其使得文本会沿着文本对齐方式所定义的方向移动。比如:

  1. “上海”的对齐方式是 ML(即 Middle Left),-Dj0.15c/0.15c 使得“上海”向右移动了 0.15 厘米
  2. “西宁”的对齐方式是 MR(即 Middle Right),-Dj0.15c/0.15c 使得“太原”向左移动了 0.15 厘米
  3. “太原”的对齐方式是 TC(即 Top Center),-Dj0.15c/0.15c 使得“太原”向下移动了 0.15 厘米
  4. “合肥”的对齐方式是 BC(即 Bottom Center),-Dj0.15c/0.15c 使得“西宁”向上移动了 0.15 厘米

你也可以尝试以下其他对齐方式下 -Dj 的具体效果。

最终绘图效果如下图:

中国省会城市分布图