Gdal:別のラスターでラスターをクリップ


14

私は、マルチバンドジオティフラスターファイルのバッチを同じ(より小さい)領域にトリミングする簡単なユーティリティを書いています。gdalwarpを使用すると、単一ポリゴンのクリッピングシェープファイルを使用してファイルを簡単にトリミングできます。

gdalwarp -cutline clipper.shp -crop_to_cutline input.tif output.tif

ただし、クリップする実際の領域は、最初は常にシェイプファイルではなく、別のジオティフラスターファイルによって定義されます。そのラスターの範囲をクリッピングファイルとして使用できればいいのですが、どうすればよいかわかりません。当然のことながら、以下は機能しません(エラーは発生せず、何も生成されません)。

gdalwarp -cutline clipper.tif-crop_to_cutline input.tif output.tif

だから、私の質問は、ラスターを提供する方法はありgdalwarp -cutlineますか?あるいは、別のラスターを使用してラスターをクリップできる別のgdal関数がありますか?これらのどちらも不可能な場合、ラスタの範囲によって定義された単一のポリゴンでシェープファイルを作成する非常に簡単な方法はありますか?

このコードは、より広範なpythonスクリプトにラップされるため、コマンドラインのgdalユーティリティまたはgdalのPythonバインディングを使用できます。

補足として、QGISのラスターの範囲をカバーするクリッピングシェープファイルを簡単に作成できることを知っています。簡単な解決策が見つからない場合はそれを行うかもしれませんが、最終的には大規模な自動分析の一部として数百ではないにしても数十の領域でこのユーティリティを使用することになりますので、面倒なことはしたくないと思います非常に簡単な場合でも手動ステップ。

回答:


11

他のラスターでラスターをクリップできるかどうかはわかりませんが、gdaltindexを使用して、ラスターの範囲でシェープファイルを作成できます。

http://www.gdal.org/gdaltindex.html


4
gdaltindexは、最初のラスターからクリッピングシェープファイルを作成するのに最適です。私が使用する問題を解決するにはgdaltindex clipper.shp clipper.tif、続いてgdalwarp -cutline clipper.shp -crop_to_cutline input.tif output.tif
ジョー

私はこのアプローチを使用していましたが、クリップされたバージョンでは時々1ピクセルずれていました。以下のXavierの答えのようにターゲットエクステントを計算し、gdalwarpを使用して-te_srsを指定して不一致のCRSを処理する方が簡単だと思います。
ジョン

7

不規則な多角形のため、そして自分のGeoTIFFのラスタファイルがバイナリラスタであると仮定すると、あなたが使用することができGDAL_Calcを

GDAL_Calc.py -A Mask.tif -B CutBigImageToClip.tif --outfile=SmallerFile.tif --NoDataValue=0 --Calc="B*(A>0)" 

このクエリは、Mask.tif <= 0の場合は0、Mask> 0の場合はBigImageを取り込みます。これを行うには、両方のラスターが同じセルサイズ、行、列である必要があります。同じ範囲を抽出するには、GDAL_Translateを-projwin ulx uly lrx lryオプション付きで使用します(ボックスは投影座標内にあります)が、projwinボックスがいずれかのラスターのエッジを超えないようにします。

GDAL_Translate -of GTIFF -projwin ulx uly lrx lry BigImageToClip.tif CutBigImageToClip.tif

マスクから派生したprojwinボックスの代替値。


1
+1これは有用な情報ですが、@ lejediの回答を使用して、より少ないステップで問題を解決できると思います。
ジョー14

4

形を作らずに直接Pythonで解決する:

import gdal
from gdalconst import GA_ReadOnly

data = gdal.Open('img_mask.tif', GA_ReadOnly)
geoTransform = data.GetGeoTransform()
minx = geoTransform[0]
maxy = geoTransform[3]
maxx = minx + geoTransform[1] * data.RasterXSize
miny = maxy + geoTransform[5] * data.RasterYSize
call('gdal_translate -projwin ' + ' '.join([str(x) for x in [minx, maxy, maxx, miny]]) + ' -of GTiff img_orig.tif img_out.tif', shell=True)

1
注意:このソリューションは、同じSRSにある場合にのみ機能します。
スカイライオン

@Skylionしかし、-te_srsオプションを含めることでこれを簡単に説明できますが、代わりに-teオプションを使用してgdalwarpする必要があります。
ジョン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.