【Python&RS】GDAL对栅格数据重采样/对齐栅格

        GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。

        Python的GDAL库作为栅格数据的处理转换库,其支持几百种栅格数据格式,如常见的TIFF、ENVI、HFA、HDF4等。因为遥感影像大部分都是栅格数据,所以GDAL库非常适合处理遥感影像、如光谱指数计算、波段合成、批量下载等。

        栅格重采样是一种将栅格数据从一个分辨率变换为另一个分辨率的处理方法。它通常用于将高分辨率数据转换为低分辨率数据,或者将低分辨率数据转换为高分辨率数据。重采样的目的是改变栅格数据的像素大小,使之与目标分辨率相匹配,以便更好地适应不同的分析需求。常见的重采样方法包括最邻近插值、双线性插值、双三次插值等。

1.导入GDAL库

from osgeo import gdal

2.获取参考影像的基本空间信息(宽高、投影信息、仿射地理参数、波段数等)

ds_refer = gdal.Open(path_refer, gdal.GA_ReadOnly)  # 打开数据集dataset
proj_refer = ds_refer.GetProjection()  # 获取投影信息
trans_refer = ds_refer.GetGeoTransform()  # 获取仿射地理变换参数
band_refer = ds_refer.GetRasterBand(1)    # 获取波段
width_refer = ds_refer.RasterXSize  # 获取数据宽度
height_refer = ds_refer.RasterYSize  # 获取数据高度
bands_refer = ds_refer.RasterCount  # 获取波段数

3.打开需要重采样的影像数据,获取其投影信息

ds_resample = gdal.Open(path_resample, gdal.GA_ReadOnly)  # 打开数据集dataset
proj_resample = ds_resample.GetProjection()  # 获取输入影像的投影信息

4.注册数据驱动,将参考影像的宽、高、波段数等空间参数写入驱动中,并将仿射地理变换参数和投影信息写入驱动。

driver = gdal.GetDriverByName('GTiff')  # 定义输出的数据资源
ds_output = driver.Create(out_path_resample, width_refer, height_refer, bands_refer, band_refer.DataType)  # 创建重采样影像
ds_output.SetGeoTransform(trans_refer)  # 设置重采样影像的仿射地理变换
ds_output.SetProjection(proj_refer)  # 设置重采样影像的投影信息

5.执行重采样函数,将需要重采样的影像数据按照参考影像的空间参数写入新的栅格数据中。

        在gdal.ReprojectImage函数中输入需要重采样的栅格数据集、输出路径、原始投影信息、目标投影信息、重采样方式、回调函数即可。

gdal.ReprojectImage(ds_resample, ds_output, proj_resample, proj_refer, gdal.GRA_Bilinear, 0.0, 0.0,)
# 输入数据集、输出数据集、输入投影、参考投影、重采样方法(最邻近内插\双线性内插\三次卷积等)、回调函数

6.完整代码:

        所需输入的变量已经在代码中表明,可以自己修改相关路径

def resample_images(path_refer, path_resample, out_path_resample):  # 影像重采样
    print("正在进行栅格重采样。。。")
    """
    :param path_refer: 重采样参考文件路径
    :param path_resample: 需要重采样的文件路径
    :param out_path_resample: 重采样后的输出路径
    """
    ds_refer = gdal.Open(path_refer, gdal.GA_ReadOnly)  # 打开数据集dataset
    proj_refer = ds_refer.GetProjection()  # 获取投影信息
    trans_refer = ds_refer.GetGeoTransform()  # 获取仿射地理变换参数
    band_refer = ds_refer.GetRasterBand(1)    # 获取波段
    width_refer = ds_refer.RasterXSize  # 获取数据宽度
    height_refer = ds_refer.RasterYSize  # 获取数据高度
    bands_refer = ds_refer.RasterCount  # 获取波段数
    ds_resample = gdal.Open(path_resample, gdal.GA_ReadOnly)  # 打开数据集dataset
    proj_resample = ds_resample.GetProjection()  # 获取输入影像的投影信息
    driver = gdal.GetDriverByName('GTiff')  # 定义输出的数据资源
    ds_output = driver.Create(out_path_resample, width_refer, height_refer, bands_refer, band_refer.DataType)  # 创建重采样影像
    ds_output.SetGeoTransform(trans_refer)  # 设置重采样影像的仿射地理变换
    ds_output.SetProjection(proj_refer)  # 设置重采样影像的投影信息
    gdal.ReprojectImage(ds_resample, ds_output, proj_resample, proj_refer, gdal.GRA_Bilinear, 0.0, 0.0,)
    # 输入数据集、输出数据集、输入投影、参考投影、重采样方法(最邻近内插\双线性内插\三次卷积等)、回调函数

        这里的重采样原理是将需要重采样的数据依据已有数据的格式类型写入新的栅格中,可以解决两个栅格空间位置对不齐,无法进行数组计算的问题。但是否能将栅格数据从高分辨率降低到低分辨率,或是低分辨率到高分辨率,博主无从得知。如果有小伙伴用上诉方法实现了这种操作,可以留言告诉我。

         如果大家在学习Python或者RS时有什么问题,可以随时留言交流!如果大家对批量处理有兴趣同样可以留言给博主,博主会分享相关代码以供学习!

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
对于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`。 希望这个示例对你有帮助!如果你有任何其他问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RS迷途小书童

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值