Пітонний еквівалент gdalbuildvrt


12

Чи є спосіб виконати те саме завдання, що й утиліта gdalbuildvrt, використовуючи прив’язки GDAL Python? Поки що я не знайшов іншого способу зробити це, окрім як створити сад одного набору даних та вручну редагувати xml. Я хотів би створити сад з декількох растрових (по суті виконують мозаїку). Це можливо за допомогою чистого Python? Мій інший варіант - використовувати підпроцес, щоб просто викликати gdalbuildvrt.

Відповіді:


10

Чесно кажучи, це простіше зробити за допомогою gdalbuildvrt в a subprocessабо os.system.

Якщо ви хочете зробити це через Python, це можна зробити. Використовуючи стандартні методи створення наборів даних у GDAL Python, ми можемо легко створити базовий VRT бази даних .

from osgeo import gdal

drv = gdal.GetDriverByName("VRT")
vrt = drv.Create("test.vrt", x_size, y_size, 0)

Зауважте, що ми спочатку створюємо набір даних без смуг. З документації на VRT, що набори даних VRT є одним з небагатьох типів набору даних, який може приймати AddBandаргументи.

vrt.AddBand(gdal.GDT_Float32)
band = vrt.GetRasterBand(1)

Тепер для кожного діапазону ми повинні встановити елементи метаданих вручну:

simple_source = '<SourceFilename relativeToVRT="1">%s</SourceFilename>' % source_path + \
    '<SourceBand>%i</SourceBand>' % source_band + \
    '<SourceProperties RasterXSize="%i" RasterYSize="%i" DataType="Real" BlockXSize="%i" BlockYSize="%i"/>' % (x_size, y_size, x_block, y_block) + \
    '<SrcRect xOff="%i" yOff="%i" xSize="%i" ySize="%i"/>' % (x_offset, y_offset, x_source_size, y_source_size) + \
    '<DstRect xOff="%i" yOff="%i" xSize="%i" ySize="%i"/>' % (dest_x_offset, dest_y_offset, x_dest_size, y_dest_size)
band.SetMetadataItem("SimpleSource", simple_source)
band.SetMetadataItem("NoDataValue", -9999)

SetMetadatItemбере два аргументи, перший рядок елемента метаданих, другий сам елемент. Це означає, що ви не можете підміняти елемент метаданих, тому для джерел даних потрібно встановити весь вміст як рядок.

Зауважте, що ми можемо використовувати цей метод для створення складних джерел ( ComplexSource), які містять оглядові таблиці значень, джерела фільтрування ядра ( KernelFilteredSource) довільних розмірів та форм та смуги масок ( MaskBand).


Дякую @om_henners - я закінчив використовувати підпроцес для виклику gdalbuildvrt. Я більше досвідчений з Python, а не з командним рядком, тому я сподівався, що я можу це зробити безпосередньо в Python, але це не варто, щоб зіпсувати проблему зі створенням XML-рядків, як ви описали. Безумовно, добре знати, що я можу це зробити, якщо потрібно в майбутньому.
Брайан

Щойно знайдений випадок використання для еквівалента пітона: додавання непідтримуваних функцій. Наприклад, формат файлу overviewsvrt підтримує елемент, але gdalbuildvrt не використовує його. Дякуємо, що надали заглушку, як це може бути додано в python.
matt wilkie

@om_henners чи є спосіб drv.CreateCopy ('шлях / до / file.vrt', input_ds) з ​​абсолютним шляхом до файлу input_ds у python? є relaToVRT = "1" варіант, але як змінити його або встановити під час створення VRT?
Дмитро Литвинов

8

Оскільки GDAL 2.1, інструменти CLI доступні як бібліотечні функції, і саме це інструменти CLI тепер викликають внутрішньо.

Наприклад:

gdalbuildvrt -r cubic -addalpha my.vrt one.tif two.tif

Є еквівалентом:

from osgeo import gdal

vrt_options = gdal.BuildVRTOptions(resampleAlg='cubic', addAlpha=True)
gdal.BuildVRT('my.vrt', ['one.tif', 'two.tif'], options=vrt_options)

У Доступні опції CLI безпосередньо зіставити з параметрами BuildVRTOptions , плюс є деякі додаткові , як прогрес зворотних викликів доступні.


Схоже, це стосується лише певних інструментів CLI. Наприклад, я намагаюся змусити gdaladdo працювати, але це не відображається. Те саме з gdalwarp. Чи знаєте ви, чи планують вони їх також підтримувати? Було б дуже корисно.
fpolig01

@ Fpolig01 більшість з них є - см RegenerateOverviews()і Warp()в довіднику API . Аргументи зазвичай відповідають командам CLI.
rcoup

@rccoup Дякую за відповідь. Чи RegenerateOverviews () збігається з gdaladdo? Чи є у вас приклад роботи? Я намагаюся зробити щось схоже на gdaladdo -r середній "D: \ image.tif"
fpolig01

@ fpolig01 ця публікація підказуєBuildOverviews() (що насправді те, що я пішов шукати, коли знайшов RegenerateOverviews) - можливо, спробуйте?
rcoup

8

Відповідь @rcoup працювала лише для мене, якщо змінити її так:

from osgeo import gdal 

vrt_options = gdal.BuildVRTOptions(resampleAlg='cubic', addAlpha=True)
my_vrt = gdal.BuildVRT('my.vrt', ['one.tif', 'two.tif'], options=vrt_options)
my_vrt = None

В іншому випадку файл не записується на диск.


JensL дякую! чи можете ви пояснити інтуїцію my_vrt = Немає записати на диск? Просто здається дивним
mmann1123

3
@ mmann1123 : Інакше це не спрацювало, і я мав на увазі, що навчальний посібник API GDAL сказав: "Зауважте, що метод CreateCopy () повертає набір даних, що записуються, і що його потрібно закрити належним чином, щоб завершити запис і промивку набору даних на диск . У випадку Python це відбувається автоматично, коли "dst_ds" виходить за межі області ". Оскільки closingдля python не існує , вам потрібно вивести його vrtза межі, призначивши його None.
JensL

Насправді вони просто вирішили цю проблему (див. Osgeo-org.1560.x6.nabble.com/… )
umbe1987,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.