Gdal: cắt một raster với một raster khác


14

Tôi đang viết một tiện ích đơn giản để cắt các lô tệp raster geotiff đa băng tần cho cùng một khu vực (nhỏ hơn). Sử dụng gdalwarp, tôi có thể dễ dàng cắt một tệp bằng cách sử dụng shapefile cắt đa giác đơn:

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

Tuy nhiên, khu vực thực tế tôi muốn quay clip sẽ luôn được xác định ban đầu bởi một tệp raster geotiff khác, không phải là shapefile. Sẽ thật tuyệt nếu tôi có thể sử dụng phạm vi của raster đó làm tệp cắt, nhưng tôi không chắc làm thế nào để làm điều này. Không có gì đáng ngạc nhiên, những điều sau đây không hoạt động (nó không gây ra lỗi, nó chỉ không tạo ra bất cứ điều gì):

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

Vì vậy, câu hỏi của tôi là, có cách nào để cung cấp một raster cho gdalwarp -cutline? Thay phiên, có một chức năng gdal khác có thể cắt một raster bằng cách sử dụng một raster khác? Nếu cả hai điều này đều không thể, thì có một cách rất đơn giản để tạo ra một shapefile với một đa giác duy nhất được xác định theo phạm vi của một raster?

Mã này sẽ được gói trong một tập lệnh python rộng hơn, vì vậy tôi có thể sử dụng các tiện ích gdal dòng lệnh hoặc bất kỳ ràng buộc python nào cho gdal.

Là một lưu ý phụ, tôi biết rằng tôi có thể dễ dàng tạo ra một shapefile cắt bao gồm phạm vi raster của tôi trong QGIS. Tôi có thể sẽ làm điều đó nếu tôi không tìm thấy một giải pháp đơn giản, nhưng cuối cùng tôi sẽ kết thúc việc sử dụng tiện ích này trên hàng chục khu vực nếu không phải là một phần của một phân tích tự động lớn, vì vậy tôi không muốn có một sự tẻ nhạt bước thủ công ngay cả khi nó rất dễ dàng.

Câu trả lời:


11

Tôi không biết liệu có thể quay một raster với một raster khác không nhưng bạn có thể sử dụng gdaltindex để xây dựng shapefile với phạm vi raster của bạn.

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


4
gdaltindex hoạt động hoàn hảo để tạo ra một shapefile cắt từ raster ban đầu của tôi. Để giải quyết vấn đề tôi sử dụng gdaltindex clipper.shp clipper.tif, tiếp theo làgdalwarp -cutline clipper.shp -crop_to_cutline input.tif output.tif
Joe

Tôi đã sử dụng phương pháp này nhưng thấy rằng đôi khi nó chỉ là một pixel trong phiên bản cắt xén. Tôi nghĩ đơn giản hơn là tính toán mục tiêu của bạn mở rộng câu trả lời của la Xavier bên dưới và sau đó sử dụng gdalwarp và chỉ định -te_srs để xử lý CRS không khớp.
Jon

7

Đối với đa giác không đều và giả sử rằng tệp raster geotiff của bạn là raster nhị phân, bạn có thể sử dụng GDAL_Calc :

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

Truy vấn này sẽ điền 0 trong đó Mask.tif <= 0 và BigImage trong đó Mặt nạ> 0. Để thực hiện điều này, cả hai trình quét phải có cùng kích thước ô, hàng và cột. Để trích xuất cùng một phạm vi, hãy sử dụng GDAL_Translate với -projwin ulx uly lrx lrytùy chọn (hộp nằm trong tọa độ chiếu), nhưng đảm bảo rằng hộp projwin không mở rộng ra các cạnh của raster.

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

Giá trị thay thế cho hộp projwin có nguồn gốc từ Mặt nạ.


1
+1 Đây là thông tin hữu ích, nhưng tôi nghĩ rằng tôi có thể giải quyết vấn đề của mình trong ít bước hơn bằng cách sử dụng câu trả lời của @ lejedi's.
Joe

4

Giải pháp trong Python trực tiếp, không tạo hình:

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
NB: Giải pháp này chỉ hoạt động nếu chúng ở cùng SRS.
Skylion

@Skylion Nhưng bạn có thể dễ dàng tính đến điều này bằng cách bao gồm tùy chọn -te_srs, mặc dù bạn cũng cần gdalwarp thay vì với tùy chọn -te.
Jon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.