Gdal: Bir raster başka bir rasterle kırpma


14

Ben aynı (daha küçük) alana çok bantlı geotiff raster dosyaları toplu kırpmak için basit bir yardımcı program yazıyorum. Gdalwarp kullanarak, tek bir çokgen kırpma şekil dosyası kullanarak bir dosyayı kolayca kırpabilirim:

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

Ancak, kırpmak istediğim gerçek alan her zaman başlangıçta şekil dosyası değil, başka bir geotiff tarama dosyası tarafından tanımlanır. Bu raster boyutunu kırpma dosyası olarak kullanabilsem iyi olurdu, ama bunu nasıl yapacağımdan emin değilim. Şaşırtıcı olmayan bir şekilde, aşağıdakiler işe yaramaz (bir hata oluşturmaz, sadece hiçbir şey üretmez):

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

Benim sorum şu, raster vermenin bir yolu var gdalwarp -cutlinemı? Alternatif olarak, bir raster başka bir raster kullanarak kırpabilen başka bir gdal işlevi var mı? Bunlardan hiçbiri mümkün değilse, bir raster boyutuyla tanımlanan tek bir çokgene sahip bir şekil dosyası oluşturmanın çok basit bir yolu var mı?

Bu kod daha kapsamlı bir python betiğine sarılır, bu yüzden komut satırı gdal yardımcı programlarını veya gdal için python bağlarından birini kullanabilirim.

Bir yan not olarak, QGIS'deki rasterimin kapsamını kolayca kapsayan bir kırpma şekli dosyası yapabileceğimi biliyorum. Basit bir çözüm bulamazsam bunu yapabilirim, ancak sonuçta büyük bir otomatik analizin parçası olarak yüzlerce alanda olmasa bile düzinelerce bu yardımcı programı kullanarak kurtaracağım, bu yüzden sıkıcı olmamayı tercih ederim çok kolay olsa bile manuel adım.

Yanıtlar:


11

Bir raster başka bir rasterle kırpılmasının mümkün olup olmadığını bilmiyorum, ancak radalınızın boyutuyla şekil dosyasını oluşturmak için gdaltindex'i kullanabilirsiniz.

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


4
gdaltindex ilk rasterimden bir kırpma şekli dosyası yapmak için mükemmel çalışıyor. Kullandığım sorunu çözmek için gdaltindex clipper.shp clipper.tif, ardındangdalwarp -cutline clipper.shp -crop_to_cutline input.tif output.tif
Joe

Bu yaklaşımı kullanıyordum, ancak bazen kırpılmış versiyonda tek bir piksel kapalı olduğunu buldum. Bence hedefinizi hesaplamak daha basit bir la Xavier'in cevabını genişletiyor ve ardından gdalwarp'i kullanıyor ve uyumsuz CRS'leri işlemek için -te_srs belirtiyor.
Jon

7

Düzensiz çokgen edinmek ve geotiff raster dosya bir ikili tarama olduğunu varsayarak şunu kullanabilirsiniz GDAL_Calc :

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

Bu sorgu, Mask.tif <= 0 ve BigImage'ın burada Mask> 0 olduğu yerde 0 olacaktır. Bunu yapmak için her iki raster de aynı hücre boyutu, satır ve sütunlar olmalıdır. Aynı uzantıları çıkarmak için GDAL_Translate -projwin ulx uly lrx lryseçeneğini kullanın (kutu öngörülen koordinatlardadır), ancak projwin kutusunun her iki taramanın da kenarları üzerinde olmadığından emin olun.

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

Maske'den türetilen projwin kutusu için değerleri değiştirin.


1
+1 Bu yararlı bilgiler, ancak sorunumu daha az adımda @ lejedi'nin cevabını kullanarak çözebileceğimi düşünüyorum.
Joe

4

Şekil vermeden doğrudan Python'daki çözüm:

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
Not: Bu çözüm yalnızca aynı SRS'de bulunuyorsa çalışır.
Skylion

@Skylion Ancak -te_srs seçeneğini ekleyerek bunu kolayca hesaplayabilirsiniz, ancak -te seçeneği yerine gdalwarp de kullanmanız gerekir.
Jon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.