python遍历tif文件及裁剪

本文介绍了如何使用Python的glob库遍历不同子文件夹中的tif文件,并利用gdal进行数据裁剪,包括读取、创建输出文件和写入数据的过程。

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

小编得到了一系列tif文件,但是这些文件并不是在一个文件夹内,而是分属于不同的子文件夹,因此,需要将它们从每一个子目录里面抽取出来,然后再对每一个文件进行裁剪,下面是详细的步骤!

1. glob库函数遍历文件

这里主要参考了下面博文中的知识进行文件的遍历

【Python】遍历文件夹下的所有文件(glob)_python glob.glob 遍历文件夹获取文件名称-优快云博客

我需要的是所有子文件夹内的tif文件,所以只需要用到通配符(/**/*.tif)来获取tif文件,如下所示

import glob 

folder_path = '../yourpath'

# 使用glob来获取所有.tif文件的路径
tif_files = glob.glob(folder_path + '/**/*.tif', recursive=True)

如此便获得了116个tif文件 

2. gdal裁剪栅格数据

gdal是进行栅格数据处理的非常实用的python库,它具有丰富的函数可以实现对栅格的裁剪、掩膜、计算等各种各样的功能。

这里,裁剪栅格数据主要分为三个步骤

2.1 读取栅格数据

先利用gdal.Open函数打开tif文件,同时获取文件的长宽、数据类型、仿射变换信息等信息

from osgeo import gdal
import os
import numpy as np
from tqdm import tqdm

# 裁剪出7680*7680的矩形
for tif in tqdm(tif_files):
    img = gdal.Open(tif)
    geotransform = img.GetGeoTransform()
    projection = img.GetProjection()
    width = img.RasterXSize
    height = img.RasterYSize
    datatype = img.GetRasterBand(1).DataType

    out_width = 7680 if width > 7680 else width
    out_height = 7680 if height > 7680 else height

    #输出的数据
    out_data = img.ReadAsArray(0,0,out_width,out_height)

2.2 创建输出文件

先确定创建文件的格式,再输入创建文件的主要参数信息,完成输出tif文件的创建


    # 创建输出文件
    tif_driver = gdal.GetDriverByName('GTiff')
    basename = os.path.basename(tif)
    out_tif = os.path.join('your/out/path/', basename)
    out_img = tif_driver.Create(out_tif, out_width, out_height, 3, datatype)
    # 设置裁剪出来图的原点坐标
    out_img.SetGeoTransform(geotransform)
    # 设置SRS属性(投影信息)
    out_img.SetProjection(projection)

 同时,对于有地理坐标的栅格数据,记得要设置仿射变换和坐标信息

2.3 写入数据

逐波段将数据写入输出文件内,这里面需要注意到的是,写入文件的数据的大小一定要和前面创建的文件的大小(长乘宽)要一致,不然就会报错NoneType!

# 写入数据
    for i in range(3):
        out_img.GetRasterBand(i+1).WriteArray(out_data[i,:,:])
    out_img.FlushCache()
    out_img = None

 这样就顺利完成了对栅格数据的裁剪了。本期内容就到这里!

欢迎大家关注我的博客,我将努力分享一些有用的地理信息数据的处理小知识!

### 使用PythonTIF图像裁剪为256x256像素 为了完成这一任务,可以选择多种库来处理TIF文件并将其裁剪成指定尺寸的小块。常用的选择包括`rasterio`和`gdal`,这两个库都提供了强大的功能用于读取、写入以及操作地理空间数据。 #### 方法一:使用Rasterio库 通过Rasterio可以方便地打开TIFF文件,并按照设定的窗口参数提取子图。下面展示了一个简单的例子,该程序会遍历整个图片区域创建一系列重叠度为零、大小固定为256×256像素的新图像片段[^1]: ```python import rasterio from rasterio.windows import Window def crop_tif_to_patches(input_file, output_folder, patch_size=256): with rasterio.open(input_file) as src: width = src.width height = src.height for col_offset in range(0, width, patch_size): for row_offset in range(0, height, patch_size): window = Window(col_off=col_offset, row_off=row_offset, width=min(patch_size, width - col_offset), height=min(patch_size, height - row_offset)) transform = src.window_transform(window) data = src.read(window=window) profile = src.profile.copy() profile.update({ 'height': window.height, 'width': window.width, 'transform': transform}) out_path = f"{output_folder}/patch_{row_offset}_{col_offset}.tif" with rasterio.open(out_path, "w", **profile) as dst: dst.write(data) crop_tif_to_patches('path/to/input.tif', './patches') ``` 这段代码首先计算了原始图像的高度和宽度,接着利用双重循环迭代每一个可能的位置作为起始点切割出目标尺寸的矩形框;最后调整元数据中的变换矩阵以适应新的坐标系位置,并保存结果至磁盘上新创建的文件中。 #### 方法二:使用GDAL库 另一种方式则是采用GDAL库配合NumPy数组进行更底层的操作。这种方法同样能够达到相同的效果,而且对于某些特定应用场景可能会更加灵活。以下是基于GDAL的一个简单实现方案[^4]: ```python from osgeo import gdal import numpy as np def cut_image_by_gdal(image_path, save_dir, block_xsize=256, block_ysize=256): dataset = gdal.Open(image_path) band_count = dataset.RasterCount xsize = dataset.RasterXSize ysize = dataset.RasterYSize geotransform = dataset.GetGeoTransform() driver = gdal.GetDriverByName('GTiff') for i in range(int(np.ceil(xsize / float(block_xsize)))): for j in range(int(np.ceil(ysize / float(block_ysize)))): start_x = min(i * block_xsize, xsize - block_xsize) end_x = min(start_x + block_xsize, xsize) start_y = min(j * block_ysize, ysize - block_ysize) end_y = min(start_y + block_ysize, ysize) subdataset = dataset.ReadAsArray( int(start_x), int(start_y), int(end_x-start_x), int(end_y-start_y)) new_geotransform = ( geotransform[0]+start_x*geotransform[1], geotransform[1], geotransform[2], geotransform[3]+start_y*geotransform[5], geotransform[4], geotransform[5]) filename = '{}/{}_{}.tif'.format(save_dir,i,j) target_ds = driver.Create(filename, int(end_x-start_x), int(end_y-start_y), band_count, gdal.GDT_Float32) target_ds.SetGeoTransform(new_geotransform) target_ds.SetProjection(dataset.GetProjection()) for k in range(band_count): target_ds.GetRasterBand(k+1).WriteArray(subdataset[k]) cut_image_by_gdal('input.tif','./output/') ``` 此函数接受源路径、输出目录以及其他可选参数如每片切片的具体宽高,默认设置为256x256像素。它会逐一遍历整张地图上的所有潜在起点,从中截取出相应规格的数据块,并连同其地理位置信息一同存储下来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值