Gdal: recortar un ráster con otro ráster

14

Estoy escribiendo una utilidad simple para recortar lotes de archivos de trama geotiff multibanda en la misma área (más pequeña). Con gdalwarp, puedo recortar fácilmente un archivo usando un archivo de forma de recorte de un solo polígono:

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

Sin embargo, el área real a la que quiero recortar siempre estará definida inicialmente por otro archivo ráster geotiff, no por un archivo de forma. Sería bueno si pudiera usar la extensión de ese ráster como archivo de recorte, pero no estoy seguro de cómo hacerlo. Como era de esperar, lo siguiente no funciona (no genera un error, simplemente no produce nada):

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

Entonces, mi pregunta es, ¿hay alguna forma de suministrar un ráster gdalwarp -cutline? Alternativamente, ¿hay otra función gdal que pueda recortar un ráster usando otro ráster? Si ninguno de estos es posible, ¿existe una forma muy simple de producir un archivo de forma con un único polígono definido por la extensión de un ráster?

Este código se incluirá en un script de Python más extenso, por lo que puedo usar las utilidades gdal de línea de comandos o cualquiera de los enlaces de Python para gdal.

Como nota al margen, sé que podría crear fácilmente un archivo de formas de recorte que cubra la extensión de mi trama en QGIS. Puedo terminar haciendo eso si no encuentro una solución sencilla, pero finalmente terminaré usando esta utilidad en docenas, si no en cientos de áreas, como parte de un gran análisis automatizado, por lo que preferiría no tener un tedioso paso manual incluso si es muy fácil.

Joe
fuente

Respuestas:

11

No sé si es posible recortar un ráster con otro ráster, pero podría usar gdaltindex para construir el archivo de forma con la extensión de su ráster.

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

lejedi76
fuente
44
gdaltindex funciona perfectamente para hacer un archivo de formas de recorte de mi ráster inicial. Para resolver el problema que uso gdaltindex clipper.shp clipper.tif, seguido degdalwarp -cutline clipper.shp -crop_to_cutline input.tif output.tif
Joe
Estaba usando este enfoque, pero descubrí que a veces tenía un solo píxel en la versión recortada. Creo que es más sencillo calcular sus extensiones de destino a la respuesta de Xavier a continuación y luego usar gdalwarp y especificar -te_srs para manejar CRS no coincidentes.
Jon
7

Para polígonos irregulares, y suponiendo que su archivo ráster geotiff sea un ráster binario, puede usar GDAL_Calc :

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

Esta consulta llenará 0 donde Mask.tif <= 0 y BigImage donde la Máscara> 0. Para hacer esto, ambos rásteres deben tener el mismo tamaño de celda, filas y columnas. Para extraer las mismas extensiones, use GDAL_Translate con la -projwin ulx uly lrx lryopción (el cuadro está en coordenadas proyectadas), pero asegúrese de que el cuadro projwin no se extienda sobre los bordes de ninguno de los rásteres.

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

Sustituya los valores del cuadro projwin derivado de la Máscara.

Michael Stimson
fuente
1
+1 Esta es información útil, pero creo que puedo resolver mi problema en menos pasos usando la respuesta de @ lejedi.
Joe
4

La solución en Python directamente, sin dar 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)
XavierCLL
fuente
1
NB: esta solución solo funciona si están en el mismo SRS.
Skylion
@Skylion Pero puede dar cuenta de esto fácilmente incluyendo la opción -te_srs, aunque también necesita gdalwarp en su lugar con la opción -te.
Jon