Gdal : 다른 래스터로 래스터 클리핑


14

다중 대역 지오메트리 래스터 파일을 동일한 (더 작은) 영역으로 자르는 간단한 유틸리티를 작성 중입니다. gdalwarp를 사용하여 단일 다각형 클리핑 shapefile을 사용하여 파일을 쉽게자를 수 있습니다.

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

그러나 클립하려는 실제 영역은 항상 shapefile이 아닌 다른 geotiff 래스터 파일로 정의됩니다. 래스터의 범위를 클리핑 파일로 사용할 수 있다면 좋을 것입니다. 그러나 어떻게 해야할지 모르겠습니다. 당연히 다음은 작동하지 않습니다 (오류가 발생하지 않으며 아무것도 생성하지 않습니다).

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

제 질문은 래스터를 공급할 수있는 방법이 gdalwarp -cutline있습니까? 또는 다른 래스터를 사용하여 래스터를자를 수있는 또 다른 gdal 기능이 있습니까? 둘 중 어느 것도 가능하지 않은 경우 래스터의 범위로 정의 된 단일 다각형으로 모양 파일을 생성하는 매우 간단한 방법이 있습니까?

이 코드는 더 광범위한 파이썬 스크립트로 포장되므로 명령 줄 gdal 유틸리티 또는 gdal에 대한 python 바인딩을 사용할 수 있습니다.

참고로, QGIS에서 래스터의 범위를 포함하는 클리핑 모양 파일을 쉽게 만들 수 있다는 것을 알고 있습니다. 간단한 해결책을 찾지 못하면 그렇게 할 수 있지만 큰 자동화 된 분석의 일부로 수백 개의 영역이 아니라면 수십 개 에서이 유틸리티를 사용하여 결국에는 바람을 피울 것이므로 지루하지 않은 것을 선호합니다. 매우 쉬운 경우에도 수동 단계.

답변:


11

다른 래스터로 래스터를자를 수 있는지는 모르겠지만 gdaltindex를 사용하여 래스터의 범위에서 모양 파일을 만들 수 있습니다.

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


4
gdaltindex는 초기 래스터에서 클리핑 모양 파일을 만들기 위해 완벽하게 작동합니다. 문제 I 사용을 해결하기 위해 gdaltindex clipper.shp clipper.tif, 다음gdalwarp -cutline clipper.shp -crop_to_cutline input.tif output.tif

나는이 접근법을 사용하고 있지만 때로는 클리핑 된 버전에서 단일 픽셀 오프라는 것을 알았습니다. 나는 Xavier의 대답을 아래에서 목표 범위를 계산 한 다음 gdalwarp을 사용하고 일치하지 않는 CRS를 처리하기 위해 -te_srs를 지정하는 것이 더 간단하다고 생각합니다.
Jon

7

불규칙한 다각형의 경우 geotiff 래스터 파일이 이진 래스터라고 가정하면 GDAL_Calc를 사용할 수 있습니다 .

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

이 쿼리는 Mask.tif <= 0 인 0과 Mask> 0 인 BigImage를 채 웁니다. 이렇게하려면 두 래스터의 셀 크기, 행 및 열이 같아야합니다. 동일한 범위를 추출하려면 -projwin ulx uly lrx lry옵션 과 함께 GDAL_Translate을 사용하십시오 (상자는 투영 된 좌표에 있음). 그러나 projwin 상자가 래스터의 가장자리 위로 확장되지 않도록하십시오.

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

마스크에서 파생 된 projwin 상자의 값을 대체하십시오.


1
+1 이것은 유용한 정보이지만 @lejedi의 답변을 사용하여 더 적은 단계로 문제를 해결할 수 있다고 생각합니다.
Joe

4

모양을 만들지 않고 직접 파이썬의 솔루션 :

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 옵션과 함께 gdalwarp을 수행해야하지만 -te_srs 옵션을 포함하여이를 쉽게 설명 할 수 있습니다.
Jon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.