PythonでのGDALを使用したジオティフの読み取り、変更、および書き込み


11

Python GDALバインディングとnumpyを使用して、リモートセンシング画像処理のロープを学ぼうとしています。最初の試みとして、Landsat8ジオティフファイルを読み取り、簡単な操作を行い、結果を新しいファイルに書き込みます。以下のコードは正常に動作するように見えますが、操作されたラスターではなく、元のラスターが出力ファイルにダンプされます。

コメントや提案は歓迎しますが、特に、操作されたラスターが結果に表示されない理由についてのメモです。

import os
import gdal

gdal.AllRegister()

file = "c:\~\LC81980242015071LGN00.tiff"
(fileRoot, fileExt) = os.path.splitext(file)
outFileName = fileRoot + "_mod" + fileExt

ds = gdal.Open(file)
band = ds.GetRasterBand(1)
arr = band.ReadAsArray()

[cols, rows] = arr.shape
arr_min = arr.Min()
arr_max = arr.Max()
arr_mean = int(arr.mean())

arr_out = numpy.where((arr < arr_mean), 10000, arr)

driver = gdal.GetDriverByName("GTiff")
outdata = driver.Create(outFileName, rows, cols, 1, gdal.GDT_UInt16)
outband = outdata.GetRasterBand(1)
outband.WriteArray(arr_out)
outdata = None

print arr_min
> 0
print arr_max
> 65535
print arr_mean
> 4856

Windows 7 32ビットマシンでPython 2.7.1を使用します。


DEM(Ubuntu、python 2.7.1)で動作するようにしたのですが、平均値以下のすべてが10000に設定され、新しいTIFFに書き込まれ、期待どおりの結果が得られました。ジオトランスフォームを新しい画像にコピーしていないため、投影されないため、表示しようとするときにそれを考慮する必要がある場合があります(これを行うには1つのライナーがありますが、掘り下げる必要があります)。あなたがからの出力とあなたの質問を編集することができた場合gdainfo -stats original.tiffgdal-config --version、あまりにもそれを助けることができます。
スティーブンケイ

こんにちは、これを見てくれてありがとう!ジオトランスフォームを無視したことは知っています。(Irfanviewを使用して)出力イメージ全体が表示されるので、それができないと思います。今夜席に戻ったときにあなたが要求した情報を生成します。
HDR

こんにちは、私はあなたが尋ねた情報を提供するのに苦労しています。Python GDALバインディングを使用していますが、指定したコマンドがPythonコマンドにどのように対応するかわかりません。いずれにせよ、ここから入手したGDAL-1.11.2-cp27-none-win32を使用しています。オリジナルの.tiffの統計を使用して投稿を更新します。
HDR

arr_minはどうなりますか?
-fluidmotion

arr_min =0。これを表示するように投稿を更新しました。ありがとう!
HDR

回答:


13

スクリプトにds.FlushCacheメソッドがありません。このメソッドは、変更の最後にメモリにあるものをディスクに保存します。以下の例の修正バージョンを参照してください。投影とジオトランスフォームを入力として設定するために2行も追加したことに注意してください。

import os
import gdal

file = "path+filename"
ds = gdal.Open(file)
band = ds.GetRasterBand(1)
arr = band.ReadAsArray()
[cols, rows] = arr.shape
arr_min = arr.min()
arr_max = arr.max()
arr_mean = int(arr.mean())
arr_out = numpy.where((arr < arr_mean), 10000, arr)
driver = gdal.GetDriverByName("GTiff")
outdata = driver.Create(outFileName, rows, cols, 1, gdal.GDT_UInt16)
outdata.SetGeoTransform(ds.GetGeoTransform())##sets same geotransform as input
outdata.SetProjection(ds.GetProjection())##sets same projection as input
outdata.GetRasterBand(1).WriteArray(arr_out)
outdata.GetRasterBand(1).SetNoDataValue(10000)##if you want these values transparent
outdata.FlushCache() ##saves to disk!!
outdata = None
band=None
ds=None

出力ファイルは投影されません。HDF5ファイルを読み込んで、エクスポートするバンドからプロジェクションを選択するとGetProjection()、正しいEPSGが配信されますが、適用されないようです。GDALワープが見つかりませんか?ありがとう!
マイケル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.