Gdal: memotong raster dengan raster lain

14

Saya sedang menulis sebuah utilitas sederhana untuk memotong banyak file raster geotiff multi-band ke area yang sama (lebih kecil). Dengan menggunakan gdalwarp, saya dapat dengan mudah memotong file menggunakan shapefile kliping poligon tunggal:

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

Namun, area aktual yang saya ingin klip untuk akan selalu awalnya ditentukan oleh file raster geotiff lain, bukan shapefile. Akan lebih baik jika saya bisa menggunakan tingkat raster itu sebagai file kliping, tapi saya tidak yakin bagaimana melakukan ini. Tidak mengherankan, berikut ini tidak berfungsi (itu tidak menimbulkan kesalahan, itu hanya tidak menghasilkan apa-apa):

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

Jadi, pertanyaan saya adalah, adakah cara untuk memasok raster gdalwarp -cutline? Bergantian, apakah ada fungsi gdal lain yang dapat klip raster menggunakan raster lain? Jika tidak satu pun dari ini yang mungkin, adakah cara yang sangat sederhana untuk menghasilkan shapefile dengan poligon tunggal yang ditentukan oleh tingkat raster?

Kode ini akan dibungkus dengan skrip python yang lebih luas, jadi saya bisa menggunakan utilitas command line gdal atau salah satu binding python untuk gdal.

Sebagai catatan, saya tahu bahwa saya bisa dengan mudah membuat kliping kliping yang mencakup tingkat raster saya di QGIS. Saya mungkin akhirnya melakukan itu jika saya tidak menemukan solusi yang mudah, tetapi pada akhirnya saya akan berakhir menggunakan utilitas ini pada puluhan jika tidak ratusan area sebagai bagian dari analisis otomatis yang besar, jadi saya lebih suka tidak memiliki yang membosankan langkah manual bahkan jika itu sangat mudah.

Joe
sumber

Jawaban:

11

Saya tidak tahu apakah mungkin untuk klip raster dengan raster lain tetapi Anda bisa menggunakan gdaltindex untuk membangun shapefile dengan tingkat raster Anda.

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

lejedi76
sumber
4
gdaltindex bekerja dengan sempurna untuk membuat kliping shapefile dari raster awal saya. Untuk mengatasi masalah yang saya gunakan gdaltindex clipper.shp clipper.tif, diikuti olehgdalwarp -cutline clipper.shp -crop_to_cutline input.tif output.tif
Joe
Saya menggunakan pendekatan ini tetapi menemukan bahwa kadang-kadang ada piksel tunggal dalam versi terpotong. Saya pikir itu lebih mudah untuk menghitung target Anda memperluas a la Xavier jawaban di bawah ini dan kemudian menggunakan gdalwarp dan tentukan -te_srs untuk menangani CRS yang tidak cocok.
Jon
7

Untuk poligon tidak teratur, dan dengan asumsi bahwa file raster geotiff Anda adalah raster biner, Anda bisa menggunakan GDAL_Calc :

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

Kueri ini akan mengisi 0 di mana Mask.tif <= 0 dan BigImage di mana Mask> 0. Untuk melakukan ini, kedua raster harus memiliki ukuran, baris, dan kolom sel yang sama. Untuk mengekstrak luasan yang sama, gunakan GDAL_Translate dengan -projwin ulx uly lrx lryopsi (kotak dalam koordinat yang diproyeksikan), tetapi pastikan bahwa kotak projwin tidak melampaui tepi raster mana pun.

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

Nilai pengganti untuk kotak projwin yang berasal dari Mask.

Michael Stimson
sumber
1
+1 Ini adalah informasi yang berguna, tetapi saya rasa saya bisa menyelesaikan masalah saya dalam beberapa langkah menggunakan jawaban @ lejedi.
Joe
4

Solusi dalam Python secara langsung, tanpa membuat bentuk:

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
sumber
1
NB: Solusi ini hanya berfungsi jika mereka berada di SRS yang sama.
Skylion
@ Skylion Tetapi Anda dapat dengan mudah menjelaskan hal ini dengan memasukkan opsi -te_srs, meskipun Anda juga perlu gdalwarp sebagai gantinya dengan opsi -te.
Jon