小编得到了一系列tif文件,但是这些文件并不是在一个文件夹内,而是分属于不同的子文件夹,因此,需要将它们从每一个子目录里面抽取出来,然后再对每一个文件进行裁剪,下面是详细的步骤!
1. glob库函数遍历文件
这里主要参考了下面博文中的知识进行文件的遍历
【Python】遍历文件夹下的所有文件(glob)_python glob.glob 遍历文件夹获取文件名称-CSDN博客
我需要的是所有子文件夹内的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
这样就顺利完成了对栅格数据的裁剪了。本期内容就到这里!
欢迎大家关注我的博客,我将努力分享一些有用的地理信息数据的处理小知识!