[Generic Mapping Tools (GMT)] Generic Mapping Tools (GMT) 使用心得和随笔(2):批量处理和...

[复制链接]
本章中,我会分享在GMT6中,如何利用数据绘制地图和彩图。在本篇中,我不会使用数据判别(if文嵌入)和二维化(gmt surface),而是利用下载的NetCDF格式的NOAA的1/4° daily Optimum Interpolation Sea Surface Temperature (OISST)数据直接进行绘制,并制作gif格式的动态图片。
惯例,先上结果。

1 C/ U& g, G: L* I4 E, n

2 y2 ~) w1 ]) C) f                               
登录/注册后可看大图

% [0 E8 E4 w* X$ A% `$ w
简单来说,这张动态图是由不同日期的海面温度数据组合而成,并且每张图都对日期进行标注。因此,我们分别分三部分来讲解。
  • 下载数据
  • 单独绘制每一张图
  • 将所有图片合并为GIF格式的动图

    - P5 M, `2 s! a
下载数据
本章所使用的数据来自NOAA的OISST。它是基于卫星遥感和现场观测的数据进行合成,是常用的一种日平均海面温度数据,并且可以免费下载。
游客,如果您要查看本帖隐藏内容请回复
它的格式为NetCDF。
下载数据,我们既可以在网页浏览器里直接点击下载,也可以使用命令wget。比如,这条命令就可以下载2020年6月1日的海温数据。
游客,如果您要查看本帖隐藏内容请回复
不同日期的数据地址虽然不一样,但是有一定规律。比如,我们观察OISST的数据地址,可以发现所有数据的地址都有统一的部分,而之后则是按照年月分,并且文件名以年月日命名。具有一定规律的地址,我们就可以利用循环进行批量下载。+ [% E+ h3 _/ M$ t1 A

1 k5 Z% ?+ c6 l  A0 A  a& G                               
登录/注册后可看大图

# v( r4 }4 N! @% E$ L4 B- P# h
具体怎么批量执行命令,我在下面绘制图片的部分中会有提及,大家可以根据之后的内容自行练习如何批量下载。
绘制图片
按照惯例,先放上代码。
游客,如果您要查看本帖隐藏内容请回复
  • 代码解读

    ' z0 h, W5 h) D9 v4 M8 M( x( U
下面,我们开始一一解读代码(与前几篇相同的参数设定部分,我们略过不表)。
游客,如果您要查看本帖隐藏内容请回复
这段内容,主要是设定绘图之后的图片保存位置。利用Linux、Mac的命令,可以方便地新建文件夹(如果存在,则不新建)。
游客,如果您要查看本帖隐藏内容请回复
本章中的绘制区域,由range参数进行设定。在地图绘制中,取值范围为x方向0-360或者是-180~180,y方向为-90/90。这里需要注意的是,GMT要求绘图范围的起始点不能大于终点,比如我想绘制一幅东经170到西经170的图,那么就不能写成170/-170,而是应该使用0-360的表示法(170/190)。
GMT接受若干种范围的表达方式,最常用的就是当前给出的格式,即xmin/xmax/ymin/ymax。因此,这里所代表的的意义为经度范围东经100度到东经160度,纬度范围北纬10度到北纬50度。这种制定方法,底图的形状会根据投影不同而发生改变(矩形、扇形等)。
如果绘图要求地图为长方形,则还有一种常用的表达方式,即xmin/ymin/xmax/ymax,但是在-R后面添加是需要增加小写的'r'。以本章的数据为例,写作 ‘-R100/10/160/50r’ 。
size、xanot和yanot,与之前一样,分别表示图的大小,x、y方向的刻度分配。
接下来,我们先略去gmt绘图部分,单独看循环。
  • 循环

    $ K) g3 h3 e) L) [
游客,如果您要查看本帖隐藏内容请回复
这里,我使用了for循环,结尾为done。
date和cdate两个变量,根据循环因子ti的大小,分别通过gdate命令进行日期计算和输出为我们希望的格式。gdate(mac版的date)的教程,网上有很多,我这里只简单解释一下我所用的方式及原因。
首先,我所下载的数据从2020年6月1日开始至6月18日,且时间间隔为天。因此,我设定日期计算的基准为start=20200601。随后,根据ti循环的数字,利用gdate对其进行天数的加算,以实现从1号到18号的日期变动。
其次,我选择了两种不同的输出格式:date表现的格式为%b-%d-%Y,即 Jun-01-2020这样的形式,我用于在图中表示日期;而cdate的表现格式为%Y%m%d,即20200601的形式,用于对应文件名。
注:我使用的环境是mac,因此命令为gdate(非自带,需另行安装,参考方法:brew install coreutils)。
  • 绘制海表面温度(SST)
    ( q3 H" T- k9 r" C9 l& \
游客,如果您要查看本帖隐藏内容请回复
这里我们逐行解释。
${psdir}sst_${cdate} jpeg:指定绘图的格式为jpeg,而文件名则会根据日期的不同,分别命名,如sst_20200601.jpg。
gmt makecpt -Cseis -T5/35/1 -D -I:由于我们绘制的区域为以东海为中心,主要是温带,因此我们表示海表面温度的颜色范围取了5到35,选择的基准色为反向的seis。
in:表示输入数据,文件名会根据日期进行变化。
gmt basemap :绘制底图的命令。唯一与之前不同的是,我们绘制的并不是简单的二维三维坐标,而是地理坐标,因此我们需要选择适当的地理投影。本图中,我们使用的地图投影模式是等距长方投影 (Equirectangular projection,-Jq[lon0/[lat0/]]scale 或者 -JQ[lon0/[lat0/]]width)。这里,lon0是必须的,为投影的基准经线。而lat0可加可不加。
grdimage:绘图的重要命令。其后一般跟的是输入文件。由于GMT可以直接读取netcdf格式的文件,我们可以简单地利用内置命令进行绘制。-C表示使用上面makecpt生成的颜色。
"$in?sst[0,0]": netcdf格式的文件可以通过 ‘文件名+?+变量名’来直接读取数据。OISST的数据中的sst是四维数组,其内容为:
游客,如果您要查看本帖隐藏内容请回复
尽管,它的第一纬和第二纬仅仅为1,但是gmt无法读取。因此我们,只需将sst的前两维指定之后(即[0,0]),GMT就可以读取了。注:gmt的第一纬从0开始。
grdcontour:绘制等值线。-C5表示等值线间隔为5,-A5f12表示每间隔5的线上标出标签(数值大小)且字号为12。 -W0.7表示线粗细为0.7p。
coast:绘制海岸线。-G表示填充,而-Gblack则是填充黑色。-D是表示海岸线精细度,-Dl表示low精细度。这通常在绘制范围广阔的地图时,(l)ow甚至(c)rude已经足够。一般需要根据绘制区域,选择使用(f)ull, (h)igh, (i)ntermediate。
text:添加文字。与之前讲解的一样。-N表示文字的坐标不受-R指定的范围限制。-F是针对文字的设定,+a0表示角度为0,+f12p,Times表示字体为Times字号12,+jLT表示锚点是左(L)上(T),-Gwhite表示文本框填充白色,-Wthinner表示文本框边框为'较细'。
colorbar:绘制色阶。-DJBC表示定位图的底部(B)中间(C),+h表示水平,-C表示使用颜色基准文件,-Bx表示设置色阶的x方向,+l"degC"表示添加文字“degC”,-Np表示色条有间隔非连续,-B5表示刻度间隔为5。
gmt end:结束绘制。
  • 绘制动图
    / w1 G2 z6 _1 ]; q; O8 e
新版GMT提供了Movie选项,有一定的便利性。无奈本人还没有吃透,这里主要用GMT4和5常用的手法,即使用convert命令(非GMT的类似命令gmtconvert)。
游客,如果您要查看本帖隐藏内容请回复
这条命令是将之前批量绘制的图片(sst_*.jpg,星号表示不指定,即所有符合格式的图片)转换为sst.gif,即动图。其中的选项意义为:
-loop:循环次数。0表示永远循环。
-delay:表示每张图出现的间隔,单位为毫秒(ms)。
-density:图像分辨率。数字越大越清晰,但是受限于原始文件。如果原始文件使用ps,eps,pdf等矢量图片,则可无限制提高。
-set dispose previous:每次显示图片前清除前一张。 这条命令主要是为了防止之前图片一直存在,导致后面文件显示的文字/图像重叠。
至此,绘制完成。
  • 小结

    % z/ m& \, M' a( \
本篇中,我们以绘制彩色图像为主题,还间接提到了一部分linux/mac命令的使用方法。希望对大家进行批量处理和动图制作有所帮助。

' Q. ~, d0 A) p0 K& A- V$ l
回复

举报 使用道具

相关帖子

全部回帖
暂无回帖,快来参与回复吧
懒得打字?点击右侧快捷回复 【吾爱海洋论坛发文有奖】
您需要登录后才可以回帖 登录 | 立即注册
广泛部分
活跃在2022-11-6
快速回复 返回顶部 返回列表