背景
一些做遥感数据的公司,随着数据越来越多,所占的空间也越来越大。对遥感影像进行无损压缩可以有效的节省空间,同时在操作影像时也可以节省内存。在网上搜索了遥感影像压缩的相关代码,发现都是基于C++写的,没有python的,GDAL的python API文档里也没有这块的详细描述,这里我就记录一下如何使用python和GDAL实现遥感影像的无损压缩。
代码
主要是使用GDAL的CreateCopy 方法
# from common import gdalfun
import os
from osgeo import gdal
def get_file_size(file_path):
"""获取文件占空间所少M"""
fsize = os.path.getsize(file_path)
fsize = fsize / float(1024 * 1024)
return round(fsize, 2)
def progress(percent, msg, tag):
"""进度回调函数"""
print(percent, msg, tag)
def compress(path, target_path):
"""使用gdal进行文件压缩"""
dataset = gdal.Open(path)
driver = gdal.GetDriverByName('GTiff')
driver.CreateCopy(target_path, dataset, strict=1, callback=progress, options=["TILED=YES", "COMPRESS=LZW"])
# strict=1表示和原来的影像严格一致,0表示可以有所调整
# callback为进度回调函数
# PACKBITS快速无损压缩,基于流
# LZW针对像素点,黑白图像效果好
del dataset
source_path = "G:\\孟津提供\\孟津影像\\孟津0312.dat"
target_path = "G:\\孟津提供\\孟津影像\\孟津0312_copy2.dat"
print("处理前", str(get_file_size(source_path)) + "MB")
compress(source_path, target_path)
print("处理后", str(get_file_size(target_path)) + "MB")
控制台输出显示
处理前 252.45MB
0.0 None
0.010009765625 None
0.02001953125 None
0.030008951822916664 None
.........
.........
0.9400436046511628 None
0.9500363372093024 None
1.0 None
处理后 121.41MB
打开测试
使用ArcGIS打开处理前后的影像进行对比,没有任何变化
处理前
处理后
压缩前属性
压缩后属性