Gdal: découpage d'un raster avec un autre raster

14

J'écris un utilitaire simple pour recadrer des lots de fichiers raster géotiff multi-bandes dans la même zone (plus petite). En utilisant gdalwarp, je peux facilement recadrer un fichier à l'aide d'un fichier de formes de découpage à un seul polygone:

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

Cependant, la zone réelle sur laquelle je souhaite découper sera toujours initialement définie par un autre fichier raster géotiff, pas un fichier de formes. Ce serait bien si je pouvais utiliser l'étendue de ce raster comme fichier de découpage, mais je ne sais pas comment faire. Sans surprise, ce qui suit ne fonctionne pas (il ne génère pas d'erreur, il ne produit rien):

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

Donc, ma question est, existe-t-il un moyen de fournir un raster gdalwarp -cutline? Sinon, existe-t-il une autre fonction gdal qui peut découper un raster en utilisant un autre raster? Si aucun de ces éléments n'est possible, existe-t-il un moyen très simple de produire un fichier de formes avec un seul polygone défini par l'étendue d'un raster?

Ce code sera enveloppé dans un script python plus étendu, donc je peux utiliser les utilitaires de ligne de commande gdal ou n'importe quelle liaison python pour gdal.

En passant, je sais que je pourrais facilement créer un fichier de formes de découpage qui couvre l'étendue de mon raster dans QGIS. Je peux finir par le faire si je ne trouve pas de solution simple, mais je finirai par utiliser cet utilitaire sur des dizaines sinon des centaines de domaines dans le cadre d'une grande analyse automatisée, donc je préférerais ne pas avoir de fastidieux étape manuelle même si elle est très simple.

Joe
la source

Réponses:

11

Je ne sais pas s'il est possible de découper un raster avec un autre raster mais vous pouvez utiliser gdaltindex pour construire le fichier de formes avec l'étendue de votre raster.

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

lejedi76
la source
4
gdaltindex fonctionne parfaitement pour créer un fichier de formes de découpage à partir de mon raster initial. Pour résoudre le problème que j'utilise gdaltindex clipper.shp clipper.tif, suivi degdalwarp -cutline clipper.shp -crop_to_cutline input.tif output.tif
Joe
J'utilisais cette approche, mais j'ai constaté qu'il s'agissait parfois d'un seul pixel dans la version tronquée. Je pense qu'il est plus simple de calculer votre étendue cible à la réponse de la Xavier ci-dessous, puis d'utiliser gdalwarp et de spécifier -te_srs pour gérer les CRS incompatibles.
Jon
7

Pour les polygones irréguliers et en supposant que votre fichier raster de géotiff est un raster binaire, vous pouvez utiliser GDAL_Calc :

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

Cette requête remplira 0 où Mask.tif <= 0 et BigImage où Mask> 0. Pour ce faire, les deux rasters doivent avoir la même taille de cellule, les mêmes lignes et colonnes. Pour extraire les mêmes étendues, utilisez GDAL_Translate avec l' -projwin ulx uly lrx lryoption (la boîte est en coordonnées projetées), mais assurez-vous que la boîte projwin ne s'étend pas sur les bords de l'un ou l'autre raster.

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

Substituez les valeurs de la boîte projwin dérivées du masque.

Michael Stimson
la source
1
+1 Ce sont des informations utiles, mais je pense que je peux résoudre mon problème en moins d'étapes en utilisant la réponse de @ lejedi.
Joe
4

La solution en Python directement, sans prise de forme:

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
la source
1
NB: Cette solution ne fonctionne que s'ils sont dans le même SRS.
Skylion
@Skylion Mais vous pouvez facilement en tenir compte en incluant l'option -te_srs, bien que vous ayez également besoin de gdalwarp à la place avec l'option -te.
Jon