矢栅处理(2):GeoTIFF数值类型及压缩
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 | %%timeit |