Gdal: cortando uma raster com outra raster


14

Estou escrevendo um utilitário simples para cortar lotes de arquivos raster geotiff de várias bandas na mesma área (menor). Usando gdalwarp, posso cortar facilmente um arquivo usando um shapefile de recorte de polígono único:

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

No entanto, a área real na qual quero recortar sempre será inicialmente definida por outro arquivo raster geotiff, não por um shapefile. Seria bom se eu pudesse usar a extensão dessa varredura como arquivo de recorte, mas não tenho certeza de como fazer isso. Sem surpresa, o seguinte não funciona (não gera um erro, apenas não produz nada):

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

Então, minha pergunta é: existe uma maneira de fornecer uma varredura gdalwarp -cutline? Como alternativa, existe outra função gdal que pode cortar uma varredura usando outra varredura? Se nenhuma dessas opções for possível, existe uma maneira muito simples de produzir um arquivo de forma com um único polígono definido pela extensão de uma varredura?

Esse código será envolvido em um script python mais extenso, para que eu possa usar os utilitários de linha de comando gdal ou qualquer uma das ligações de python para gdal.

Como uma observação lateral, eu sei que poderia facilmente criar um arquivo de forma de recorte que cubra a extensão da minha varredura no QGIS. Posso acabar fazendo isso se não encontrar uma solução direta, mas acabarei usando esse utilitário em dezenas, senão centenas de áreas, como parte de uma grande análise automatizada, por isso prefiro não ter um tédio. passo manual, mesmo que seja muito fácil.

Respostas:


11

Não sei se é possível cortar um raster com outro raster, mas você pode usar o gdaltindex para criar o shapefile com a extensão do seu raster.

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


4
O gdaltindex funciona perfeitamente para criar um arquivo shapefile do meu raster inicial. Para resolver o problema que eu uso gdaltindex clipper.shp clipper.tif, seguido porgdalwarp -cutline clipper.shp -crop_to_cutline input.tif output.tif
Joe

Eu estava usando essa abordagem, mas descobri que algumas vezes havia um único pixel desativado na versão cortada. Eu acho que é mais simples calcular sua extensão de alvo à la Xavier abaixo e depois usar gdalwarp e especificar -te_srs para lidar com CRSs incompatíveis.
Jon

7

Para polígonos irregulares, e supondo que seu arquivo de varredura geotiff seja uma varredura binária, você pode usar GDAL_Calc :

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

Essa consulta preencherá 0 em que Mask.tif <= 0 e BigImage em que Mask> 0. Para fazer isso, as duas rasters devem ter o mesmo tamanho de célula, linhas e colunas. Para extrair as mesmas extensões, use GDAL_Translate com a -projwin ulx uly lrx lryopção (a caixa está nas coordenadas projetadas), mas verifique se a caixa do projwin não se estende sobre as bordas de nenhuma varredura.

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

Substitua valores pela caixa do projwin derivada da Máscara.


1
+1 Essas são informações úteis, mas acho que posso resolver meu problema em menos etapas usando a resposta de @ lejedi.
Joe

4

A solução em Python diretamente, sem criar 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
Nota: esta solução só funciona se eles estiverem no mesmo SRS.
Skylion

@ Skylion Mas você pode facilmente explicar isso incluindo a opção -te_srs, embora também precise gdalwarp com a opção -te.
18719 Jon
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.