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

Python使用PIEXIF提取EXIF时如何将DMS坐标转为十进制度数

问题描述

基于Python 3开发,使用PIL、piexif库读取图片EXIF信息的初始脚本存在几处笔误:错误导入print、末尾多余无效字符、未导入pprint模块,修正后初始代码如下:

from pprint import pprint
from PIL import Image
import piexif

codec = 'ISO-8859-1'  # 即latin-1编码

def exif_to_tag(exif_dict):
    exif_tag_dict = {}
    thumbnail = exif_dict.pop('thumbnail')
    exif_tag_dict['thumbnail'] = thumbnail.decode(codec)

    for ifd in exif_dict:
        exif_tag_dict[ifd] = {}
        for tag in exif_dict[ifd]:
            try:
                element = exif_dict[ifd][tag].decode(codec)
            except AttributeError:
                element = exif_dict[ifd][tag]
            exif_tag_dict[ifd][piexif.TAGS[ifd][tag]["name"]] = element

    return exif_tag_dict

def main():
    filename = 'subb.jpeg'  # 替换为实际图片路径
    im = Image.open(filename)

    exif_dict = piexif.load(im.info.get('exif'))
    exif_dict = exif_to_tag(exif_dict)

    pprint(exif_dict['GPS'])

if __name__ == '__main__':
   main()

运行脚本后得到的GPS字段输出为DMS(度分秒)格式:

{'GPSDateStamp': '2022:09:04',
 'GPSLatitude': ((43, 1), (35, 1), (28845, 1277)),
 'GPSLatitudeRef': 'N',
 'GPSLongitude': ((13, 1), (12, 1), (30645, 1024)),
 'GPSLongitudeRef': 'E'}

需要实现将上述DMS格式的GPS坐标转换为十进制度数格式。

实现方法

转换规则

EXIF存储的DMS坐标每个分量均为(分子, 分母)的有理数元组,转换遵循以下规则:

  • 每个分量实际值 = 分子 / 分母,从左到右依次对应度、分、秒三个维度
  • 十进制度基础计算公式:十进制度 = 度 + 分/60 + 秒/3600
  • 符号修正规则:纬度参考为S(南纬)时结果取负值,经度参考为W(西经)时结果取负值;参考为N(北纬)、E(东经)时保持正值

转换代码

编写专门的坐标转换函数:

def dms_to_decimal(dms_tuple, ref):
    # 分别计算度、分、秒的实际值
    degree = dms_tuple[0][0] / dms_tuple[0][1]
    minute = dms_tuple[1][0] / dms_tuple[1][1]
    second = dms_tuple[2][0] / dms_tuple[2][1]
    
    decimal = degree + minute / 60 + second / 3600
    # 南纬、西经坐标取负
    if ref in ['S', 'W']:
        decimal = -decimal
    return decimal

调用方式

在原有main函数中读取到GPS信息后直接调用转换函数即可:

def main():
    filename = 'subb.jpeg'
    im = Image.open(filename)

    exif_dict = piexif.load(im.info.get('exif'))
    exif_dict = exif_to_tag(exif_dict)
    gps_info = exif_dict['GPS']

    # 转换经纬度为十进制度
    lat = dms_to_decimal(gps_info['GPSLatitude'], gps_info['GPSLatitudeRef'])
    lon = dms_to_decimal(gps_info['GPSLongitude'], gps_info['GPSLongitudeRef'])
    print(f"十进制度坐标:纬度{lat:.6f}, 经度{lon:.6f}")

针对给出的示例GPS数据,转换结果为:

  • 纬度:约43.589608°
  • 经度:约13.208312°

注意:部分图片EXIF可能缺失GPS参考字段,或者存储的DMS值分母为0,实际生产使用时需要增加异常捕获逻辑避免程序报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:36:15