GDAL重采样与裁剪图像示例

        GDAL重采样,可以通过写文件时改变图像尺寸和geo_transformes的分辨率信息实现。核心代码示例如下:

in_ds = gdal.Open(fi, gdal.GA_ReadOnly)
geotrans = in_ds.GetGeoTransform()
geotrans = list(geotrans)
geoproj = in_ds.GetProjection()
# 更新为采样后分辨率
geotrans[1] = tar_resolution  #
geotrans[5] = -tar_resolution  # 
in_band = in_ds.GetRasterBand(2)
xsize = in_band.XSize
ysize = in_band.YSize
# 重新计算尺寸
ysize_t = int(ysize * img_resolution / tar_resolution)
xsize_t = int(xsize * img_resolution / tar_resolution)
# 按新的尺寸写
out_ds = in_ds.GetDriver().Create(fo_, xsize_t, ysize_t, 1,
                                          in_band.DataType)  # 创建一个构建重采样影像的句柄
out_ds.SetProjection(in_ds.GetProjection())  # 设置投影信息
# 更新geotrans
geotrans = tuple(geotrans)

        GDAL裁切先计算索引,通过索引获取裁切后的图像,同时重新计算geo_transformes里的左上角点坐标。核心代码示例如下:

xsize_t = in_band.XSize
ysize_t = in_band.YSize
# 计算偏移
y_offset = ysize_t - height
x_offset = xsize_t - width
data = in_band.ReadAsArray()

if pro_mode == "r_b": # 假设裁剪右下部分
    # 更新左上角点坐标 
    geotrans[3] = geotrans[3] + geotrans[5] * y_offset
    geotrans[0] = geotrans[0] + geotrans[2] * x_offset
    data = data[y_offset:, x_offset:]

完整代码示例:

from os import makedirs, remove
from os.path import exists, join
from osgeo import gdal
import numpy as np


def get_params(img_info, img_config):
    return img_info["indir"], img_info["outdir"], img_info["img_list"], img_info["img_resolution"], \
           img_info["pro_mode"], img_config["height"], img_config["width"], img_config["channel"], img_config["tar_resolution"]


def large2small(img_info, img_config):
    indir, outdir, img_list, img_resolutions, pro_modes, height, width, channel, tar_resolution = get_params(img_info, img_config)

    for f, img_resolution, pro_mode in zip(img_list, img_resolutions, pro_modes):
        fi = join(indir, f)
        fo_ = join(outdir, "_" + f)
        fo = join(outdir, f)

        # resize image
        in_ds = gdal.Open(fi, gdal.GA_ReadOnly)
        geotrans = in_ds.GetGeoTransform()
        geotrans = list(geotrans)
        geoproj = in_ds.GetProjection()
        geotrans[1] = tar_resolution  # 
        geotrans[5] = -tar_resolution  # 
        in_band = in_ds.GetRasterBand(1)
        xsize = in_band.XSize
        ysize = in_band.YSize
        ysize_t = int(ysize * img_resolution / tar_resolution)
        xsize_t = int(xsize * img_resolution / tar_resolution)
        if exists(fo_):
            remove(fo_)
        out_ds = in_ds.GetDriver().Create(fo_, xsize_t, ysize_t, 1,
                                          in_band.DataType)  # 创建一个构建重采样影像的句柄
        out_ds.SetProjection(in_ds.GetProjection())  # 设置投影信息
        geotrans = tuple(geotrans)
        out_ds.SetGeoTransform(geotrans)  # 设置地理变换信息
        data = np.empty((ysize_t, xsize_t), np.uint8)  # 设置一个与重采样影像行列号相等的矩阵去接受读取所得的像元值
        in_band.ReadAsArray(buf_obj=data)
        out_band = out_ds.GetRasterBand(1)
        out_band.WriteArray(data)
        out_band.FlushCache()
        out_band.ComputeStatistics(False)  # 计算统计信息
        # out_ds.BuildOverviews('average', [1, 2, 4, 8, 16, 32])  # 构建金字塔
        del in_ds  # 删除句柄
        del out_ds

        # reload and clip
        in_ds = gdal.Open(fo_, gdal.GA_ReadOnly)
        geotrans = in_ds.GetGeoTransform()
        geotrans = list(geotrans)
        geoproj = in_ds.GetProjection()
        in_band = in_ds.GetRasterBand(1)
        xsize_t = in_band.XSize
        ysize_t = in_band.YSize
        y_offset = ysize_t - height
        x_offset = xsize_t - width
        data = in_band.ReadAsArray()
        #
        # pro_mode = "l_u"
        if pro_mode == "l_b":
            geotrans[3] = geotrans[3] + geotrans[5] * y_offset
            data = data[y_offset:, :width]
        elif pro_mode == "l_u":
            data = data[:height, :width]
        elif pro_mode == "r_u":
            geotrans[0] = geotrans[0] + geotrans[2] * x_offset
            data = data[:height, x_offset:]
        elif pro_mode == "r_b":
            geotrans[3] = geotrans[3] + geotrans[5] * y_offset
            geotrans[0] = geotrans[0] + geotrans[2] * x_offset
            data = data[y_offset:, x_offset:]

        if exists(fo):
            remove(fo)
        options = ['COMPRESS=LZW']
        out_ds = in_ds.GetDriver().Create(fo, width, height, 1,
                                          in_band.DataType, options=options)  # 创建一个构建重采样影像的句柄
        out_ds.SetProjection(in_ds.GetProjection())  # 设置投影信息
        geotrans = tuple(geotrans)
        out_ds.SetGeoTransform(geotrans)  # 设置地理变换信息
        # data = np.empty((height, width), np.uint8)  # 设置一个与重采样影像行列号相等的矩阵去接受读取所得的像元值
        # in_band.ReadAsArray(buf_obj=data)

        out_band = out_ds.GetRasterBand(1)
        out_band.WriteArray(data)
        out_band.FlushCache()
        out_band.ComputeStatistics(False)  # 计算统计信息
        out_ds.BuildOverviews('average', [1, 2, 4, 8, 16, 32])  # 构建金字塔
        del in_ds  # 删除句柄
        del out_ds

        if exists(fo_):
            remove(fo_)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Python遥感影像重采样,可以使用GDAL(Geospatial Data Abstraction Library)库来实现GDAL是一个开源的地理信息系统(GIS)库,它提供了许多用于处理栅格数据的功能,包括重采样。 下面是一个简单的示例代码,演示如何使用GDAL库进行遥感影像重采样: ```python from osgeo import gdal def resample_image(input_path, output_path, pixel_size): # 打开输入影像 input_ds = gdal.Open(input_path) # 获取输入影像的投影和仿射变换参数 projection = input_ds.GetProjection() geotransform = input_ds.GetGeoTransform() # 获取输入影像的宽度和高度 width = input_ds.RasterXSize height = input_ds.RasterYSize # 计算重采样后的宽度和高度 new_width = int(width / pixel_size) new_height = int(height / pixel_size) # 创建输出影像 driver = gdal.GetDriverByName('GTiff') output_ds = driver.Create(output_path, new_width, new_height, 1, gdal.GDT_Float32) # 设置输出影像的投影和仿射变换参数 output_ds.SetProjection(projection) output_ds.SetGeoTransform((geotransform[0], pixel_size, 0, geotransform[3], 0, -pixel_size)) # 执行重采样 gdal.ReprojectImage(input_ds, output_ds, None, None, gdal.GRA_Bilinear) # 关闭数据集 input_ds = None output_ds = None # 使用示例 input_path = 'input_image.tif' output_path = 'resampled_image.tif' pixel_size = 10 # 新的像素大小(单位:米) resample_image(input_path, output_path, pixel_size) ``` 在上面的示例中,`input_path`是输入影像的路径,`output_path`是重采样后的输出影像的路径,`pixel_size`是新的像素大小,用于指定重采样后每个像素的大小(单位:米)。代码将使用双线性插值进行重采样操作,并将结果保存为GeoTIFF格式的影像文件。 请注意,执行此代码需要安装GDAL库。你可以使用pip安装它:`pip install gdal`。 希望这个示例对你有帮助!如果你有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值