GDAL:写入zip存档

时间:2018-05-29 13:05:26

标签: python gdal

我知道从2.2版本开始,rv <- reactiveValues(loading = 0) # When you click submit, show the loading screen observeEvent(input$submit, {rv$loading <- 1}) # When you click LOAD, start loading, then hide the loading screen when finished observeEvent(input$LOAD, { # CODE TO LOAD AND GENERATE DATA HERE rv$loading <- 0}) 具有虚拟文件系统驱动程序,例如gdal用于访问/vsizip/档案。

以前我能够从zip档案中读取,但我没有设法写给他们(我猜也应该这样)。我也没有找到太多关于此的文档。

这就是我的尝试:

zip

但我总是收到

  

AttributeError:'NoneType'对象没有属性'GetRasterBand'

修改

根据Gabriella Giordano的建议更新了剪辑。

编辑2

Gabriella指出import gdal from zipfile import ZipFile import numpy as np with ZipFile('test.zip','a') as zfile: driver = gdal.GetDriverByName('GTiff') raster = driver.Create('/vsizip/test.zip/testraster.tif',10,10, 1, gdal.GDT_Float32) raster.GetRasterBand(1).writeArray(np.random.random(10,10)) raster = None 驱动程序同时需要读写访问权限,这是(当前?)不支持。

建议的解决方法是创建临时文件,然后将其复制到存档中。

我真的很想在档案馆中直接创建一个光栅文件(不一定是tiff)。如果我想复制它们,我不妨使用GTiff等。

有什么想法吗?

编辑3

完全披露*,这正是我想要实现的目标:

我有MODIS zipfile文件,我想直接将值raster subatasets保存到zip存档中。

解决方案

我终于凭借Gabriella的出色见解做到了这一点。

我最终使用hdf传入gdal.Translate

options

*我不认为这是相关的信息,但加布里埃拉的回答让我觉得它是。

1 个答案:

答案 0 :(得分:2)

我不是真的精通python,但数据集创建可能会失败,因为你没有设置band数。

试试这个:

raster = driver.Create('/vsizip/test.zip/testraster.tif',10,10, 1, gdal.GDT_Float32)

使用所需数量的波段更改1。

您可以找到创建here的完整参数列表。

编辑:

找到问题的可能原因(以及可能的解决方法)here。正如此link所报告的那样,显然Create的开放模式与vsizip虚拟文件系统不兼容。

编辑2

这不是您使用的驱动程序(例如GeoTiff)的问题,而是虚拟文件系统本身的问题。 Create调用尝试以读/写模式打开文件,因为出于性能原因,GDAL将文件系统用作缓存,而不仅仅是存储。但在这种情况下,虚拟vsizip文件系统不允许同时从文件读取和写入,因为它不支持随机访问。

vsizip vfs确实提供了单独的动态读写,因为它在后台为您压缩/解压缩数据。这意味着您无法来回跳转(如在读/写打开模式下请求的随机访问模式),因为您在磁盘上写入的内容(压缩数据)与最终读取的内容(未压缩数据)不同。

编辑3

我发现使用虚拟文件系统时,gdal命令行工具(如gdal_translate或gdal_warp)会自动设置'STREAMABLE_OUTPUT = TRUE' 。可流式文件格式强制执行只写策略,该策略应符合非随机访问文件系统。您可以将此选项设置为Create调用的附加参数。我的有限python功能再次阻止我提供一个工作片段。

请注意, steamable 也意味着您可以对数据集执行的操作类型有一些限制,因此这可能无法解决您的问题,但知道它很有用反正...