使用GDAL w / Python

时间:2018-01-30 21:48:10

标签: python image gis raster gdal

编辑:部分解决方案

在命令行中使用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像素)。仅在文件的坐标系中采用几何,如多边形。我不知道如何在像素和坐标之间进行转换。

2 个答案:

答案 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')