绘制前的处理 卫星遥感影像一般是Geotif格式,UTM笛卡尔数学投影,灰度值一般是Float32类型,而GMT不支持Float32类型,此外高分影像分辨率可到m级,绘图所占存储非常大。所以需要做的是
将Float32转为Byte格式。 
将影像降低分辨率 如果整幅区域过大,则还需要裁剪出目标区域: 
裁剪影像 如果不希望绘图使用UTM坐标,而偏向于使用WGS-84椭球经纬度,则进行坐标转换 
坐标转换 
 
上述预处理完全使用GMT内置的gdal工具包。如果因版本问题,GMT不带有gdal,则手动下载gdal即可。GDAL在window和linux通用,使用方法:
1 2 3 4 5 6 7 8 9 # Prepare # 1 -Transform from  UTM to WGS-84  latitude/longitude gdalwarp -t_srs EPSG:4326  name.tif name_wgs.tif # 2 - resample Geotif to 90 m resolution(0.00075  degree) gdal_translate -tr 0.00075  0.00075   -r average -ot Float32  -co COMPRESS=LZW -q name_wgs.tif name_wgs_low.tif # 3 -Transform the DoubleFloat format to byte format. gdal_translate -ot Byte -q -scale 0  1  0  255  name_wgs_low.tif name_wgs_lowbyte.tif # 4 -Crop (Can do  first) gdalwarp -t_srs EPSG:4326  -te 115.8152  35.4555  116.0756  35.7101  name.tif name_out.tif 
 
GMT也默认打爆了GDAL一些程序,但是这些程序不完整,仅能实现一些基本读写。坐标转换等工作需要独立安装gdal,官网建议是使用conda安装,安装之后,不仅可以使用python调用代码,也可以调用exe程序。
 
RGB真彩色绘制 完成预处理后,添加真彩色的绘图仅需一行:
1 gmt  grdimage area_cal_low_byte.tif+b2,1 ,0  -J$J  -R$R  -K -O >> $PS 
 
需要注意的是,+b2,1,0表示波段的顺序,红绿蓝三个波段的叠加产生真彩色,其顺序不可颠倒,波段的编号和具体卫星有关,需要提前查找准确。
添加无坐标图片 有时候(审稿人)可能要求在地图上加一个图片表达,图片没有坐标,可通过相对位置插入:
1 gmt psimage gnss2.jpg -Dx0.2 /0.1 +w1.5 c -O -K >> $PS 
 
绘制小地图 在大比例尺的地图上添加一个小比例尺的位置指示地图是常用做法,也很简单:
1 2 gmt pscoast -Rg -JG120/41 /1 c  -Dc -A5000 -Gpink -Swhite  -O -X2.5 c -Y2.1 c -K >>$PS echo  120 :26 :30  36 :02 :57  | gmt psxy -Sa0.1 c -Gred -R -J -O  >> $PS 
 
例子结果 
数据获取 回复本公众号0227,可以获得卫星遥感的绘图代码和示例数据(还有原始的练习数据:山东郓城县2020年Landsat8遥感影像)。
全部代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 #!/bin/bash R=120 :22 /120 :33 /35 :57 /36 :05  J=m120:30 /36 /1 :500000  # Here use the map scale not  the absolute width in  map projection. This will allow the line width in  cm unit connected to the geographical units km. PS=map.ps gmt gmtset  FORMAT_GEO_MAP = ddd:mm:ssF MAP_FRAME_PEN 0.010 c gmt gmtset FONT_ANNOT_PRIMARY	= 3 p gmt gmtset FONT_LABEL 7  MAP_LABEL_OFFSET 5 p MAP_ANNOT_OBLIQUE=42  gmt gmtset MAP_FRAME_TYPE plain MAP_TICK_LENGTH_PRIMARY 5 p  MAP_FRAME_PEN black gmt psbasemap -R$R -J$J -P -K  -Bpxa5mf -Bpya5mf -BnWSe >$PS # Add image.  gmt grdimage area_cal_low_byte.tif+b2,1 ,0  -J$J -R$R -K -O >> $PS gmt pscoast -R$R -J$J -O  -W -I1 -K  -Lx1.0 i/0.15 i+c120/36 +w5k >> $PS awk '{print $1, $2}'  track.dat | gmt psxy -W0.2 c,black -R$R -J$J -P -O -K -t70 >> $PS awk '{print $1, $2}'  track.dat | gmt psxy -W0.01 c,black+ve0.1 i+gblue -R$R -J$J -P -O -K  >> $PS angle=`gmt mapproject -R$R -J$J -Af  track.dat | gmt gmtmath STDIN -i2 -Sl MEAN 360  SUB 90  SUB NEG =` echo "angle:" $angle awk 'NR==3 {print $1, $2}'  buoy.txt | gmt psxy -Sa0.1 c -Gred -R$R -J$J -P -O -K >> $PS awk 'NR==3 {print $1, $2,"XMD"}'  buoy.txt |  gmt pstext -F+f4p,1 ,black+a$angle+jRB -R$R -J$J -O -N -K -D0./0.1  -Gwhite >> $PS echo  120 :26 :30  36 :02 :57  | gmt psxy -Sc0.1 c -Gred -R$R -J$J -O -K >> $PS echo  120 :26 :30  36 :02 :57  "Wave Buoy" |  gmt pstext  -F+f4p,1 ,red+a$angle+jLB -R$R -J$J -O -N -K -D0.1 /0.0  -Gwhite >> $PS echo  120 :26 :8.53  36 :2 :59  "GNSS Buoy@-2@-@" |  gmt pstext  -F+f4p,1 ,black+a$angle+jLT -R$R -J$J -O -N -K -D0./-0.1  -Gwhite >> $PS echo  120 :30 :41.03  36 :1 :36.69  "GNSS Buoy@-1@-@" |  gmt pstext -F+a$angle+f4p,1 ,black+jLB -R$R -J$J -O -N -K -D0.1 /0.  -Gwhite >> $PS echo  120 :26 :8.53  36 :2 :59  | gmt psxy -Sc0.1 c -Gyellow -R$R -J$J -O -K >> $PS echo  120 :31 :38.03  36 :1 :1.69  | gmt psxy -Sc0.1 c -Gyellow -R$R -J$J -O -K>> $PS # Add jpg gmt psimage gnss2.jpg -Dx0.2 /0.1 +w1.5 c -O -K >> $PS # Add small map in  Up-Right corner gmt pscoast -Rg -JG120/41 /1 c  -Dc -A5000 -Gpink -Swhite  -O -X2.5 c -Y2.1 c -K >>$PS echo  120 :26 :30  36 :02 :57  | gmt psxy -Sa0.1 c -Gred -R -J -O  >> $PS gmt psconvert $PS -A -P -Tf