コマンドラインからではなく、Pythonスクリプトから呼び出されたときにgdalwarpが空のラスターを生成する


8

Pythonでgdalwarpを使用して、いくつかのラスターデータ(すべての.tif)をより粗い解像度(.05度から.25度まで)に集約しようとしていますが、コマンドは機能しません。広範囲の値を持つ出力を取得する代わりに、出力のすべての値は0です。解像度とピクセル深度/タイプは正しいですが、値は正しくありません。

gdalwarpコマンドのドキュメントは次のとおりです:http ://www.gdal.org/gdalwarp.html

2つの入力ファイルがあり、最大.25度の解像度で集約し、いくつかの出力を生成します。

  • 'NDVI_raster':最初の入力は、NDVIを表す16ビットの符号付きラスターで、値の範囲は-10,000〜10,000、nodata値は-15,000です。

  • 'nodata_mask':2番目は、NoDataマスク、32ビット浮動小数点数で、1 =「正常」データの値、0 = NoDataです。

「NDVI_raster」を入力として使用して、それぞれが異なる統計を表す7つの異なる出力を生成します。これを行うには、gdalwarpを7回呼び出します。そのたびに、リサンプリング方法(-r)を次のいずれかに設定します:平均、モード、最大、最小、中央値、q1、q2。出力をNDVI_ave.tif、NDVI_mode.tifなどと呼びます。現在、GDAL 1.10.1を使用しています。これは、平均とモードのみを許可するため、これら2つの統計のみを使用してテストしています。

「nodata_mask」を入力として使用して、最終的にQAL(品質保証レイヤー)を生成したいと思います。これを行うには、gdalwarpを使用し、リサンプリングモードを「平均」に設定して、最大.25度まで集計します。これにより、各ピクセルは、入力からの良好なピクセル/合計ピクセルの比率を表します。出力QALを呼び出します。

これが私のコードの内容です(最初の入力の例としてモードを使用)。

os.system('gdalwarp -tr .25 .25 -r mode -srcnodata -15000 %s %s' % (NDVI_raster, NDVI_mode))

QAレイヤーの場合:

os.system('gdalwarp -tr .25 .25 -r average -srcnodata -15000 %s %s' % (nodata_mask, QAL))

結果は正しい解像度、投影、ピクセル深度のラスターですが、ピクセル値はすべて0です。

python / gdalに詳しい人は何が起こっているのか知っていますか?


コマンドライン(linux)からgdalwarpコマンドを呼び出すと、目的の結果が得られます。os.systemを使用してpythonからgdalwarpを呼び出すと、空のラスターが表示されます。それで、おそらく私のgdal / pythonバインディングに何か問題がありますか?


os.system経由でコマンドを呼び出す代わりに、サブプロセスを使用しました。この方法によるツールもスムーズに実行されているように見えますが、結果は同じで、0でいっぱいのラスターです。


gdalwarp呼び出しをbashシェルスクリプトに入れて、Pythonからそのシェルスクリプトを呼び出してみましたが、結果は0ではなく-1の束になります。奇妙なことに、私は以前にそれをテストしたことがあり、それが機能することはかなり確かですが、テストがサーバーから削除されてしまい、何らかの理由で再作成できなくなりました。


gdalwarpコマンドをbashシェルスクリプトに入れ、コマンドラインからそのシェルスクリプトを呼び出すと、目的の結果が得られます。ただし、Pythonから同じシェルスクリプトを呼び出すことはできません。Pythonに問題があるようですが、何をどのように修正すればよいですか?


2
バインドの問題ではありません。使用していません。gdalwarpコマンドを実行します。あなたが見る、gdalwarpコマンドのエラー状態を確認してください:stackoverflow.com/questions/3791465/...
ゾルタン

2
ゾルタンが言っていることを拡張するために、あなたは本質的に同じプログラム(gdalwarp)を呼んでいます。os.system実際にシェルを起動し、指定されたコマンドを実行します。戻り値に加えて、渡そうとしている変数を確認する必要があります(引用の問題など?)
Evil Genius

またos.systemsubprocessどちらが新しいモジュールであり、多くの(セキュリティ)改善が含まれているからの移行を検討する必要があります。
Kersten

@Zoltanどんなエラーメッセージ?コマンドが技術的に機能したため、エラーメッセージは表示されませんでした。出力が正しくありませんでした(値0)。plz更新を参照してください。ありがとう!
user20408

2
1つの問題は-ot Float32、整数のラスタでは分数を表すことができないため、品質マスクに指定する必要があるかと思います。
Nat Wilson

回答:


2

python / gdalwarpスクリプトをどのように開始するかは言いません。私はcronjobが私のコマンドライン環境と必ずしも同じ環境を持っているわけではないことを発見しました。これらの種類のスクリプト用のランタイム環境の作成を開始する必要がありました。そうは言っても、たとえばデスクトップ上のアイコンからスクリプトを開始すると、コマンドライン環境と同じランタイム環境を持たない可能性があります。 「PYTHONPATH」は、設定する必要がある環境変数の1つである場合があります。さらに、gdalwarpの変数を設定する必要がある場合があります。最後に、データファイルが正しい場所にない可能性があります。/ xxx / xxxx / NDVI_rasterなどの絶対パスを設定するか、tilda〜/ NDVI_rasterを使用する必要がある場合があります。PYTHONPATHと同様に、PATHやその他の環境変数の設定も必要になる場合があります。スクリプトの最初にある同じ設定を「エクスポートまたはソース」します。


1

私もこの問題を抱えていました。私は結局のところgdal、Python バインディングを使用してオンディスクイメージを作成したばかりgdal.Datasetで、メモリ内オブジェクトを閉じていなかったため、ディスクへの書き込みが部分的にしか完了していないことが原因であると考えました。奇妙なことに、gdal.DatasetPythonでを閉じる唯一の方法は次のとおりdel variable_name_of_datasetです。

CありGDALClose()、現時点でのPython GDALのAPIで実装されていないという方法が、しかしRasterio行いますhttps://github.com/sgillies/rasterio/blob/876b9a1e2bf04e349b485e05ebc4a8674ace3cf0/rasterio/_io.pyx#L1463

GDAL Pythonでデータセットを閉じる理由もご覧ください

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