Pythonコードからgdal_translateを呼び出す方法は?


40

いくつかのgdal APIを使用gdal_translateしてPythonコードから呼び出すことは可能ですか?ファイルシステムからgdal_translate.exeを実行するだけではなく、コード内でなんらかの方法で呼び出すので、gdal_translate実行可能ファイルが存在する正確なディレクトリを知る必要はありません。


4
はい、gdal-2.1現在。 この答えは正しいものとして受け入れられるべきです。
ピート

回答:


27

GDAL 2.1(詳細はこちら)以降、GDALおよびOGRユーティリティはライブラリ関数として使用できます。例えば:

from osgeo import gdal

ds = gdal.Open('input.tif')
ds = gdal.Translate('output.tif', ds, projWin = [-75.3, 5.5, -73.5, 3.7])
ds = None

2
必要なすべてのオプションgdal.Translate()は次のとおり
Marcelo Villa

23

GDAL APIチュートリアルを参照してください。

#Import gdal
from osgeo import gdal

#Open existing dataset
src_ds = gdal.Open( src_filename )

#Open output format driver, see gdal_translate --formats for list
format = "GTiff"
driver = gdal.GetDriverByName( format )

#Output to new format
dst_ds = driver.CreateCopy( dst_filename, src_ds, 0 )

#Properly close the datasets to flush to disk
dst_ds = None
src_ds = None

サイズ変更、サブセット化など、より多くの出力制御が必要な場合は、VRTを入力として使用します。これは、gdal_translateが内部的に行う方法です。


残念ながら、これには反省が含まれていませんか?
リカルド14

1
@ブッチャー-いいえ。質問が再投影について言及しなかったため。もちろん、gdal python APIを使用してラスターを再投影できます。方法を知りたい場合は、新しい質問をしてください。
user2856 14

私はすでにここでそれをやった:gis.stackexchange.com/questions/103874/…しかし、thiusは重複としてマークされた:-(
リッカルド14

2
@butcher-この質問の複製として閉じられました。あなたの質問は、gdal_translateについても尋ねています。gdal_translateが再投影しないことを知っていますか?再投影する場合は、gdalwarpまたはgdal python APIメソッド-gdal.ReprojectImage
user2856 14

10

はい、Python内からGDALユーティリティを呼び出すことができます。ユーティリティがそれ自体がexeであるか、Pythonコードの一部であるかによって、アプローチに非常に小さな違いがあります。いずれにしても、サブプロセスモジュールを使用する必要があります。

import subprocess

# constants
gdalTranslate = r'C:\Program Files\GDAL\gdal_translate.exe'
src = r"C:\somefolder\somefile.tif"
dst = r"C:\someotherfolder\myresul.tif"
cmd = "-ot float32 -outsize 25 25"  # just for example!

# see note below
def youCanQuoteMe(item):
    return "\"" + item + "\""

fullCmd = ' '.join([gdalTranslate, cmd, youCanQuoteMe(src), youCanQuoteMe(dst)])
subprocess.popen(fullCmd)

あなたは私のパスの周りにエスケープされた引用符を追加することに気づくでしょう。これは、Windowsで、特にスペースを含むパスや、「\」文字の1つが別の偶発的なエスケープ文字を作成するパスで問題が発生したためです。したがって、私はaspecの適切なパスをそのまま保持します。

Pythonユーティリティのいずれかを使用している場合は、サブプロセスコマンド文字列の先頭のexeが「C:\ python32 \ python.exe」(または使用しているバージョン)であり、2番目の要素が使用するpythonユーティリティ。

もちろん、ハードコードされた定数を使用するのではなく、ファイルシステムを反復処理することもできますが、これは単なる例です。

編集-QGISプラグインの一般化
QGISは、起動時に多くの環境変数を作成/変更します。したがって、上記の例のハードコーディングされたパスの代わりに、これらを使用して(設定->オプション->システムを参照)GDALライブラリ/ユーティリティへの一般化パス変数を構築できます。


だから私はこれを行うことができませんか?gdal_translateをインポートしてから.main()を呼び出しますか?
ケイティE.

いいえ-それは動作しません。gdal_translateはPythonパッケージではないため、pythonはそれについて何も知りません。「ImportError No Module named gdal_translate」というエラーが表示されます。代わりにサブプロセスモジュールを使用して呼び出します。
MappaGnosis

gdal_retile.pyの使用に関するよくある質問を1つ確認します。gdal_retile.gdal_retile.mainをインポートしようとしました。 -optfile files.txt ")が表示されますが、次のエラーが表示されます:認識できないコマンドオプション:-理由は何ですか
ケイティE.

率直に言って、「-optfile」スイッチが気に入らないかもしれないという推測を除いて、この問題は見られません。後者は文書化されていません。
MappaGnosis

@MappaGnosis Python gdalライブラリ内にgdal_translateの代替手段はありますか?
-multigoodverse

7

コマンドラインからのように関数を呼び出すために使用できるos.systemを使用して、さまざまなgdalコマンドでこれを行います。

os.system("gdal_translate -of GTiff " + sourcefile + " " +  destinationfile)

こちらの講義7でも説明しています:http : //www.gis.usu.edu/~chrisg/python/2009/


GDALコマンドは、GDAL 2.1からRFC 59.1でpython関数として使用できます。またsubprocess.call、より安全ですos.system
ドミトリチュバロフ

1
誰かがそれらのPython関数の良い例を書く必要があります。私はgdal.Warp()数時間の間、適切にPG:データソースを取得するためにデータソースを取得するために取り組みましcutlineDSNamecutlineSQL。(私は知っていますよね?数時間 実際に何かを解決しましたか?恐怖!</ kidding>)。やがて機能するようになり、os.system()またはよりも大幅に高速になったようsubprocess.call()です。約200万のカットラインを実行しているので、今夜のある時間まで実際に高速かどうかはわかりませんが、正確に機能しています。
GT。

3

PythonのGDAL Translateを使用して、複合マルチバンドTIFから個々のファイルにバンドを保存したい人のためのクイックコードを次に示します。

import gdal

in_path = 'C:/GIS/Sample.tif' #input composite raster
out_path = 'C:/GIS/Output/' #output directory for individual bands as files

#Open existing raster ds
src_ds = gdal.Open(in_path)

for i in range(1,src_ds.RasterCount +1): #Save bands as individual files
    out_ds = gdal.Translate(out_path + 'band' + str(i) + '.tiff', src_ds, format='GTiff', bandList=[i])
    out_ds=None

これは、(例えばのようなRasterio、使用してさらに処理するために有用である可能性があり、ここに)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.