绘制前的处理 卫星遥感影像一般是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