冰冰雨2.0 2023-12-18 11:51 采纳率: 50%
浏览 4

使用python读取遥感影像中部分数据,并进行重采样

初学python地理数据处理,现在想读取一幅影像中的部分影像,并进行重采样:
使用 GDAL 读取 2012_test.tif 的第 1000 行- 11000 行和第 1000 列- 11000 列,压缩成 2500*2500 尺寸,显示出来,并存储到新数据集。

使用python,我的代码如下:


import matplotlib.pyplot as plt
from osgeo import gdal
import numpy as np

# 打开数据集
fn = r"2012_test.tif"
in_ds = gdal.Open(fn)  # 读取数据
num_bands = in_ds.RasterCount  # 获取数据类型和波段
data_type = in_ds.GetRasterBand(1).DataType
img = np.empty((2500, 2500), dtype=np.uint8)  # 读取数据,并用较小的缓存来存放结果
in_ds.ReadAsArray(1000, 1000, 10000, 10000, 2500, 2500,img)

plt.figure()
plt.imshow(img)
plt.show()

但是出现了报错,

Traceback (most recent call last):
  File "D:\桌面\python\totaltext\课程\删格.py", line 12, in <module>
    in_ds.ReadAsArray(1000, 1000, 10000, 10000, 2500, 2500,img)
  File "D:\python\lib\site-packages\osgeo\gdal.py", line 2508, in ReadAsArray
    return gdal_array.DatasetReadAsArray(self, xoff, yoff, xsize, ysize, buf_obj,
  File "D:\python\lib\site-packages\osgeo\gdal_array.py", line 339, in DatasetReadAsArray
    if len(buf_obj.shape) != 3:
AttributeError: 'int' object has no attribute 'shape'

Process finished with exit code 1

想问一下怎么解决,有具体代码最好

  • 写回答

1条回答 默认 最新

  • 小果运维 2023-12-18 13:55
    关注

    在你的代码中,可能出现了问题,因为传递给 ReadAsArray 的参数不正确。请确认参数传递的顺序和类型是否正确,参数的数量是否符合函数要求。

    另外,根据你的需求,如果想要裁剪和重采样影像,可以考虑以下操作:

    读取原始影像数据
    在内存中裁剪指定行列范围的数据
    使用缩放/插值方法将裁剪后的数据重采样为所需尺寸
    存储重采样后的影像数据到新的数据集

    
    from osgeo import gdal, gdalconst
    
    # 打开影像文件
    input_raster = "2012_test.tif"
    output_raster = "resampled_image.tif"
    
    # 打开影像数据集
    dataset = gdal.Open(input_raster, gdalconst.GA_ReadOnly)
    
    # 定义要裁剪的行和列的范围
    start_col, start_row, num_cols, num_rows = 1000, 1000, 10000, 10000
    
    # 读取部分影像数据
    band = dataset.GetRasterBand(1)  # 获取第一个波段
    data = band.ReadAsArray(start_col, start_row, num_cols, num_rows)
    
    # 计算重采样后的大小
    resampled_cols, resampled_rows = 2500, 2500
    
    # 创建输出数据集
    driver = gdal.GetDriverByName('GTiff')
    output_dataset = driver.Create(output_raster, resampled_cols, resampled_rows, 1, gdal.GDT_Float32)
    
    # 计算重采样后的像素宽度和高度
    resample_x = num_cols / resampled_cols
    resample_y = num_rows / resampled_rows
    
    # 进行重采样
    gdal.ReprojectImage(dataset, output_dataset, None, None, gdalconst.GRA_Bilinear)
    
    # 释放资源
    output_dataset = None
    dataset = None
    
    # 显示影像(这一部分可能需要使用其他库进行)
    # 你可以使用 Matplotlib、OpenCV 等库来显示影像
    # 请参考相关库的文档和示例代码
    
    
    评论

报告相同问题?

问题事件

  • 创建了问题 12月18日

悬赏问题

  • ¥15 12864只亮屏 不显示汉字
  • ¥20 三极管1000倍放大电路
  • ¥15 vscode报错如何解决
  • ¥15 前端vue CryptoJS Aes CBC加密后端java解密
  • ¥15 python随机森林对两个excel表格读取,shap报错
  • ¥15 基于STM32心率血氧监测(OLED显示)相关代码运行成功后烧录成功OLED显示屏不显示的原因是什么
  • ¥100 X轴为分离变量(因子变量),如何控制X轴每个分类变量的长度。
  • ¥30 求给定范围的全体素数p的(p-2)/p的连乘积值
  • ¥15 VFP如何使用阿里TTS实现文字转语音?
  • ¥100 需要跳转番茄畅听app的adb命令