You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为TIFF图像添加GeoTag?Python实现遇报错求助

解决TIFF添加GeoTag的问题

错误原因分析

  1. invalid mode 'r+':tifffile的TiffFile类仅支持只读模式(默认'r'),不支持'r+'读写模式。修改TIFF元数据需要先读取原文件内容,再通过TiffWriter写入新文件并附加元数据。
  2. GPS标签格式错误:你构造的GPS数据不符合TIFF/EXIF规范,坐标转换时用np.uint32处理负数会导致数据错误,且GPS标签需要以**子IFD(图像文件目录)**的形式存储,不是简单的字典赋值。

修正后的代码

import tifffile
import numpy as np

# 定义GPS坐标(十进制度,负数用Ref标签处理,坐标本身存正数)
lat_deg = 37.7749
lon_deg = -122.4194

# 将十进制度转换为度分秒的有理数值(分子/分母形式,符合TIFF规范)
def deg_to_dms_rational(deg):
    abs_deg = abs(deg)
    degrees = int(abs_deg)
    minutes = int((abs_deg - degrees) * 60)
    seconds = (abs_deg - degrees - minutes/60) * 3600
    # 返回((度分子, 分母), (分分子, 分母), (秒分子, 分母)),分母用1e6保证精度
    return (
        (degrees, 1),
        (minutes, 1),
        (int(seconds * 10**6), int(10**6))
    )

# 构造符合规范的GPS IFD数据
gps_ifd = {
    0x0001: 'N' if lat_deg >= 0 else 'S',  # GPSLatitudeRef:北纬/南纬
    0x0002: deg_to_dms_rational(lat_deg),  # GPSLatitude:度分秒有理数值
    0x0003: 'E' if lon_deg >= 0 else 'W',  # GPSLongitudeRef:东经/西经
    0x0004: deg_to_dms_rational(lon_deg),  # GPSLongitude:度分秒有理数值
    # 可选:添加其他GPS标签,比如海拔
    # 0x0005: 0,  # GPSAltitudeRef:0表示海平面以上
    # 0x0006: (1000, 1),  # GPSAltitude:海拔1000米,分子分母形式
}

# 读取原TIFF文件的图像数据和元数据
filename = "image_2_normalized.tiff"
with tifffile.TiffFile(filename) as tif:
    image = tif.asarray()
    original_page = tif.pages[0]
    # 复制原标签并添加GPSTag
    tags = original_page.tags.copy()
    # 创建GPS子IFD标签(33550是GPSTag的标准标签ID)
    tags[33550] = tifffile.TiffTag(
        code=33550,
        dtype=tifffile.DATATYPES.IFD,
        value=gps_ifd
    )

# 写入带GPS标签的新TIFF文件
output_filename = "image_with_geotag.tiff"
with tifffile.TiffWriter(output_filename) as writer:
    writer.write(
        image,
        dtype=image.dtype,
        tags=tags,
        # 保留原文件的分辨率等参数
        resolution=original_page.resolution,
        resolutionunit=original_page.resolutionunit
    )

关键说明

  • 模式问题:tifffile不支持原地修改文件,必须通过“读取原文件→修改元数据→写入新文件”的流程实现。
  • 坐标处理:十进制度转度分秒时,用GPSLatitudeRef/GPSLongitudeRef标记南北纬/东西经,坐标本身存正数,避免无符号整数溢出。
  • GPS IFD结构:GPSTag是一个子IFD类型的标签,需要用TiffTag明确指定类型为IFD,值为符合EXIF规范的GPS标签字典。

内容的提问来源于stack exchange,提问作者Adrian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 16:07:42