相当于gdalbuildvrt的Python


12

有没有一种方法可以使用GDAL Python绑定执行与gdalbuildvrt实用程序相同的任务?到目前为止,除了创建单个数据集的vrt和手动编辑xml之外,我没有找到任何其他方法。我想从多个栅格创建vrt(本质上是执行镶嵌)。使用纯Python是否可能?我的另一个选择是使用子进程简单地调用gdalbuildvrt。

Answers:


10

老实说,通过在或中使用gdalbuildvrt可以更容易地做到这一点。subprocessos.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字符串。当然,很高兴知道将来我可以在需要时这样做。
布赖恩

刚刚找到了一个具有python等效功能的用例:添加不受支持的功能。例如,vrt文件格式支持overviews元素,但是gdalbuildvrt不使用它。感谢您提供存根,如何在python中添加存根。
马特·威尔基

@om_henners有什么方法可以在python中使用绝对路径到drv.CreateCopy('path / to / file.vrt',input_ds)?有relativeToVRT =“ 1”选项,但是在创建VRT时如何更改或设置?
Dmitriy Litvinov

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 average“ 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 = None写入磁盘的直觉吗?似乎真的很奇怪
mmann1123 '19

3
@ mmann1123:否则它将无法正常工作,我谨记GDAL API教程说:“请注意,CreateCopy()方法返回可写数据集,并且必须正确关闭它才能完成将数据集写入并刷新到磁盘的操作。在Python情况下,当“ dst_ds”超出范围时会自动发生。” 由于没有closingpython,因此必须vrt将其分配给,以使其超出范围None
JensL

其实,他们只是解决了这个问题(见osgeo-org.1560.x6.nabble.com/...
umbe1987
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.