Python遥感开发之解决TIF数据之间行列不一致的问题

本文详细展示了如何使用Python和GDAL库解决遥感TIF数据中的行列不匹配问题,通过代码实例提供步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python遥感开发之解决TIF数据之间行列不一致的问题


前言:主要解决在同一分辨率的情况下,遥感数据之间行和列数据不一致的问题。


1.问题如图所示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

我们发现这两个TIF的分辨率是一样的,都是0.01x0.01,但是tasmax数据比lucc多出一个行和列,我们通过对比发现是多出了第一行和最后一列,只需要把tasmax的数据的第一行和最后一列删除即可。可以使用这两行代码解决问题。

data = np.delete(data, 0, axis=0)#行
data = np.delete(data, 554, axis=1)#列

2.完整代码如下所示

import os

import numpy as np
from osgeo import gdal, gdalnumeric

def read_tif02(filepath):
    data = gdalnumeric.LoadFile(filepath)
    data = data.astype(np.float32)
    a = data[0][0]
    data[data == a] = np.nan
    return data


def save_tif(data, file, output):
    ds = gdal.Open(file)
    shape = data.shape
    driver = gdal.GetDriverByName("GTiff")
    dataset = driver.Create(output, shape[1], shape[0], 1, gdal.GDT_Float32)#以float类型进行存储
    dataset.SetGeoTransform(ds.GetGeoTransform())
    dataset.SetProjection(ds.GetProjection())
    dataset.GetRasterBand(1).WriteArray(data)

def get_data_list(file_path, out = ""):
    list1 = []  # 文件的完整路径
    if os.path.isdir(file_path):
        fileList = os.listdir(file_path)
        if out != "":
            for f in fileList:
                out_data = out + "\\" + f
                list1.append(out_data)
        else:
            for f in fileList:
                pre_data = file_path + '\\' + f  # 文件的完整路径
                list1.append(pre_data)
        return list1

if __name__ == '__main__':
    file_in_list = get_data_list(r"E:\AAWORK\work\yu\tasmax")
    file_out_list = get_data_list(r"E:\AAWORK\work\yu\tasmax",r"E:\AAWORK\work\yu\tasmax01")

    for file_in, file_out in zip(file_in_list,file_out_list):
        print(file_in)
        print(file_out)
        data = read_tif02(file_in)
        print(data.shape)
        data = np.delete(data, 0, axis=0)#行
        data = np.delete(data, 554, axis=1)#列
        print(data.shape)
        # 生成新的tif
        save_tif(data,file_in,file_out)#可以自己指定文件目录

在这里插入图片描述
在这里插入图片描述

你可以使用Python的GDAL库来实现这个目标。以下是一个示例代码,可以将一个tif格式的遥感影像行列为1024x1024: ```python from osgeo import gdal # 打开遥感影像 ds = gdal.Open('your_image.tif') # 获取遥感影像的行列波段数 rows = ds.RasterYSize cols = ds.RasterXSize bands = ds.RasterCount # 获取遥感影像的投影地理换信息 proj = ds.GetProjection() trans = ds.GetGeoTransform() # 计算每个像素的大小 pixel_size_x = abs(trans[1]) pixel_size_y = abs(trans[5]) # 计算新的数 new_cols = 1024 new_rows = 1024 # 计算新的地理换信息 new_trans = (trans[0], pixel_size_x, trans[2], trans[3], -pixel_size_y, trans[5]) # 创建输出遥感影像 driver = gdal.GetDriverByName('GTiff') out_ds = driver.Create('your_output_image.tif', new_cols, new_rows, bands, gdal.GDT_Float32) # 设置输出遥感影像的投影地理换信息 out_ds.SetProjection(proj) out_ds.SetGeoTransform(new_trans) # 读取每个波段的数据,并将影像的行列为1024x1024 for b in range(bands): band = ds.GetRasterBand(b+1) data = band.ReadAsArray(0, 0, cols, rows) new_data = gdal_array.numpy_array(data).astype('float32') new_data = gdal_array.numpy_array(gdal_array.DatasetCopy(src_ds).ReadAsArray(0, 0, new_cols, new_rows)).astype('float32') out_band = out_ds.GetRasterBand(b+1) out_band.WriteArray(new_data) # 关闭数据集 ds = None out_ds = None ``` 这个示例代码将遥感影像的行列数都为1024x1024。新的数可以根据你的需要进修改。注意,如果新的数与原始影像的宽高比例同,会导致影像的形状发生化。如果你需要保持影像的形状,需要根据新的数计算每个像素的大小,并计算新的地理换信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

等待着冬天的风

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

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

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

打赏作者

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

抵扣说明:

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

余额充值