Answers:
老实说,通过在或中使用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)
请注意,我们最初创建的数据集没有波段。从有关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
)。
overviews
元素,但是gdalbuildvrt不使用它。感谢您提供存根,如何在python中添加存根。
从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,再加上有像进度回调一些额外可用。
BuildOverviews()
(实际上是我发现时去寻找的东西RegenerateOverviews
)—也许尝试一下?
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
否则,文件不会写入磁盘。
closing
python,因此必须vrt
将其分配给,以使其超出范围None
。