Gdal: tagliare un raster con un altro raster


14

Sto scrivendo una semplice utility per ritagliare batch di file raster geotiff multibanda nella stessa area (più piccola). Usando gdalwarp, posso facilmente ritagliare un file usando uno shapefile di ritaglio a singolo poligono:

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

Tuttavia, l'area effettiva a cui voglio tagliare sarà sempre inizialmente definita da un altro file raster geotiff, non da uno shapefile. Sarebbe bello se potessi usare l'estensione di quel raster come file di ritaglio, ma non sono sicuro di come farlo. Non sorprende che il seguente non funzioni (non genera un errore, semplicemente non produce nulla):

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

Quindi, la mia domanda è: c'è un modo per fornire un raster a gdalwarp -cutline? In alternativa, esiste un'altra funzione gdal che può tagliare un raster usando un altro raster? Se nessuno di questi è possibile, esiste un modo molto semplice per produrre un file di forma con un singolo poligono definito dall'estensione di un raster?

Questo codice sarà racchiuso in uno script Python più esteso, quindi posso usare le utility gdal della riga di comando o qualsiasi bind python per gdal.

Come nota a margine, so che potrei facilmente creare un file di forma di ritaglio che copra l'estensione del mio raster in QGIS. Potrei finire per farlo se non trovo una soluzione semplice, ma alla fine finirò per usare questa utility su dozzine se non centinaia di aree come parte di una grande analisi automatizzata, quindi preferirei non avere un noioso passaggio manuale anche se è molto semplice.

Risposte:


11

Non so se è possibile tagliare un raster con un altro raster ma è possibile utilizzare gdaltindex per creare lo shapefile con l'estensione del raster.

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


4
gdaltindex funziona perfettamente per creare uno shapefile di ritaglio dal mio raster iniziale. Per risolvere il problema che uso gdaltindex clipper.shp clipper.tif, seguito dagdalwarp -cutline clipper.shp -crop_to_cutline input.tif output.tif
Joe

Stavo usando questo approccio, ma ho scoperto che a volte era un singolo pixel fuori nella versione ritagliata. Penso che sia più semplice calcolare il tuo obiettivo estende una risposta di Xavier sotto e quindi usa gdalwarp e specifica -te_srs per gestire CRS non corrispondenti.
Jon

7

Per i poligoni irregolari e supponendo che il file raster geotiff sia un raster binario, è possibile utilizzare GDAL_Calc :

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

Questa query popolerà 0 dove Mask.tif <= 0 e BigImage dove la maschera> 0. Per fare ciò entrambi i raster devono avere le stesse dimensioni di cella, righe e colonne. Per estrarre le stesse estensioni, utilizzare GDAL_Translate con l' -projwin ulx uly lrx lryopzione (la casella è in coordinate proiettate), ma assicurarsi che la casella di projwin non si estenda oltre i bordi di nessuno dei raster.

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

Valori sostitutivi per la casella projwin derivati ​​dalla maschera.


1
+1 Queste sono informazioni utili, ma penso di poter risolvere il mio problema in meno passaggi usando la risposta di @ lejedi.
Joe,

4

La soluzione in Python direttamente, senza fare forma:

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
NB: questa soluzione funziona solo se si trovano nello stesso SRS.
Skylion,

@Skylion Ma puoi facilmente spiegarlo includendo l'opzione -te_srs, anche se devi anche gdalwarp invece con l'opzione -te.
Jon
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.