Gdal: Beschneide ein Raster mit einem anderen Raster

14

Ich schreibe ein einfaches Dienstprogramm, um Stapel von Multiband-Geotiff-Rasterdateien auf denselben (kleineren) Bereich zuzuschneiden. Mit gdalwarp kann ich eine Datei mithilfe eines Shapefiles mit einem einzelnen Polygonausschnitt ganz einfach zuschneiden:

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

Der tatsächliche Bereich, in den ich einen Clip einfügen möchte, wird anfangs jedoch immer von einer anderen Geotiff-Rasterdatei und nicht von einem Shapefile definiert. Es wäre schön, wenn ich das Ausmaß dieses Rasters als Clipping-Datei verwenden könnte, aber ich bin mir nicht sicher, wie ich das machen soll. Es überrascht nicht, dass das Folgende nicht funktioniert (es löst keinen Fehler aus, es produziert einfach nichts):

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

Also, meine Frage ist, gibt es eine Möglichkeit, ein Raster zu liefern gdalwarp -cutline? Gibt es alternativ eine andere gdal-Funktion, die ein Raster mit einem anderen Raster ausschneiden kann? Wenn beides nicht möglich ist, gibt es eine sehr einfache Möglichkeit, ein Shapefile mit einem einzelnen Polygon zu erstellen, das durch die Ausdehnung eines Rasters definiert wird?

Dieser Code wird in ein umfangreicheres Python-Skript eingebunden, sodass ich entweder die Befehlszeilen-Dienstprogramme gdal oder eine der Python-Bindungen für gdal verwenden kann.

Als Randnotiz weiß ich, dass ich einfach ein Clipping-Shapefile erstellen kann, das die Ausdehnung meines Rasters in QGIS abdeckt. Möglicherweise mache ich das, wenn ich keine einfache Lösung finde, aber letztendlich benutze ich dieses Dienstprogramm für Dutzende, wenn nicht Hunderte von Bereichen als Teil einer großen automatisierten Analyse manueller Schritt, auch wenn es sehr einfach ist.

Joe
quelle

Antworten:

11

Ich weiß nicht, ob es möglich ist, ein Raster mit einem anderen Raster zu schneiden, aber Sie könnten gdaltindex verwenden, um das Shapefile mit der Ausdehnung Ihres Rasters zu erstellen.

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

lejedi76
quelle
4
gdaltindex funktioniert perfekt, um aus meinem ursprünglichen Raster ein Clipping-Shapefile zu erstellen. Um das Problem zu lösen, benutze ich gdaltindex clipper.shp clipper.tif, gefolgt vongdalwarp -cutline clipper.shp -crop_to_cutline input.tif output.tif
Joe
Ich habe diesen Ansatz verwendet, aber festgestellt, dass er in der beschnittenen Version manchmal um ein Pixel abweicht. Ich denke, es ist einfacher, die Antwort Ihres Zielbereichs nach Xavier zu berechnen und dann gdalwarp zu verwenden und -te_srs anzugeben, um nicht übereinstimmende CRSs zu behandeln.
Jon
7

Für unregelmäßige Polygone und unter der Annahme, dass Ihre Geotiff-Raster-Datei ein Binär-Raster ist, können Sie GDAL_Calc verwenden :

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

Diese Abfrage füllt 0 mit Mask.tif <= 0 und BigImage mit Mask> 0. Zu diesem Zweck müssen beide Raster dieselbe Zellengröße, Zeilen und Spalten aufweisen. Um die gleichen Ausmaße zu extrahieren, verwenden Sie GDAL_Translate mit der -projwin ulx uly lrx lryOption (das Kästchen ist in projizierten Koordinaten), stellen Sie jedoch sicher, dass sich das Projwin-Kästchen nicht über die Kanten eines der Raster erstreckt.

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

Ersatzwerte für die von der Maske abgeleitete projwin-Box.

Michael Stimson
quelle
1
+1 Dies sind nützliche Informationen, aber ich denke, ich kann mein Problem mit @ lejedis Antwort in weniger Schritten lösen.
Joe
4

Die Lösung in Python direkt, ohne Form zu machen:

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)
XavierCLL
quelle
1
NB: Diese Lösung funktioniert nur, wenn sie sich im selben SRS befinden.
Skylion
@Skylion Sie können dies jedoch problemlos mit der Option -te_srs berücksichtigen, obwohl Sie stattdessen auch gdalwarp mit der Option -te ausführen müssen.
Jon