Gdal:用另一个栅格裁剪一个栅格


14

我正在编写一个简单的实用程序,将一批多波段Geotiff栅格文件裁剪到相同(较小)的区域。使用gdalwarp,我可以使用单多边形剪切shapefile轻松裁剪文件:

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

但是,我要裁剪的实际区域将始终始终由另一个geotiff栅格文件而不是shapefile定义。如果可以将栅格的范围用作剪切文件,那将很好,但是我不确定如何执行此操作。毫不奇怪,以下代码不起作用(它不会引发错误,它只会产生任何东西):

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

所以,我的问题是,有没有办法提供栅格gdalwarp -cutline?或者,是否还有另一个gdal函数可以使用另一个栅格裁剪一个栅格?如果这两种方法均不可行,是否有一种非常简单的方法来生成具有由栅格范围定义的单个多边形的shapefile?

这段代码将包装在更广泛的python脚本中,因此我可以使用命令行gdal实用程序或gdal的任何python绑定。

作为附带说明,我知道我可以轻松地制作一个裁剪shapefile,以覆盖我在QGIS中的栅格范围。如果找不到简单的解决方案,我可能会这样做,但是最终,作为大型自动化分析的一部分,我最终将在数十个甚至数百个区域中使用此实用程序,因此我不希望乏味即使非常简单,也可以手动执行。

Answers:


11

我不知道是否可以将一个栅格与另一个栅格一起裁剪,但是您可以使用gdaltindex来构建具有栅格范围的shapefile。

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


4
gdaltindex可以完美地从我的初始栅格中生成一个剪切shapefile。为了解决我使用的问题gdaltindex clipper.shp clipper.tif,其次是gdalwarp -cutline clipper.shp -crop_to_cutline input.tif output.tif
Joe

我使用的是这种方法,但发现在裁剪版本中,有时距离只有一个像素。我认为,在下面的Xavier答案中计算目标范围,然后使用gdalwarp并指定-te_srs来处理不匹配的CRS,会更直接。
乔恩(Jon)

7

对于不规则多边形,并假设您的geotiff栅格文件是二进制栅格,则可以使用GDAL_Calc

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

该查询将填充0(其中Mask.tif <= 0)和BigImage(其中Mask> 0)。为此,两个栅格必须具有相同的像元大小,行和列。要提取相同的范围,请使用GDAL_Translate -projwin ulx uly lrx lry选项(框位于投影坐标中),但要确保projwin框不延伸到任一栅格的边缘。

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

替代从遮罩派生的projwin框的值。


1
+1这是有用的信息,但是我认为我可以使用@lejedi的答案以更少的步骤解决问题。
2014年

4

直接在Python中解决方案,而无需进行成形:

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
注意:仅当它们在同一SRS中时,此解决方案才有效。
Skylion

@Skylion但是,您也可以通过包含-te_srs选项来轻松解决此问题,尽管您还需要使用-te选项来gdalwarp。
乔恩(Jon)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.