GMT 入门
GMT 实例
GMT 进阶
- 基础知识
- 表数据
- 网格文件
- 颜色表 CPT
- 标准选项
- 地图投影
- -JX: Linear, logarithmic, power, and time
- -JP: Polar/Cylindrical
- -JA: Lambert azimuthal equal area
- -JB: Albers conic equal area
- -JC: Cassini cylindrical
- -JCyl_stere: Cylindrical stereographic
- -JD: Equidistant conic
- -JE: Azimuthal equidistant
- -JF: Azimuthal gnomonic
- -JG: Azimuthal orthographic/General perspective
- -JH: Hammer equal area
- -JI: Sinusoidal equal area
- -JJ: Miller cylindrical
- -JK: Eckert equal area
- -JL: Lambert conic conformal
- -JM: Mercator cylindrical
- -JN: Robinson
- -JO: Oblique Mercator
- -JPoly: (American) polyconic
- -JQ: Equidistant cylindrical
- -JR: Winkel Tripel
- -JS: General stereographic
- -JT: Transverse Mercator
- -JU: Universal Transverse Mercator (UTM)
- -JV: Van der Grinten
- -JW: Mollweide
- -JY: Cylindrical equal area
- 配置参数
- 地学数据集
- 中国地理空间数据集
- 中文支持
- API
- 模块手册
- basemap
- begin
- clear
- clip
- coast
- colorbar
- contour
- coupe
- end
- figure
- filter1d
- fitcircle
- gmt
- gmt-config
- gmtbinstats
- gmtconnect
- gmtdefaults
- gmtget
- gmtinfo
- gmtlogo
- gmtmath
- gmtselect
- gmtset
- gmtsimplify
- gmtspatial
- gmtsplit
- gmtvector
- gmtwhich
- grd2cpt
- grd2xyz
- grdblend
- grdclip
- grdcontour
- grdconvert
- grdcut
- grdedit
- grdfill
- grdimage
- grdinfo
- grdlandmask
- grdmask
- grdmath
- grdpaste
- grdproject
- grdsample
- grdtrack
- grdtrend
- grdvector
- grdview
- grdvolume
- gshhg
- histogram
- image
- img2google
- img2grd
- kml2gmt
- makecpt
- mapproject
- mask
- meca
- nearneighbor
- plot
- polar
- project
- psconvert
- rose
- sac
- sample1d
- solar
- spectrum1d
- sph2grd
- sphdistance
- sphinterpolate
- sphtriangulate
- surface
- ternary
- text
- triangiulate
- velo
- wiggle
- x2sys_binlist
- x2sys_cross
- x2sys_datalist
- x2sys_get
- x2sys_init
- x2sys_list
- x2sys_merge
- x2sys_put
- x2sys_report
- x2sys_solve
- xyz2grd
- mgd77manage
- mgd77convert
- mgd77header
- mgd77info
- mgd77list
- mgd77magref
- mgd77path
- mgd77sniffer
- mgd77track
- legend
- docs
- subplot
- inset
附录
其他
等值线标注和线条标注
GMT 中可以使用采用 grdcontour
和 pscontour
模块来绘制等值线,每条等值线都可以附加一个标注。GMT 中 plot
和 plot3d
模块也可以使用 -Sq
选项绘制带有标注的线段。
在需要为等值线/线段附加标注的时候,如何优化标注的位置是一个很困难的主题。GMT 提供了不同的算法确定标注的位置,并且可以自由地指定标注的属性。本章总结了标注的属性和位置确定方法,并给出了一些应用实例。
标注的位置
GMT 中提供了 5 种算法来自动确定标注的位置。对于 grdcontour
和 pscontour
模块,可以通过 -G
选项指定使用哪种标注定位算法,对于 plot
和 plot3d
模块,则可以通过 -Sq
选项指定使用哪种标注定位算法。
不管是 -G
还是 -Sq
,其所需要的信息是完全相同的,采用 <code><info>
的格式来指定算法和相应参数,其中 <code>
取不同的值代表不同的算法, <info>
则是各个算法所对应的参数。
下述内容给出了不同 <code>
对应的算法和相应的参数:
- d:
完整的语法为
d<dist>[c|i|p][/frac]
根据地图上的投影距离确定标注的位置,可以指定长度单位或采用默认值 [ PROJ_LENGTH_UNIT ]。从等值线的起始位置开始,以
<dist>
为步长,沿着等值线布置标注。为了保证可以标注总长度小于<dist>
的封闭曲线,可以指定<frac>
参数,将第一个标注放置在距封闭曲线起点 d = <dist> * <frac> 的位置上,frac
的默认值为 0.25。- D:
完整的语法为
D<dist>[d|m|s|e|f|k|M|n][/<frac>]
与
d
相似,但是其输入数据必须是地理坐标(同时必须选择地图投影),距离为沿等值线的地表真实距离。可以附加距离的单位,其中d|m|s|e|f|k|M|n
各个单位的含义见 单位 一节。其它参数的意义与d
相同。- f:
完整的语法为
f<fix.txt>[/<slop>[c|i|p]]
其中,ASCII 文件
<fix.txt>
中每条记录的前两列(坐标)指定了标注的位置。当文件中的坐标与等值线的距离小于<slop>
(附加单位或使用默认值 PROJ_LENGTH_UNIT )时,才会显示标注。<slope>
的默认值为 0,即文件中的坐标必须与线段上的坐标完全匹配。- l:
完整的语法为
l<line1>[,<line2>[, ...]]
指定一个或多个以逗号分隔的直线段,在这些直线段与等值线的交点位置放置标注。通过起点
<start>
和终点<stop>
的坐标来定义每个直线段<line>
。起点和终点的坐标可以是常规坐标,如斜杠分隔的经纬度,或与地图区域相关的 2 个字母组合成的子选项。这些字母的取值与pstext
中对齐方式的取值相同,即[L|C|R][B|M|T]
第一个字母代表横坐标
<x>
,第二个字母代表纵坐标<y>
,如LB` 代表 地图的左下角。 在模块 ``grdcontour
中还可以使用子选项Z+
、Z-
代表网格数据中全局最大值点或最小值点的坐标。例如,直线段 lineLT/RB
代表地图左上角到右下角的对角线,Z-/135W/15S
代表网格数据中最小值点与 (135ºW, 15ºS)之间的直线段。- L:
除起点与终点之间的线段为大圆弧外,其余内容与子选项
l
相同。- n:
完整的语法为
n<number>[/<minlength>[c|i|p]]
沿等值线放置
<number>
个标注,即将等值线分割为<number>
段,标注位于每段的中心位置。还可以通过指定最小距离<minlength>
来保证相邻标注之间的距离不小于<minlength>
。- N:
完整的语法为
N<number>[/<minlength>[c|i|p]]
除标注位于每段终点位置外(
<number> >= 2
),与子选项n
类似。当 number=-1 时,标注位于等值线的起点;当 number=+1 时,标注位于等值线的终点。- x:
完整的语法为
x<cross.d>
ASCII 文件
<cross.d>
内给出了多段数据,这些线段与等值线的交点即是标注的位置。- X:
除了 ASCII 文件中定义的线段为大圆弧外,与子选项
x
的类似。
每调用一次等值线绘制模块,只能指定一种确定标注位置的算法。
标注的属性
确定标注的位置之后,还需要指定标注的属性。对于等值线绘制模块,在 -A
选项后以 +<code>[<参数>]
的格式定义不同的属性;对于线条绘制模块中,则是在 -Sq
选项后用冒号 :
来分隔标注的属性和标注的位置。
部分属性只能用于线条绘制模块,因此,首先列出了两个模块通用的属性。这些属性包括:
- +a:
控制标注的角度和线条的角度间的相互关系:
后面加上 n 表示二者相互垂直;
后面加上 p 表示二者之间相互平行,调用
grdcontour
模块时,还可以附加 u 或 d 表示标注的上边缘指向更高或更低的等值线;给定角度
<angle>
表示自水平方向开始逆时针方向旋转的角度
- +c:
每个标注周围存在一个假想的文本框,等值线在这个区域内是不可见的。默认的文本框精确的围限了标注,可以指定水平向和竖直向的间隙(相对于标注的基线)。若水平向和竖直向的间隙值不同,需要以斜杠分隔,可以在间隙值后附加长度单位(
c|i|m|p
),也可以指定间隙与标注所采用字体的百分比,默认值为 15% 。- +d:
Debug 模式。标注所在位置也会绘制等值线,用来测试等值线的位置。
- +d:
延迟模式, 延迟标注文字的绘制。
- +f:
指定标注文字的字体、大小和颜色等,可参考
pstext
。字体的默认值参见 FONT_ANNOT_PRIMARY 。- +g:
指定文本框的填充效果,颜色的默认值与 PS_PAGE_COLOR 相同。
- +j:
指定标注内容与标注位置之间的对齐方式,默认值为 CM ,指定值可以覆盖默认值,参数值由 2 个字母组成,取值范围分别为
[L|C|R][B|M|T]
。对于弯曲的标注文字 (+v),只有竖直向对齐方式起作用。- +o:
指定文本框的形状为圆角矩形,只有对文本框进行填充或显示轮廓时才起作用。对于弯曲的标注文字 (+v)不起作用。
- +p:
指定文本框轮廓线的线条属性,默认值为[0.25p,black] 。
- +r:
当曲率半径低于给定值时,不放置标注,可以指定曲率半径的单位,默认值为 0。
- +u:
在标注后加单位
<unit>
。通常在单位和标注之间有一个空格,若想去掉这个间隔,需要在单位前加连字符(-)。调用grdcontour
模块时,若给出这个属性,却不指定单位时,则使用网格头段中 z 值的单位。- +v:
根据线条摆动情况放置弯曲的标注,当标注长度较大时,该属性尤其有用。默认值为给定角度的不可见的直线段。
- +w:
标注所在位置处等值线的角度,是对附近的 width 个点,进行最小二乘拟合计算的,width 的默认值为 10。
- +=:
与 +u 非常相似,用于指定 prefix 的单位。
对于等值线绘制模块,标注的内容为等值线的数值(可以通过 +u 或 += 属性来修改)。对于线条绘制模块来说,还可以指定下述属性:
- +l:
在标注位置放置相同的内容,如果标注内容包含空格,则需要用引号括起来。
- +L:
通过附加 子选项 指定标注的内容,可用的子选项包括:
- +Lh:
采用多段数据的头记录作为标注内容(假设输入为多段数据,如果不是多段数据,则采用文件头记录)。首先扫描
-L<子选项>
属性,若没有指定该选项,则采用数据段头记录首字符(默认为 > )后的第一个单词。- +Ld:
采用笛卡尔坐标系内的距离作为标注内容的距离单位,可以指定单位,如
c|i|p
,默认值为 [ PROJ_LENGTH_UNIT ]。标注内容的格式参见:term:FORMAT_FLOAT_OUT 。- +LD:
采用真实地表距离计算标注内容,可以指定单位,如
d|e|f|k|m|M|n|s
,默认值为度 d 。- +Lf:
采用 ASCII 文件 fix.txt 中第 2 列数据之后的所有文字作为标注的内容,显然,该属性需要在指定标注位置算法(f) 的前提下,才能起作用。
- +Ln:
采用多段数据中当前数据段的顺序号作为标注内容。
- +LN:
采用斜杠分隔的文件号--当前数据段顺序号作为标注内容。
- +Lx:
与属性 h 类似,多段数据头记录的来源为 cross.d 文件。显然,该属性需要在指定标注位置算法(x|X)的前提下,才能起作用。
等值线标注位置实例
本节通过一些简单的实例说明等值线标注位置选项的作用。首先,在实例 1 中,采用部分全球大地水准面数据(geoid),绘制了等值线。所选择的区域包含了大地水准面的两级,Indian Low 和 New Guinea High。
等距离放置标注
第 1 个实例使用标注位置算法的默认值,沿等值线每 1.5 英寸放置一个标注:
#!/usr/bin/env bash gmt begin contour_annot1 gmt coast -R50/160/-15/15 -JM5.3i -Gburlywood -Sazure -A500 gmt grdcontour geoid.nc -B20f10 -BWSne -C10 -A20+f8p -Gd1.5i -S10 -T+lLH gmt end show
通过指定 -Gd 选项的参数,确定了标注的位置(等值线上相距 1.5 英寸的点)
现在指定每条等值线上标注的个数。每条等值线上只放置 1 个标注,并且要求等值线的长度不小于 1 英寸,
#!/usr/bin/env bash gmt begin contour_annot2 gmt coast -R50/160/-15/15 -JM5.3i -Gburlywood -Sazure -A500 gmt grdcontour geoid.nc -B20f10 -BWSne -C10 -A20+f8p -Gn1/1i -S10 -T+lLH gmt end show
通过指定 -Gn 选项的参数,确定了标注的位置(每条长度超过 1 英寸的等值线的中心位置)
给定标注所在位置的坐标,由于坐标不是严格位于等值线上,指定了非 0 距离值,即标注位置与等值线距离的上限。
根据等值线的几何形状,自动计算标注的角度。为了帮助理解,通过指定选项 -A 中的 +d* 属性,采用了 debug 模式,即在每个给定位置上绘制了一个小圆圈。
#!/usr/bin/env bash cat << EOF > fix.txt 80 -8.5 55 -7.5 102 0 130 10.5 EOF gmt begin contour_annot3 gmt coast -R50/160/-15/15 -JM5.3i -Gburlywood -Sazure -A500 gmt grdcontour geoid.nc -B20f10 -BWSne -C10 -A20+d+f8p -Gffix.txt/0.1i -S10 -T+lLH gmt end show
通过指定 -Gf 选项的参数,确定了标注的位置(等值线上与给定点距离最小的点)
通过指定 -Gl 或 -GL 选项的参数来定义线段,将标注放置在直线段与等值线的交点。
#!/usr/bin/env bash gmt begin contour_annot4 gmt coast -R50/160/-15/15 -JM5.3i -Gburlywood -Sazure -A500 gmt grdcontour geoid.nc -B20f10 -BWSne -C10 -A20+d+f8p -GLZ-/Z+ -S10 -T+lLH gmt end show
通过指定 -GL 选项的参数确定了标注的位置(大圆弧与等值线的交点)
如果需要指定的与等值线相交的线段比较多,或线段数据来自其他数据集,可以使用广义的相交算法确定标注的位置。多段数据文件 cross.txt 中定义了三条曲线,在这三条曲线与等值线交点位置处放置了标注,
#!/usr/bin/env bash gmt begin contour_annot5 gmt coast -R50/160/-15/15 -JM5.3i -Gburlywood -Sazure -A500 gmt grdcontour geoid.nc -B20f10 -BWSne -C10 -A20+d+f8p -GXcross.txt -S10 -T+lLH gmt end show
通过指定 -GX 选项的参数(多段数据文件 cross.txt ),确定了标注的位置
本节通过实例说明标注属性的作用,采用 plot
绘制了大地水准面极值点之间的大圆弧,并且沿着该大圆弧从 ETOPO5 数据集中提取了高程数据。高程数据文件(transect.txt)中包括了 经度、纬度、距离、大地水准面、高程 数据。
按照沿大圆弧距离放置标注-不透明文本框
在本实例中将标注的走向从沿大圆弧改变为跨大圆弧,并指定了不透明的文本框和轮廓线,增加了标注的可读性。沿大圆弧每 1000km 放置一个标注,使用距离值作为标注的内容。标注的方向与大圆弧垂直:
#!/usr/bin/env bash gmt begin contour_annot6 gmt coast -R50/160/-15/15 -JM5.3i -Gburlywood -Sazure -A500 gmt grdcontour geoid.nc -B20f10 -BWSne -C10 -A20+d+f8p -Gl50/10S/160/10S -S10 -T+l gmt plot -SqD1000k:+g+LD+an+p -Wthick transect.txt gmt end show
通过指定 -Sq 选项的参数控制标注属性.
与上一个实例不同的是,本实例中标注与大圆弧平行,以度指定标注位置,并添加度单位。文本框的形状为圆角矩形,且标注内容与文本框的底色呈反色显示。
#!/usr/bin/env bash gmt begin contour_annot7 gmt coast -R50/160/-15/15 -JM5.3i -Gburlywood -Sazure -A500 gmt grdcontour geoid.nc -B20f10 -BWSne -C10 -A20+d+u" m"+f8p -Gl50/10S/160/10S -S10 -T+l gmt plot -SqD15d:+gblack+fwhite+LD+o+u\\260 -Wthick transect.txt gmt end show
另一个标注属性实例
本实例中采用沿大圆弧的海底地形数据作为标注的内容,按照沿大圆弧的距离,每 1500km 放置一个标注。因此需要使用 awk 程序从 transect.txt 文件中抽取距离为 1500km 倍数的记录,并创建一个新文件,指定标注的位置和内容:
#!/usr/bin/env bash gmt begin contour_annot8 gmt convert -i0,1,4 -Em150 transect.txt | gawk '{print $1,$2,int($3)}' > fix2.txt gmt coast -R50/160/-15/15 -JM5.3i -Gburlywood -Sazure -A500 gmt grdcontour geoid.nc -B20f10 -BWSne -C10 -A20+d+u" m"+f8p -Gl50/10S/160/10S -S10 -T+l gmt plot -Sqffix2.txt:+g+an+p+Lf+u" m"+f8p -Wthick transect.txt gmt end show
标注的位置和内容来自不同的数据集
最后,采用之前章节中论述的多个标注位置确定方法和属性设置,绘制了一幅比较复杂的综合性图件。假设在 Canary Islands 发生了灾难性滑坡,图件显示了所引发的的海啸的走时(以小时为单位)。根据海啸走时和海底地形绘制了彩图,对等值线和线条进行了标注。完整的脚本如下:
#!/usr/bin/env bash gmt begin contour_annot_9 R=-R-85/5/10/55 gmt grdgradient @earth_relief_05m_g $R -Nt1 -A45 -Gtopo5_int.nc gmt set FORMAT_GEO_MAP ddd:mm:ssF FONT_ANNOT_PRIMARY +9p FONT_TITLE 22p gmt project -E-74/41 -C-17/28 -G10 -Q > great_NY_Canaries.txt gmt project -E-74/41 -C2.33/48.87 -G100 -Q > great_NY_Paris.txt km=$(echo -17 28 | gmt mapproject -G-74/41+uk -fg --FORMAT_FLOAT_OUT=%.0f -o2) gmt makecpt -Clightred,lightyellow,lightgreen -T0,3,6,100 -N gmt grdimage @App_O_ttt.nc -Itopo5_int.nc -C $R -JM5.3i -nc+t1 gmt grdcontour @App_O_ttt.nc -C0.5 -A1+u" hour"+v+f8p,Bookman-Demi \ -GL80W/31N/17W/26N,17W/28N/17W/50N -S2 gmt plot -Wfatter,white great_NY_Canaries.txt gmt coast -B20f5 -BWSne+t"Tsunami travel times from the Canaries" -N1/thick \ -Glightgray -Wfaint -A500 gmt convert great_NY_*.txt -E | gmt plot $R -Sa0.15i -Gred -Wthin gmt plot -Wthick great_NY_Canaries.txt \ -Sqn1:+f8p,Times-Italic+l"Distance Canaries to New York = $km km"+ap+v gmt plot great_NY_Paris.txt -Sc0.08c -Gblack gmt plot -Wthinner great_NY_Paris.txt -SqD1000k:+an+o+gblue+LDk+f7p,Helvetica-Bold,white cat << EOF | gmt text -Gwhite -Wthin -Dj0.1i -F+f8p,Bookman-Demi+j 74W 41N RT New York 2.33E 48.87N CT Paris 17W 28N CT Canaries EOF gmt end show
Canary Islands 到大西洋沿岸的海啸走时图,特别是纽约。当发生灾难性滑坡时,纽约将在 8 小时后遭遇大海啸。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论