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
相关产品推荐
相关产品推荐

