概要
在地理信息系统(GIS)和遥感领域中,TIFF(Tagged Image File Format)文件是一种常用的图像文件格式,它支持多种图像压缩,并包含丰富的地理空间信息。GDAL(Geospatial Data Abstraction Library)是一个强大的库,用于读写多种格式的地理空间数据。本文将介绍如何使用GDAL在Python中读取TIFF文件的数据和投影信息,并将数据保存为新的GeoTIFF文件。
读取TIFF文件的数据
首先,我们需要定义一个函数来读取TIFF文件中的数据。这个函数将打开TIFF文件,读取第一个波段的数据,并返回一个NumPy数组。
from osgeo import gdal
def get_tif_array(tif_file):
"""
读取TIFF文件的数据并返回为一个NumPy数组。
:param tif_file: TIFF文件的路径。
:return: TIFF文件第一个波段的数据(NumPy数组)或None(如果发生错误)。
"""
try:
# 打开TIFF文件
dataset = gdal.Open(tif_file, gdal.GA_ReadOnly)
if dataset is None:
raise Exception("无法打开 TIFF 文件")
# 获取第一个波段的数据并存储在数组中
band = dataset.GetRasterBand(1)
band_data = band.ReadAsArray()
# 关闭数据集
del dataset # 更优的做法是使用del来确保对象被正确释放
# 返回波段数据的NumPy数组
return band_data
except Exception as e:
print(f"获取 TIFF 数据数组时发生错误:{str(e)}")
return None
读取TIFF文件的投影和仿射信息
接下来,我们需要定义另一个函数来读取TIFF文件的投影和仿射变换信息。这些信息对于理解数据的地理位置和进行空间分析至关重要。
from osgeo import osr
def get_tif_projection(file):
"""
获取TIFF文件的投影和仿射信息。
:param file: TIFF文件的路径。
:return: 一个元组,包含投影信息(字符串)和仿射信息(元组)。
"""
tifData = gdal.Open(file)
projection = tifData.GetProjection()
geotransform = tifData.GetGeoTransform()
# 关闭数据集
del tifData
return projection, geotransform
保存数据为GeoTIFF文件
最后,我们定义一个函数来将NumPy数组保存为GeoTIFF文件,并指定其投影和仿射信息。
def save_array_tif(tifArray, out_Path, projection_info, geotransform_info):
"""
将NumPy数组保存为GeoTIFF文件,并指定其投影和仿射信息。
:param tifArray: 要保存的NumPy数组。
:param out_Path: 输出GeoTIFF文件的路径。
:param projection_info: 目标投影坐标系信息的Proj4字符串或WKT字符串。
:param geotransform_info: 仿射变换信息的元组(六个参数)。
:return: 输出文件的路径。
"""
rows, cols = tifArray.shape
driver = gdal.GetDriverByName('GTiff')
dataset = driver.Create(out_Path, cols, rows, 1, gdal.GDT_Float32)
# 设置仿射变换信息
dataset.SetGeoTransform(geotransform_info)
# 设置投影信息
if 'PROJCS' in projection_info: # 假设projection_info是WKT
dataset.SetProjection(projection_info)
else: # 假设projection_info是Proj4字符串
srs = osr.SpatialReference()
srs.ImportFromProj4(projection_info)
dataset.SetProjection(srs.ExportToWkt())
# 将数组数据写入GeoTIFF文件
dataset.GetRasterBand(1).WriteArray(tifArray)
# 确保数据写入磁盘
dataset.FlushCache()
# 关闭数据集
del dataset
return out_Path
小结
以上三个函数展示了如何使用GDAL在Python中处理TIFF文件的基本操作:读取数据、读取投影和仿射信息、以及保存数据为新的GeoTIFF文件。这些函数可以轻松地集成到更复杂的GIS或遥感数据处理流程中。