Setara dengan python dari gdalbuildvrt


12

Apakah ada cara untuk melakukan tugas yang sama dengan utilitas gdalbuildvrt menggunakan binding GDAL Python? Sejauh ini saya belum menemukan cara untuk melakukan ini selain membuat vrt dari dataset tunggal dan secara manual mengedit xml. Saya ingin membuat vrt dari beberapa raster (pada dasarnya melakukan mosaik). Apakah ini mungkin menggunakan Python murni? Pilihan saya yang lain adalah menggunakan subproses untuk memanggil gdalbuildvrt.

Jawaban:


10

Sejujurnya lebih mudah untuk melakukan ini dengan menggunakan gdalbuildvrt dalam subprocessatau os.system.

Jika Anda ingin melakukan ini melalui Python, itu bisa dilakukan. Menggunakan metode pembuatan dataset standar dalam GDAL Python kita dapat dengan mudah membuat basis data VRT .

from osgeo import gdal

drv = gdal.GetDriverByName("VRT")
vrt = drv.Create("test.vrt", x_size, y_size, 0)

Perhatikan bahwa kami membuat dataset tanpa band pada awalnya. Dari dokumentasi di VRTs yang VRT dataset adalah salah satu dari beberapa jenis dataset yang dapat menerima AddBandargumen.

vrt.AddBand(gdal.GDT_Float32)
band = vrt.GetRasterBand(1)

Sekarang untuk setiap band kita harus mengatur item metadata secara manual:

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)

SetMetadatItemmengambil dua argumen, pertama string item metadata, yang kedua item itu sendiri. Ini berarti bahwa Anda tidak dapat mengelompokkan item metadata, jadi untuk sumber data Anda harus mengatur seluruh konten sebagai string.

Perhatikan bahwa kita dapat menggunakan metode ini untuk membuat sumber kompleks ( ComplexSource) yang berisi tabel nilai pencarian, sumber filter Kernel ( KernelFilteredSource) dengan ukuran dan bentuk sewenang-wenang, dan Band Mask ( MaskBand).


Terima kasih @om_henners - Saya akhirnya menggunakan subproses untuk menelepon gdalbuildvrt. Saya lebih berpengalaman dengan Python daripada baris perintah jadi saya berharap saya bisa melakukan ini secara langsung dengan Python, tetapi tidak sepadan dengan kesulitan mengacaukan membuat string XML seperti yang Anda gambarkan. Sungguh baik mengetahui bahwa saya dapat melakukannya jika perlu di masa depan.
Brian

Baru saja menemukan kasus penggunaan untuk memiliki python yang setara: menambahkan fitur yang tidak didukung. Misalnya format file vrt mendukung overviewselemen, tetapi gdalbuildvrt tidak menggunakannya. Terima kasih telah memberikan rintisan bagaimana ini dapat ditambahkan dengan python.
matt wilkie

@om_henners apakah ada cara untuk drv.CreateCopy ('path / to / file.vrt', input_ds) dengan path absolut ke file input_ds dengan python? ada opsi relativeToVRT = "1", tetapi bagaimana mengubahnya atau disetel saat membuat VRT?
Dmitriy Litvinov

8

Sejak GDAL 2.1, alat CLI tersedia sebagai fungsi pustaka, dan sebenarnya itulah yang disebut alat CLI secara internal.

Sebagai contoh:

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

Setara dengan:

from osgeo import gdal

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

The pilihan CLI yang tersedia langsung memetakan ke parameter BuildVRTOptions , ditambah ada beberapa tambahan seperti kemajuan callback tersedia.


Ini tampaknya hanya untuk alat CLI tertentu. Misalnya, saya mencoba membuat gdaladdo berfungsi tetapi tidak muncul. Sama dengan gdalwarp. Apakah Anda tahu jika mereka berencana untuk mendukung ini juga? Akan sangat membantu.
fpolig01

@ fpolig01 kebanyakan dari mereka ada di sana - lihat RegenerateOverviews()dan Warp()dalam referensi API . Argumen umumnya cocok dengan perintah CLI.
rcoup

@rccoup Terima kasih atas jawabannya. Apakah RegenerateOverviews () sama dengan gdaladdo? Apakah Anda memiliki contoh yang berfungsi? Saya mencoba melakukan sesuatu yang mirip dengan gdaladdo -r rata-rata "D: \ image.tif"
fpolig01

@ fpolig01 posting ini menunjukkanBuildOverviews() (yang sebenarnya apa yang saya cari ketika saya menemukan RegenerateOverviews) - mungkin mencobanya?
rcoup

8

Jawaban @rcoup hanya berfungsi untuk saya, jika mengubahnya sebagai berikut:

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

Kalau tidak, file tidak ditulis ke disk.


JensL terima kasih! dapatkah Anda menjelaskan intuisi my_vrt = Tidak ada yang akan ditulis ke disk? Sepertinya sangat aneh
mmann1123

3
@ mmann1123 : Kalau tidak, itu tidak berhasil dan saya ada dalam pikiran bahwa Tutorial API GDAL mengatakan: "Perhatikan bahwa metode CreateCopy () mengembalikan dataset yang dapat ditulis, dan bahwa itu harus ditutup dengan benar untuk menyelesaikan penulisan dan menyiram dataset ke disk. Dalam kasus Python ini terjadi secara otomatis ketika "dst_ds" keluar dari ruang lingkup. " Karena tidak ada closinguntuk python, Anda harus membawa vrtkeluar dari ruang lingkup Anda, dengan menetapkannya None.
JensL

Sebenarnya, mereka baru saja memperbaiki masalah ini (lihat osgeo-org.1560.x6.nabble.com/... )
umbe1987
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.