如何使用GDAL直接向Zip归档写入栅格文件?
解决GDAL直接写入/vsizip/虚拟文件系统的问题
我太懂你这种碰壁的感觉了——GDAL 2.2开始支持/vsizip/虚拟文件系统读取Zip归档数据,但直接写入这块不仅文档稀少,踩坑还特别多。你之前写的代码报错AttributeError: 'NoneType' object has no attribute 'GetRasterBand',核心原因其实是GTiff驱动需要随机读写权限,而/vsizip/目前不支持对Zip内文件进行这种操作,导致driver.Create()直接返回了None。
而且你明确说了不想用“先写临时文件再复制到归档”的workaround,毕竟那样直接用zipfile就行,你的真实需求是把MODIS HDF里的数值栅格子数据集直接写入Zip归档。
最终可行方案:用gdal.Translate配合流式输出参数
通过给gdal.Translate加上STREAMABLE_OUTPUT=TRUE的创建选项,就能绕开随机读写的限制,直接把HDF子数据集写入Zip归档里的栅格文件。具体代码如下:
import gdal # 1. 打开MODIS HDF文件并获取目标子数据集 hdf_dataset = gdal.Open('your_modis_data.hdf') # 这里替换成你实际需要的子数据集索引,比如[0][0]是第一个子数据集 subdataset_path = hdf_dataset.GetSubDatasets()[0][0] # 2. 直接将子数据集写入Zip归档内的TIFF文件 output_zip_raster = '/vsizip/test.zip/modis_subset.tif' translate_options = gdal.TranslateOptions( creationOptions=['STREAMABLE_OUTPUT=TRUE'], format='GTiff' ) gdal.Translate(output_zip_raster, subdataset_path, options=translate_options) # 3. 清理资源,避免内存泄漏 hdf_dataset = None
为什么这个方案能行?
STREAMABLE_OUTPUT=TRUE会强制GTiff驱动以流式写入的方式生成文件,不需要随机读写权限,刚好适配/vsizip/虚拟文件系统的写入特性。- 整个过程不需要任何临时文件,直接完成从HDF子数据集到Zip内栅格文件的转换,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者Val
相关产品推荐
相关产品推荐

