Честно говоря, это проще сделать с помощью gdalbuildvrt в 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)
Обратите внимание, что изначально мы создаем набор данных без полос. Из документации по VRTS что 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
).