矢栅处理(2):GeoTIFF数值类型及压缩

小结读写tif文件之前,先总结一下tif文件数值类型以及压缩的必要性和方法。

numpy数值类型

numpy数据类型dtype, 表示为,np.uint8; np.bool_; np.complex64

  • int8, int16, int32, int64; uint16, uint16, uint32, uint64;(无符号即大于等于0)
  • float16, float32, float64

tif数值类型

1MB=1024KB 1KB=1024B 1B=8bit, 1B*3000w/1024/1024=28.6

数据类型主要包括整型和浮点,其中整型还包括无符号整型,各类型占用空间的大小见下表

  • 以一张中国0.01°×0.01°格网的geotif(约)为例:宽6160×高4974约3000w个格点,
  • 如果文件不压缩会很大,大量的空值也会占据空间,因此压缩是必要的。
  • numpy矩阵本身的保存也很大,而通过h5等文件格式能够较好的用于数据存储并节约内存!
数据类型 单个占用空间(bytes/B) 数值范围 数组大小 TIFF大小(不压缩)
uint8 1 0~255(2^8-1) 29MB 29.8MB
int8 1 -128~127 29MB 29.8MB
int16 2 -32768-32767 58MB 59.7MB
int32 4 ... 116MB 2.4MB(Lzw压缩)
int64 8 ... 233MB ...
float16 2 10 个尾数位 58MB ...
float32 4 32 个尾数位 116MB 119MB

压缩方式

图像/光栅文件大量冗余使得压缩可以大量减少其空间,便于数据交换和临时存储,且压缩并不会对影响数据。

测试结果仅供参考。图像压缩的方式有很多,这里仅比较几个GeoTIFF中常用的三种无损压缩算法以及较新的ZSTD(facabook, 2016),以int32 geotiff文件为例,目前看性价比最高的是Deflate,然后是LZW:

  • 压缩会减少数据占用空间,但会增加读取和写入数据的时间
  • 压缩的越多压缩所需要的时间越长,时间参考(%%timmit)
  • 通过某些操作如增大GDAL的块缓存可以缩小写入时间,在此不做考虑
压缩方式 压缩/写出速度 压缩比例 压缩后 读取速度
PACKBITS 最快;199ms 5.91MB 127ms
LZW 中;441ms 2.41MB 205ms
DEFLATE 慢;570ms 1.87MB 140ms
ZSTD 最慢;2340ms 最大 1.76MB 191ms

时间测试代码示例 (10 loops each)

1
2
3
4
%%timeit
file = '...tif'
ds = gdal.Open(file)
im_data = ds.ReadAsArray()