在命令行中使用gdal_translate似乎可以解决问题,即使Python绑定不起作用。
这适用于裁剪GeoTiff从顶部和左侧移除300像素填充并保留下一个2000x2000像素。
gdal_translate -srcwin 300 300 2000 2000 input.tif output.tif
我花了很长时间试图解决这个问题。
我有一系列GEOTiff格式的卫星图像。每个图像都有一个300像素的缓冲区,它与旁边的图像重叠。
目标:我正在尝试裁掉每个图像的300像素缓冲区,然后将其用作GDAL的栅格。
约束: 1)我需要保留与文件关联的所有元数据和坐标系统信息 2)我想完全用Python(没有命令行)
完成这个我尝试过的尝试失败了:
1)使用gdal.translate's srcWin
函数:
raster_data = gdal.Open('image.tif')
x_size = raster_data.RasterXSize
y_size = raster_data.RasterYSize
raster_data_unpadded = gdal.Translate('temp.tif', raster_data,
srcWin = [padding,padding,
x_size - padding*2,
y_size-padding*2])
问题:这会产生没有数据的黑色图像
2)使用PIL
裁剪图片,然后另存为TIF
from PIL import Image
img = Image.open(image.tif)
x_size, y_size = img.size
box = (padding, padding, x_size-padding, y_size - padding)
img_unpadded = img.crop(box)
img_unpadded.save('unpadded_image.tif')
问题:PIL无法保存文件。它只是挂起。试图保存为" .tiff" file产生错误"编码器错误-9"
3)使用Rasterio
with rasterio.open("image.tif") as src:
out_image, out_transform = mask(src, geoms, crop=True)
out_meta = src.meta.copy()
问题:Rasterio似乎不接受像素格式的掩码(例如300像素)。仅在文件的坐标系中采用几何,如多边形。我不知道如何在像素和坐标之间进行转换。
答案 0 :(得分:2)
以下方法应该起作用:
import rasterio
from rasterio.windows import Window
with rasterio.open('input.tif') as src:
window = Window(padding, padding, src.width - 2 * padding, src.height - 2 * padding)
kwargs = src.meta.copy()
kwargs.update({
'height': window.height,
'width': window.width,
'transform': rasterio.windows.transform(window, src.transform)})
with rasterio.open('cropped.tif', 'w', **kwargs) as dst:
dst.write(src.read(window=window))
答案 1 :(得分:0)
似乎PIL不支持旧的.tif
扩展名
您是否尝试使用PIL将文件保存为.tiff
而不是.tif
?
img_unpadded.save('unpadded_image.tiff')