GDAL: написать в zip архив - PullRequest
0 голосов
/ 29 мая 2018

Я знаю, что начиная с версии 2.2, gdal имеет драйверы виртуальной файловой системы, например, /vsizip/ для доступа к zip архивам.

Раньше я мог читать из zip архивов, ноМне не удалось написать им (что также должно быть возможно, я думаю).Я также не нашел много документации по этому поводу.

Вот что я пробовал:

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

Но я всегда получаю

AttributeError: 'NoneType 'объект не имеет атрибута' GetRasterBand '

РЕДАКТИРОВАТЬ:

Обновлен отсканировано в соответствии с предложением Габриэллы Джордано.

РЕДАКТИРОВАТЬ 2 :

Габриэлла указала, что драйверу GTiff требуется доступ как для чтения, так и для записи одновременно, что (в настоящее время?) Не поддерживается.

Предложенный обходной путь - создать временный файл и затем скопировать его в архив.

Я действительно заинтересован в том, чтобы напрямую создать растровый файл (не должен быть переплетением) внутри архива.Если бы я хотел скопировать их, я мог бы также использовать zipfile или подобное.

Любые идеи?

РЕДАКТИРОВАТЬ 3 :

Полныйраскрытие *, вот чего я пытаюсь достичь:

У меня есть файлы MODIS hdf, и я хочу напрямую сохранить растровые поднаборы значений в zip-архив.

Решение :

Мне наконец удалось сделать это с превосходной проницательностью от Габриэллы.

В итоге я использовал gdal.Translate с этимпередал options:

gdal.TranslateOptions(creationOptions=['STREAMABLE_OUTPUT=TRUE'])


* Я не думал, что это была уместная информация, но ответ Габриэлы заставляет меня думать, что это так.

1 Ответ

0 голосов
/ 31 мая 2018

Я не очень хорошо разбираюсь в python, но создание набора данных, вероятно, не удается, потому что вы не устанавливаете количество полос.

Попробуйте:

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

Измените 1 на нужное количество полос.

Полный список аргументов Create вы можете найти здесь .

РЕДАКТИРОВАТЬ:

Найдена возможная причина проблемы (и возможный обходной путь) здесь .Как сообщается по этой ссылке , очевидно, что открытый режим Create несовместим с виртуальной файловой системой vsizip.

Edit 2

Это не проблема используемого вами драйвера(например, GeoTiff), но проблема самой виртуальной файловой системы.Вызов Create пытается открыть файл в режиме чтения и записи, поскольку GDAL использует файловую систему в качестве кэша по соображениям производительности, а не только для хранения.Но в этом случае виртуальная файловая система vsizip не позволяет одновременно выполнять чтение и запись из файла, поскольку она не поддерживает произвольный доступ.

vsizip vfs действительно обеспечивает чтение и запись на лету отдельно, потому что он сжимает / распаковывает данные для вас в фоновом режиме.Это означает, что вы не можете переходить назад и вперед (как в режиме произвольного доступа, запрошенном для режима чтения / записи), потому что то, что вы записываете на диск (сжатые данные), отличается от того, что вы в конечном итоге могли прочитать (несжатые данные).

Редактировать 3

Я обнаружил, что инструменты командной строки gdal (такие как gdal_translate или gdal_warp) устанавливают 'STREAMABLE_OUTPUT = TRUE' автоматически при работе с виртуальными файловыми системами.Формат файла streamable обеспечивает применение политики «Только запись», которая должна соответствовать файловым системам без произвольного доступа.Вы можете установить эту опцию в качестве дополнительного параметра для вызова Create.Опять же, мои ограниченные возможности Python мешают мне предоставить рабочий фрагмент.

Пожалуйста, учтите, что steamable также подразумевает некоторое ограничение на тип операций, которые вы можете выполнять с набором данных, так что это, вероятно, не решит вашу проблему, но это полезновсе равно знать ...

...