gdalbuildvrtに相当するPython


12

GDAL Pythonバインディングを使用してgdalbuildvrtユーティリティと同じタスクを実行する方法はありますか?これまでのところ、単一のデータセットのvrtを作成し、xmlを手動で編集する以外に、これを行う方法を見つけていません。複数のラスターからモザイクを作成します(基本的にモザイクを実行します)。これは純粋なPythonを使用して可能ですか?私の他のオプションは、サブプロセスを使用して単にgdalbuildvrtを呼び出すことです。

回答:


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引数を受け入れることができる数少ないデータセットタイプの1つです。

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)

SetMetadatItem2つの引数を取ります。1つ目はメタデータアイテムの文字列、2つ目はアイテム自体です。これは、メタデータアイテムをサブセット化できないことを意味します。したがって、データソースの場合は、コンテンツ全体を文字列として設定する必要があります。

このメソッドを使用してComplexSource、値のルックアップテーブルKernelFilteredSource、任意のサイズと形状のカーネルフィルターソース()、およびマスクバンド(MaskBand)を含む複雑なソース()を作成できることに注意してください。


ありがとう@om_henners-サブプロセスを使用してgdalbuildvrtを呼び出しました。私はコマンドラインよりもPythonの方が経験が豊富なので、Pythonで直接これを行うことができると期待していましたが、説明したようにXML文字列を作成する手間をかける価値はありません。ただし、将来必要に応じてそれができることを知っているのは確かに良いことです。
ブライアン

サポートされていない機能を追加するという、同等のpythonを持つユースケースを見つけました。たとえば、vrtファイル形式はoverviews要素をサポートしますが、gdalbuildvrtはそれを使用しません。スタブを提供してくれてありがとう、これをPythonに追加する方法を教えてください。
マットウィルキー14

@om_hennersは、Pythonのinput_dsファイルへの絶対パスでdrv.CreateCopy( 'path / to / file.vrt'、input_ds)する方法はありますか?relativeToVRT = "1"オプションがありますが、VRTの作成中にどのように変更または設定しますか?
ドミトリー

7

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、プラス利用できる進捗のコールバックのようないくつかの特典があります。


7

@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

3
@ mmann1123:それ以外の場合は機能せず、GDAL APIチュートリアルでは次のことを念頭に置いていました。。Pythonの場合、これは「dst_ds」が範囲外になると自動的に発生します。closingpython がないのでvrt、に割り当ててスコープから外しなければなりませんNone
JensL

実際、彼らはこの問題を修正しました(osgeo-org.1560.x6.nabble.com/…を参照)
umbe1987
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.