Страница 1 из 1

ERROR 1: TIFFFetchDirectory:./L5171021_02120110811_B30.TIF:

Добавлено: 29 фев 2012, 15:59
sergei-kzn
Прив всем! У меня возникла проблема, гугл пока ничего не подсказал.
Я пишу скрипт реализующий алгоритм i.landsat.acca из grass, на определенном этапе пришлось разделить преобразование данных (расчет planetary spectral reflectance) и собственно алгоритм. Преобразование выполняет отдельный скрипт на python, он просто открывает исходные данные, кусками преобразует, склеивает и пишет назад в файл, который сам же и создает. Само преобразование уже отлажено и на выходе получается правильный растр в формате массива numpy. Возникла проблема с записью в файл. По невнимательности я создавал новый файл используя CreateCopy, ошибок не было, но естественно в файле были неправильные данные, тк в оригинале был GDT_Byte, а на выходе должно быть GDT_float32. Переделал создание файла (само создание, перенос метаданных) по примеру: http://gis-lab.info/qa/gdal-python.html
в принципе оно может и работает, но на втором-третьем файле (из пачки снимков landsat) валится.
ругается так:
ERROR 1: TIFFFetchDirectory:./L5171021_02120110811_B30.TIF: Can not read TIFF directory count
ERROR 1: TIFFReadDirectory:Failed to read directory at offset 8
ERROR 1: TIFFWriteEncodedStrip:Must set "ImageWidth" before writing data
ERROR 1: TIFFWriteEncodedStrip:Must set "ImageWidth" before writing data
...
ERROR 1: TIFFWriteEncodedStrip:Must set "ImageWidth" before writing data
ERROR 1: TIFFWriteEncodedStrip:Must set "ImageWidth" before writing data
More than 1000 errors or warnings have been reported. No more will be reported from now.
Ошибка сегментирования
Собственно вопрос, в чем дело?
зы создание файла:

Код: Выделить всё

for i in range(0,5):
        projection=gdalData[i].GetProjection()
        transform=gdalData[i].GetGeoTransform()
        xsize=gdalData[i].RasterXSize
        ysize=gdalData[i].RasterYSize
        drvMeta=driver.GetMetadata()
        if drvMeta.has_key( gdal.DCAP_CREATE ) and drvMeta[ gdal.DCAP_CREATE ] == "YES":
            gdalDataOut.append(driver.Create(metadata["PATH"]+'/'+os.path.basename(metadata["BAND"+str(i+2)+"_FILE_NAME"]), xsize, ysize, 1, gdal.GDT_Float32))
            gdalDataOut[i].SetProjection(projection)
            gdalDataOut[i].SetGeoTransform(transform)
        else:
            print "INFO: Driver %s does not support Create() method." % format
            sys.exit(-1)
Запись и закрытие файла:

Код: Выделить всё

gdalDataOut[band_i].GetRasterBand(1).WriteArray(band_c[0])
        gdalDataOut[band_i]=None
ззы было подозрение на нехватку памяти, но её достаточно, хоть и в своп используется.

Re: ERROR 1: TIFFFetchDirectory:./L5171021_02120110811_B30.T

Добавлено: 29 фев 2012, 16:11
Voltron
А не может быть такого, что в какой-то момент у вас в xsize и ysize нули?

Re: ERROR 1: TIFFFetchDirectory:./L5171021_02120110811_B30.T

Добавлено: 29 фев 2012, 16:14
sergei-kzn
сейчас проверю, но вроде как после вызова Create уже по барабану что там, главное в момент вызова нужные данные передать (тут же значение передается, а не ссылка/кортеж/массив/и тд). Да и в принципе они не меняются до следующего шага.
сейчас проверю.
-----------------------------
в момент вызова Create xsize и ysize правильные

Re: ERROR 1: TIFFFetchDirectory:./L5171021_02120110811_B30.T

Добавлено: 01 мар 2012, 11:14
sergei-kzn
обнаружил интересную вещь, в репах debian крайняя версия gdal 1.6, ближе к вечеру попробую обновится и посмотреть что получится.

Re: ERROR 1: TIFFFetchDirectory:./L5171021_02120110811_B30.T

Добавлено: 01 мар 2012, 23:25
sergei-kzn
обновился, все то же. в чем косяк может быть?

Re: ERROR 1: TIFFFetchDirectory:./L5171021_02120110811_B30.T

Добавлено: 02 мар 2012, 15:29
sergei-kzn
хм, такое ощущение что writearray возвращает управление не завершив запись в файл. если сделать паузы, то запись нормально завершается, в следующей итерации растр уничтожается и создается новый, и видимо так получалось, что он удалялся, а запись не успевала завершится.
где можно почитать как питон с памятью работает? в частности raster=[] с точки зрения си просто убивает указатель на область памяти, которая выделена приложению - утечка памяти. а как питон обрабатывает такие операции?

Re: ERROR 1: TIFFFetchDirectory:./L5171021_02120110811_B30.T

Добавлено: 02 мар 2012, 15:34
rhot