Thành thật mà nói, việc này dễ dàng hơn bằng cách sử dụng gdalbuildvrt trong một subprocess
hoặc os.system
.
Nếu bạn muốn làm điều này thông qua Python thì có thể thực hiện được. Sử dụng các phương pháp tạo tập dữ liệu tiêu chuẩn trong GDAL Python, chúng ta có thể dễ dàng tạo tập dữ liệu cơ sở VRT .
from osgeo import gdal
drv = gdal.GetDriverByName("VRT")
vrt = drv.Create("test.vrt", x_size, y_size, 0)
Lưu ý rằng chúng tôi đang tạo tập dữ liệu không có băng tần ban đầu. Từ tài liệu về VRT , bộ dữ liệu VRT là một trong số ít loại dữ liệu có thể chấp nhận AddBand
đối số.
vrt.AddBand(gdal.GDT_Float32)
band = vrt.GetRasterBand(1)
Bây giờ, đối với mỗi băng tần, chúng ta phải đặt các mục siêu dữ liệu theo cách thủ công:
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
nhận hai đối số, chuỗi đầu tiên của mục siêu dữ liệu, chuỗi thứ hai chính nó. Điều này có nghĩa là bạn không thể đặt một mục siêu dữ liệu, vì vậy đối với các nguồn dữ liệu, bạn phải đặt toàn bộ nội dung dưới dạng một chuỗi.
Lưu ý rằng chúng ta có thể sử dụng phương pháp này để tạo các nguồn phức tạp ( ComplexSource
) có chứa các bảng tra cứu các giá trị, các nguồn bộ lọc Kernel ( KernelFilteredSource
) có kích thước và hình dạng tùy ý và Mask Band ( MaskBand
).