使用python提取tiff数据中的地理位置与属性表
本文最后更新于83 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com

在地理信息系统(GIS)和遥感数据分析中,TIFF 文件是一种常用的栅格数据格式,它不仅可以存储图像数据,还可以包含地理参考信息和属性表。本文将介绍如何使用 Python 提取 TIFF 文件中的地理位置信息和属性表,并将其保存为 CSV 文件,以便进一步分析和处理。

一、背景知识

TIFF(Tagged Image File Format)文件格式支持存储地理空间数据,通常包含以下几个重要部分:

  1. 地理参考信息:描述图像在地理坐标系中的位置和投影信息,使得图像可以与实际地理位置对应起来。
  2. 栅格数据:表示地理现象的数值数据,如土地覆盖类型、高程、温度等。
  3. 属性表(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 文件转换为多边形数据,并提取属性表。它包括以下几个步骤:

  1. 打开 TIFF 文件并读取栅格波段。
  2. 检查是否存在与 TIFF 文件关联的 VAT 文件,并尝试读取。
  3. 将栅格数据转换为多边形数据。
  4. 提取多边形的几何信息和属性值。
  5. 如果存在属性表,将多边形数据与属性表合并。
  6. 将结果保存为 CSV 文件。

2. 依赖库

  • GDAL 和 OGR:用于处理地理空间数据,包括打开 TIFF 文件、读取栅格波段、执行栅格转多边形操作等。
  • Pandas:用于数据处理和存储,将提取的多边形数据和属性表合并并保存为 CSV 文件。
  • Geopandas(可选):如果存在 VAT 文件,使用 Geopandas 读取 DBF 格式的属性表。

3. 参数说明

  • tif_path:TIFF 文件的路径。
  • output_csv:输出的 CSV 文件路径,用于保存多边形数据和属性表。
文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇