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

コメント

  • はい、gdal-2.1以降。 この回答は正解として受け入れられる必要があります。

回答

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 

コメント

  • gdal.Translate()テイクは次のとおりです: gdal.org/python/osgeo.gdal-module.html#TranslateOptions
  • I 'これを使おうとしましたが、'エラーは発生しませんが、出力ファイルは' tが作成されました。理由はありますか?
  • 出力ファイルもエラーもありません。出力パスとprojWinパラメータは正しいです。

回答

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が内部で行う方法です。

コメント

  • 残念ながら、これには' reporjectionは含まれていませんか?
  • @ butcher-いいえ。質問は再投影について言及していなかったからです。もちろん、gdal pythonAPIを使用してラスターを再投影できます。方法を知りたい場合は、新しい質問をしてください。
  • すでにここで行っています: gis.stackexchange.com/questions/103874/ … しかし、thiusは重複としてマークされました:-(
  • @ butcher-この質問の重複として閉じられました。あなたの質問はgdal_translateについても尋ねます。gdal_translateが再投影されないことをご存知ですか?再投影する場合は、gdalwarpまたはgdal pythonAPIメソッド- gdal.ReprojectImage

回答

はい、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ではtrが使用されているためです。パスのあるouble、特にスペースのあるパス、または「\」文字の1つが別の偶発的なエスケープ文字になる場所。したがって、私はaspecで適切なパスをそのまま保持します。

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

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

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

コメント

  • では、'これを行うことはできませんか? gdal_translateをインポートしてから、.main()を呼び出しますか?
  • いいえ-'は機能しません。 gdal_translateはPythonパッケージではないため、pythonは'それについて何も知りません。 " ImportError No Module、gdal_translate "というエラーが表示されます。代わりにサブプロセスモジュールを使用して呼び出します。
  • gdal_retile.pyを使用して同様の質問を1つ行います。次のことを試みました:import gdal_retile gdal_retile.main(" -v -r bilinear -levels 4 -ps 2048 2048 -co \ " tiled = YES \ " -targetDir cablepyramid- optfile files.txt ")しかし、エラーが発生します:認識されないコマンドオプション:-理由は何ですか?
  • オフハンドで' ' -optfile 'スイッチが気に入らないかもしれないという私の推測を除いて、問題はわかりません。後者は文書化されていません。
  • @MappaGnosis Python gdalライブラリ内にgdal_translateの代替手段はありますか?

回答

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

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

これは、講義7でも説明されています: http://www.gis.usu.edu/~chrisg/python/2009/

コメント

  • GDALコマンドは、GDAL2.1から RFC 59.1 。また、subprocess.callos.systemより安全です。
  • 誰かがそれらのPython関数の良い例を書く必要があります。私はPG:を適切に取得するために、数時間gdal.Warp()と格闘しました。 cutlineDSNameとしてデータソースを使用してcutlineSQLを駆動します(わかっていますか?数時間 実際に何かがうまくいく?ホラー!< / kidding >)。最終的には機能するようになり、 os.system()またはsubprocess.call()よりも大幅に高速なようです。 'は最大200万のカットラインを実行しているので、'それが' s 実際には今夜のある時間まで速くなります…しかし'は正確に機能します。

回答

PythonのGDAL翻訳を使用して複合マルチバンド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を使用します)。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です