Gdalbuildvrt'un Python eşdeğeri


12

GDAL Python bağlamaları kullanarak gdalbuildvrt yardımcı programıyla aynı görevi gerçekleştirmenin bir yolu var mı? Şimdiye kadar bunu tek bir veri kümesi vrt oluşturmak ve xml el ile düzenleme dışında herhangi bir yol bulamadım. Birden fazla rasterden (aslında bir mozaik gerçekleştirerek) bir vrt oluşturmak istiyorum. Saf Python kullanmak mümkün mü? Diğer seçeneğim, gdalbuildvrt'yi çağırmak için alt süreci kullanmaktır.

Yanıtlar:


10

Dürüstçe kullanarak bunu yapmak artık çok kolay gdalbuildvrt bir bölgesi subprocessya os.system.

Bunu Python ile yapmak isterseniz yapılabilir. GDAL Python içindeki standart veri kümesi oluşturma yöntemlerini kullanarak, temel veri kümesi VRT'sini kolayca oluşturabiliriz .

from osgeo import gdal

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

Başlangıçta bant içermeyen veri kümesini oluşturduğumuzu unutmayın. VRT'ler üzerindeki belgelerden, VRT veri kümelerinin AddBandbağımsız değişkenleri kabul edebilen birkaç veri kümesi türünden biri olduğu anlaşılmaktadır .

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

Şimdi her bant için meta veri öğelerini manuel olarak ayarlamamız gerekiyor:

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)

SetMetadatItemiki argüman alır, ilki meta veri öğesinin bir dizesi, ikincisi öğenin kendisi. Bu, bir meta veri öğesini alt ayarlayamayacağınız anlamına gelir; bu nedenle veri kaynakları için tüm içeriği bir dize olarak ayarlamanız gerekir.

Bu yöntemi ComplexSource, değerlerin tablolarını içeren karmaşık kaynaklar ( KernelFilteredSource), rastgele boyut ve şekillerde Çekirdek filtre kaynakları ( ) ve Maske Bantları ( MaskBand) oluşturmak için kullanabileceğimizi unutmayın.


@Om_henners - gdalbuildvrt'yi aramak için alt süreci kullandım. Komut satırından ziyade Python ile daha deneyimliyim, bu yüzden bunu doğrudan Python'da yapabileceğimi umuyordum, ancak açıkladığınız gibi XML dizeleri oluşturma ile uğraşmak zor değil. Gelecekte ihtiyaç olursa bunu yapabileceğimi bilmek kesinlikle iyi.
Brian

Bir python eşdeğerine sahip olmak için bir kullanım durumu buldum: desteklenmeyen özellikler ekleme. Örneğin, vrt dosya biçimi bir overviewsöğeyi destekler , ancak gdalbuildvrt bunu kullanmaz. Bunun python'a nasıl eklenebileceği konusunda bir saplama sağladığınız için teşekkür ederiz.
matt wilkie

@om_henners drv.CreateCopy'ye ('path / to / file.vrt', input_ds) python'daki input_ds dosyasına giden mutlak yol var mı? relativeToVRT = "1" seçeneği var, ancak VRT oluştururken nasıl değiştirilir veya ayarlanır?
Dmitriy Litvinov

8

GDAL 2.1'den beri CLI araçları kütüphane işlevleri olarak mevcuttur ve aslında CLI araçlarının dahili olarak çağırdığı şey budur.

Örneğin:

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

Şuna eşdeğerdir:

from osgeo import gdal

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

Mevcut CLI seçenekleri doğrudan parametreleri eşlemek BuildVRTOptions artı ilerleme geri aramaları gibi bazı ekstralar mevcut var.


Bu yalnızca belirli CLI araçları için görünüyor. Örneğin, gdaladdo'nun çalışmasını sağlamaya çalışıyorum ama görünmüyor. Gdalwarp ile aynı. Bunları da desteklemeyi planlayıp planlamadıklarını biliyor musunuz? Çok yardımcı olur.
fpolig01

bkz - @ fpolig01 çoğu vardır RegenerateOverviews()ve Warp()içinde API başvurusu . Bağımsız değişkenler genellikle CLI komutlarıyla eşleşir.
rcoup

@rccoup Yanıt için teşekkürler. RegenerateOverviews (), gdaladdo ile aynı mıdır? Bunun bir örneği var mı? Gdaladdo -r ortalama "D: \ image.tif" benzer bir şey yapmaya çalışıyorum
fpolig01

@ fpolig01 bu yazı önermektedirBuildOverviews() ( bulduğumda aradığım şey aslında RegenerateOverviews) - belki de denemek?
rcoup

8

@Rcoup'un cevabı sadece aşağıdaki gibi değiştirilirse benim için çalıştı:

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

Aksi takdirde, dosya diske yazılmaz.


JensL teşekkürler! diske yazmak için my_vrt = None sezgisini açıklayabilir misiniz? Gerçekten garip görünüyor
mmann1123 28:19

3
@ mmann1123 : Aksi halde işe yaramadı ve GDAL API'sı Öğreticisinin şunları söyledi: "CreateCopy () yönteminin yazılabilir bir veri kümesi döndürdüğünü ve veri kümesini diske yazmayı ve temizlemeyi tamamlamak için düzgün bir şekilde kapatılması gerektiğini unutmayın. Python durumunda bu "dst_ds" kapsam dışına çıktığında otomatik olarak gerçekleşir. closingPython için bir şey olmadığında vrt, onu atayarak kapsamınızı dışına çıkarmanız gerekir None.
JensL

Aslında, sadece bu sorunu çözdüler (bkz. Osgeo-org.1560.x6.nabble.com/… )
umbe1987
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.