本文最后更新于83 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
在地理信息系统(GIS)和遥感数据分析中,TIFF 文件是一种常用的栅格数据格式,它不仅可以存储图像数据,还可以包含地理参考信息和属性表。本文将介绍如何使用 Python 提取 TIFF 文件中的地理位置信息和属性表,并将其保存为 CSV 文件,以便进一步分析和处理。
一、背景知识
TIFF(Tagged Image File Format)文件格式支持存储地理空间数据,通常包含以下几个重要部分:
- 地理参考信息:描述图像在地理坐标系中的位置和投影信息,使得图像可以与实际地理位置对应起来。
- 栅格数据:表示地理现象的数值数据,如土地覆盖类型、高程、温度等。
- 属性表(VAT – Value Attribute Table):与栅格数据中的值相对应的属性信息,例如某个土地覆盖类型的名称或描述。
为了处理这类数据,我们需要使用一些专门的 Python 库,如 GDAL(Geospatial Data Abstraction Library)和其 Python 绑定(osgeo 模块),以及用于数据处理的 pandas 库。
二、代码实现
以下是完整的 Python 代码,用于将 TIFF 文件转换为多边形数据并提取属性表:
from osgeo import gdal, ogr
import pandas as pd
import os
import json
def tif_to_polygons_with_attributes(tif_path, output_csv):
"""将TIF文件转换为多边形(面数据)并提取属性表"""
print(f"正在处理TIF文件: {tif_path}")
# 1. 打开TIF文件
dataset = gdal.Open(tif_path)
if dataset is None:
print(f"无法打开文件: {tif_path}")
return False
# 2. 读取栅格波段
band = dataset.GetRasterBand(1)
# 3. 检查是否有VAT (Value Attribute Table) 文件
vat_dbf = tif_path + '.vat.dbf'
attr_df = None
if os.path.exists(vat_dbf):
try:
import geopandas as gpd
print(f"找到VAT文件,尝试读取: {vat_dbf}")
attr_df = gpd.read_file(vat_dbf)
print(f"成功读取属性表,包含 {len(attr_df)} 行, {len(attr_df.columns)} 列")
except Exception as e:
print(f"读取VAT文件失败: {str(e)}")
# 4. 创建内存中的矢量数据源
print("正在将栅格转换为多边形...")
drv = ogr.GetDriverByName("Memory")
dst_ds = drv.CreateDataSource("memory")
dst_layer = dst_ds.CreateLayer('polygons', srs=None)
# 添加字段
fd = ogr.FieldDefn('Value', ogr.OFTInteger)
dst_layer.CreateField(fd)
# 执行栅格转多边形
gdal.Polygonize(band, None, dst_layer, 0, [], callback=None)
# 5. 提取多边形和属性
print("正在提取多边形数据...")
polygons = []
values = []
for feature in dst_layer:
value = feature.GetField('Value')
geom = feature.GetGeometryRef()
if geom is not None:
# 导出为GeoJSON格式
geojson = geom.ExportToJson()
polygons.append(geojson)
values.append(value)
print(f"提取了 {len(polygons)} 个多边形")
# 6. 创建多边形DataFrame
poly_df = pd.DataFrame({
'Value': values,
'geometry': polygons
})
# 7. 如果有属性表,合并属性
if attr_df is not None:
# 寻找关联字段
key_field = None
for field in ['Value', 'VALUE', 'OID']:
if field in attr_df.columns:
key_field = field
break
if key_field:
print(f"使用字段 '{key_field}' 关联属性")
# 将attr_df中的key_field列重命名为'Value'(如果需要)
if key_field != 'Value':
attr_df = attr_df.rename(columns={key_field: 'Value'})
# 合并
poly_df = poly_df.merge(attr_df, on='Value', how='left')
print(f"关联后的数据集包含 {len(poly_df)} 行")
# 8. 保存到CSV文件
poly_df.to_csv(output_csv, index=False, encoding='utf-8-sig')
print(f"已将多边形数据和属性保存到: {output_csv}")
# 9. 显示属性表信息
print("\n属性表包含以下列:")
for col in poly_df.columns:
print(f" - {col}")
print("\n属性表前5行示例:")
print(poly_df.head())
return True
def main():
# 设置TIF文件路径
tif_path = 'path/to/your/file.tif'
output_csv = 'output.csv'
# 执行转换和提取
tif_to_polygons_with_attributes(tif_path, output_csv)
if __name__ == "__main__":
main()
三、代码说明
1. 函数功能
tif_to_polygons_with_attributes
函数的主要功能是将 TIFF 文件转换为多边形数据,并提取属性表。它包括以下几个步骤:
- 打开 TIFF 文件并读取栅格波段。
- 检查是否存在与 TIFF 文件关联的 VAT 文件,并尝试读取。
- 将栅格数据转换为多边形数据。
- 提取多边形的几何信息和属性值。
- 如果存在属性表,将多边形数据与属性表合并。
- 将结果保存为 CSV 文件。
2. 依赖库
- GDAL 和 OGR:用于处理地理空间数据,包括打开 TIFF 文件、读取栅格波段、执行栅格转多边形操作等。
- Pandas:用于数据处理和存储,将提取的多边形数据和属性表合并并保存为 CSV 文件。
- Geopandas(可选):如果存在 VAT 文件,使用 Geopandas 读取 DBF 格式的属性表。
3. 参数说明
tif_path
:TIFF 文件的路径。output_csv
:输出的 CSV 文件路径,用于保存多边形数据和属性表。