Python tương đương với gdalbuildvrt


12

Có cách nào để thực hiện nhiệm vụ tương tự như tiện ích gdalbuildvrt bằng cách sử dụng các ràng buộc GDAL Python không? Cho đến nay tôi không tìm thấy cách nào khác ngoài việc tạo một vrt của một tập dữ liệu duy nhất và chỉnh sửa thủ công xml. Tôi muốn tạo một vrt từ nhiều raster (về cơ bản thực hiện khảm). Điều này có thể sử dụng Python thuần túy không? Tùy chọn khác của tôi là sử dụng quy trình con để gọi gdalbuildvrt.

Câu trả lời:


10

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 subprocesshoặ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)

SetMetadatItemnhậ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).


Cảm ơn bạn @om_henners - Tôi đã kết thúc việc sử dụng quy trình con để gọi gdalbuildvrt. Tôi có nhiều kinh nghiệm hơn với Python hơn là dòng lệnh vì vậy tôi hy vọng tôi có thể làm điều này trực tiếp trong Python, nhưng nó không đáng để gặp rắc rối với việc tạo các chuỗi XML như bạn mô tả. Dù vậy, thật tốt khi biết rằng tôi có thể làm điều đó nếu cần trong tương lai.
Brian

Chỉ cần tìm trường hợp sử dụng để có tương đương python: thêm các tính năng không được hỗ trợ. Ví dụ, định dạng tệp vrt hỗ trợ một overviewsphần tử, nhưng gdalbuildvrt không sử dụng nó. Cảm ơn vì đã cung cấp một sơ khai làm thế nào điều này có thể được thêm vào python.
matt wilkie 4/214

@om_henners có cách nào để drv.CreateCopy ('path / to / file.vrt', input_ds) với đường dẫn tuyệt đối đến tệp input_ds trong python không? có tùy chọn RelToVRT = "1", nhưng làm thế nào để thay đổi hoặc đặt trong khi tạo VRT?
Dmitriy Litvinov

7

Vì GDAL 2.1, các công cụ CLI có sẵn dưới dạng các chức năng của thư viện và trên thực tế đó là những gì các công cụ CLI hiện gọi là nội bộ.

Ví dụ:

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

Là tương đương với:

from osgeo import gdal

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

Các tùy chọn CLI khả dụng ánh xạ trực tiếp tới các tham số của BuildVRTOptions , cộng với một số tính năng bổ sung như gọi lại tiến trình có sẵn.


7

Câu trả lời của @rcoup chỉ hoạt động với tôi, nếu sửa đổi nó như sau:

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

Nếu không, tập tin không được ghi vào đĩa.


JensL cảm ơn! bạn có thể giải thích trực giác của my_vrt = Không để ghi vào đĩa không? Có vẻ như rất kỳ quặc
mmann1123

3
@ mmann1123 : Nếu không thì nó không hoạt động và tôi đã nghĩ rằng Hướng dẫn API GDAL đã nói: "Lưu ý rằng phương thức CreatCopy () trả về một tập dữ liệu có thể ghi và nó phải được đóng đúng để hoàn thành ghi và xóa tập dữ liệu vào đĩa Trong trường hợp Python, điều này xảy ra tự động khi "dst_ds" vượt quá phạm vi. " SInce không có closingcho python, bạn phải mang vrtra khỏi phạm vi của mình, bằng cách gán nó cho None.
JensL

Trên thực tế, họ chỉ khắc phục sự cố này (xem osgeo-org.1560.x6.nabble.com/ ))
umbe1987
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.