Как правильно использовать gdaladdo в программе Python?

Мой вопрос касается инструмента GDAL (библиотека абстракции геопространственных данных) с именем gdaladdo. Этот инструмент предназначен для создания обзорных изображений из файла .tif. Из документации, которую я нашел на нем, я вижу, что он обычно вводится в командной строке. Я пытался найти способ запустить его через мою программу Python, потому что у меня есть несколько тысяч изображений .tif, которые нуждаются во внешних обзорах. Моя конечная цель с этой программой - передать ей изображение .tif и создать для него пирамиду .rrd. Вот мой код:

import gdal
import os
from subprocess import call

#Define gdaladdo
gdaladdoFile = 'C:\Program Files (x86)\GDAL\gdaladdo.exe'

#--------------------------------------------------------

os.chdir("Images")

openfile = open('imagenames.txt', 'r')

if {openfile.closed == False}:
    count = 0
    while count < 5:
        #Grab the image to work with
        filename = openfile.readline()

        #Strip off the newline
        filename.rstrip('\n')

        #Create pyramid
        call([gdaladdoFile, '-ro', '--config USE_RRD YES', 'filename', '2 4 8 16'])
        count += 1
    openfile.close()

else:
    print "No file to open!"

Я получаю ошибки, относящиеся к строке call([gdaladdoFile, '-ro', '--config USE_RRD YES', 'filename', '2 4 8 16']). При обычном вводе этой команды в командной строке она должна выглядеть так: 'gdaladdo -ro --config COMPRESS_OVERVIEW DEFLATE erdas.img 2 4 8 16', но Python говорит параметры (например, --config USE_RRD YES) имеют неверный синтаксис. Поэтому я последовал примеру передачи аргументов подпроцессу (который я нашел здесь) и поместил параметры в одинарные кавычки и добавил запятые после каждого. Синтаксические ошибки исчезают, но появляются новые, когда я запускаю программу для ее проверки. В окне командной строки написано «ОШИБКА: неизвестное имя параметра — config USE_RRD YES». Как мне изменить эту конкретную строку, чтобы она делала то, что мне нужно?

Я новичок в stackoverflow и все еще изучаю программирование в колледже, поэтому, пожалуйста, простите мое невежество и будьте со мной нежны. Заранее благодарим вас за помощь в решении этой проблемы.

ссылка на gdaladdo, если это необходимо.


person Aizenmyouou    schedule 15.10.2015    source источник
comment
Вы пытались разделить --config USE_RRD YES на три отдельных элемента списка? т.е. '--config','USE_RRD','YES'? Кроме того, я не знаю, заметили ли вы это, но вы передаете строку «имя файла» вместо переменной filename   -  person R Nar    schedule 16.10.2015
comment
@RNar Я попробовал это только сейчас, и теперь командная строка выдает мне разные ошибки. Во-первых, это связано с изменением моего каталога (которое я только что исправил, чтобы быть более понятным), а теперь он жалуется, что мои изображения не существуют, когда они действительно существуют. Когда я разберусь со всеми этими странными ошибками, я дам вам знать, если ваше предложение решит мою настоящую проблему. Спасибо за идею!   -  person Aizenmyouou    schedule 16.10.2015
comment
@RNar Еще раз спасибо за ваше предложение. Это решило мою проблему, и я, наконец, сгенерировал файл! Задача решена.   -  person Aizenmyouou    schedule 16.10.2015


Ответы (2)


Чтобы избежать использования модуля подпроцесса Python, вы можете использовать функцию BuildOverviews с API Python:

from osgeo import gdal
Image = gdal.Open('ImageName.tif', 0)  # 0 = read-only, 1 = read-write.
gdal.SetConfigOption('COMPRESS_OVERVIEW', 'DEFLATE')
Image.BuildOverviews('NEAREST', [4, 8, 16, 32, 64, 128], gdal.TermProgress_nocb)
del Image  # close the dataset (Python object and pointers)

Когда вы читаете изображение .tiff в режиме только для чтения, оно создает внешние обзоры в файле .ovr. И наоборот, если вы откроете образ в режиме чтения-записи, будут созданы внутренние обзоры.

person Osian    schedule 20.06.2018
comment
Я пытаюсь создать внутренние обзоры с помощью этого метода, но, похоже, он по-прежнему создает внешний файл .ovr, даже когда я устанавливаю 1 для чтения и записи. Любые идеи? Спасибо - person fpolig01; 30.03.2020
comment
@fpolig01: Странно, должно работать. Вы можете попробовать использовать gdal.Open(fname, gdal.GA_ReadWrite). Возможно, вы ранее открывали файл в режиме только для чтения где-то в своем скрипте Python? В этом случае вам нужно будет правильно закрыть набор данных (например, используя del Image или Image = None), а затем снова открыть его в режиме чтения-записи. - person Osian; 01.04.2020
comment
Спасибо за ответ. На самом деле я пробовал gdal.Open(fname, gdal.GA_ReadWrite). Я попробую метод del image, чтобы посмотреть, поможет ли это. Это единственная операция, которую я пытаюсь выполнить в коде, поэтому перед ней ничего нет. Я также разместил об этом здесь - stackoverflow.com/questions/60954617/ Спасибо за помощь - person fpolig01; 01.04.2020

Изменение строки кода из этого:

call([gdaladdoFile, '-ro', '--config USE_RRD YES', 'filename', '2 4 8 16'])

К этому:

call([gdaladdoFile, '-ro', '--config', 'USE_RRD', 'YES', filename, '2 4 8 16'])

Решил мою проблему!

person Aizenmyouou    schedule 16.10.2015
comment
В моем случае (Windows 7, Python 3.6, GDAL 2.2.1) работала только следующая входная последовательность [gdaladdoFile, '-ro', '--config', 'USE_RRD', 'YES', filename, '2', '4', '8', '16'] - person Vladimir; 09.08.2017