Python实现获取照片的地理定位信息
作者:winfredzhang 发布时间:2023-06-30 01:39:54
一、步骤
要从 JPEG 图像中获取经纬度信息,可以使用 Python 的 PIL(Python Imaging Library)库。以下是一个示例代码,用于从 JPEG 图像中获取经纬度信息并打印出来:
二、源代码
from PIL import Image
from PIL.ExifTags import TAGS, GPSTAGS
def get_exif_data(image_path):
"""
获取 JPEG 图像的 EXIF 数据
"""
exif_data = {}
with Image.open(image_path) as img:
if hasattr(img, '_getexif'):
# 获取所有 EXIF 标签
for tag, value in img._getexif().items():
if tag in TAGS:
exif_data[TAGS[tag]] = value
# 获取 GPSInfo 标签
if 'GPSInfo' in exif_data:
# 解析 GPSInfo 标签中的子标签
gps_data = {}
for gps_tag in exif_data['GPSInfo'].keys():
tag_name = GPSTAGS.get(gps_tag, gps_tag)
gps_data[tag_name] = exif_data['GPSInfo'][gps_tag]
exif_data['GPSInfo'] = gps_data
return exif_data
def get_gps_info(exif_data):
"""
从 EXIF 数据中提取经纬度信息
"""
gps_info = {}
if 'GPSInfo' in exif_data:
# 获取经度
lat = exif_data['GPSInfo']['GPSLatitude']
lat_ref = exif_data['GPSInfo']['GPSLatitudeRef']
# lat_degrees = lat[0][0] / float(lat[0][1])
lat_degrees = lat[0].numerator / float(lat[0].denominator)
# lat_minutes = lat[1][0] / float(lat[1][1])
lat_minutes = lat[1].numerator / float(lat[1].denominator)
# lat_seconds = lat[2][0] / float(lat[2][1])
lat_seconds = lat[2].numerator / float(lat[2].denominator)
lat_direction = lat_ref
gps_info['latitude'] = (lat_degrees + (lat_minutes / 60.0) + (lat_seconds / 3600.0)) * (-1 if lat_direction == 'S' else 1)
# 获取纬度
lon = exif_data['GPSInfo']['GPSLongitude']
lon_ref = exif_data['GPSInfo']['GPSLongitudeRef']
# lon_degrees = lon[0][0] / float(lon[0][1])
lon_degrees = lon[0].numerator / float(lon[0].denominator)
# lon_minutes = lon[1][0] / float(lon[1][1])
lon_minutes = lon[1].numerator / float(lon[1].denominator)
# lon_seconds = lon[2][0] / float(lon[2][1])
lon_seconds = lon[2].numerator / float(lon[2].denominator)
lon_direction = lon_ref
gps_info['longitude'] = (lon_degrees + (lon_minutes / 60.0) + (lon_seconds / 3600.0)) * (-1 if lon_direction == 'W' else 1)
return gps_info
# 测试代码
if __name__ == '__main__':
image_path = r'D:\spiderdocs\FtpServer\IMG_20230302_134126.jpg'
# 修改为你自己的 JPEG 图像路径
exif_data = get_exif_data(image_path)
gps_info = get_gps_info(exif_data)
print('经度:', gps_info['longitude'])
print('纬度:', gps_info['latitude'])
三、代码说明
在上述代码中,我们使用了 if hasattr(img, '_getexif'): 来检查图片是否包含 EXIF 数据。如果包含,就将获取到的 EXIF 数据保存在 exif_data 变量中。然后再使用 if exif_data is None: 来检查 exif_data 是否为 None。如果是,就说明图片没有 EXIF 数据,打印一条消息并返回一个空字典。否则,将 EXIF 数据转换为字典格式并返回。
四、报错1
Traceback (most recent call last):
File "d:\spiderdocs\jpegexifgps.py", line 53, in <module>
exif_data = get_exif_data(image_path)
File "d:\spiderdocs\jpegexifgps.py", line 12, in get_exif_data
for tag, value in img._getexif().items():
AttributeError: 'NoneType' object has no attribute 'items'
五、解决方法1
出现这种情况的原因可能是文件中没有 EXIF 数据或者图片格式不支持 EXIF 数据。为了避免出现这种错误,您可以在调用 _getexif() 方法之前,先检查一下是否存在 _getexif() 方法和返回的 EXIF 数据是否为 None。如果是 None,则说明该图片没有 EXIF 数据,需要相应地处理。
1.打开手机的相机应用,进入相机设置。
2.找到 “地理标记” 或者 “位置信息” 这个选项,打开它。
3.确保允许相机应用访问位置信息。在有些手机上,您需要在设置中打开相机应用的位置权限。
4.如果您希望在每次拍照时都保存经纬度信息,可以选择“始终使用”或“启用”选项。如果您只想在需要时保存位置信息,可以选择“询问每次”选项。
5.拍摄照片时,手机会自动获取当前位置的经纬度信息,并将其保存在照片的 EXIF 数据中。您可以使用一些工具或软件来读取照片的 EXIF 数据,并提取经纬度信息。
请注意,启用位置信息会对手机的电池寿命产生一定影响。如果您不需要在拍照时保存经纬度信息,建议关闭位置信息功能,以延长手机的电池寿命。
六、报错2
Traceback (most recent call last):
File "d:\spiderdocs\jpegexifgps.py", line 57, in <module>
gps_info = get_gps_info(exif_data)
File "d:\spiderdocs\jpegexifgps.py", line 34, in get_gps_info
lat_degrees = lat[0][0] / float(lat[0][1])
TypeError: 'IFDRational' object is not subscriptable
七、解决方法2
这个错误是因为在读取经纬度信息时,使用了 IFDRational 类型的对象来进行下标操作,而 IFDRational 类型并不支持下标操作。
建议检查代码中读取经纬度信息的部分,并确保使用正确的数据类型进行操作。您可以尝试使用 numerator 和 denominator 属性来获取 IFDRational 类型对象的值,例如:
类似地,您也可以使用 longitude[0].numerator 和 longitude[0].denominator 来获取经度的度数。
lat_degrees = lat[0].numerator / float(lat[0].denominator)
八、效果如下所示
九、验证效果如下
1)打开:拾取坐标系统
2)输入框中输入:坐标(如:120.39987897666663,30.128810976666666)
注意:勾选“坐标反查”。
来源:https://blog.csdn.net/winniezhang/article/details/129299744


猜你喜欢
- 背景:周末归纳下mysql的日志文件,其中general_log在mysql入侵中已经用到过,binlog即将会用到。注:mysql版本为5
- 一.图像阈值化图像阈值化(Binarization)旨在剔除掉图像中一些低于或高于一定值的像素,从而提取图像中的物体,将图像的背景和噪声区分
- python matplotlib画图产生的Type 3 fonts字体不兼容更改措施:使用Type 42字体来生成PostScript 和
- 一、hashlib模块什么是哈希模块:hashlib模块是一种加密模块,内部存有多种加密类型加密的作用:可将明文数据进行加密,转换成一串密文
- 视频观看视频入门pygame这是我们教程系列“使用 Pygame 进行游戏开发”的第 1 部分。它适
- 目录引言环境代码实现准备工作获取并存储好友头像信息生成微信好友墙后记引言前段时间,微信朋友圈开始出现了一种晒照片新形式,微信好友墙,即在一张
- 这里推荐使用OTK脚本安装Oracle,会大大提高安装Oracle的成功系数。DescriptionoraToolKit is the Sw
- 在IE中,在使用checkbox或radio时,你会发现有时不能通过CheckBoxObject.checked = true或CheckB
- 句柄(handle)是C++程序设计中经常提及的一个术语。它并不是一种具体的、固定不变的数据类型或实体,而是代表了程序设计中的一个广义的概念
- 单例模式单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保 某一个类只有一个实例存在 。当希望在
- 当前需求:有group和factor两张表,一个group对应多个factor,现在想查询有效的group和对应的有效的factor,两个表
- 1、shutdown normal 正常方式关闭数据库。 2、shutdown imme
- vscode中安装ms-vscode.go插件后可以开启对go语言的支持,ms-vscode.go插件需要依赖一些工具,安装完成后提示goc
- 当需要再次安装SQL Server时,如果序列号找不到了,可以试着从已经安装的实例里找回序列号,因为安装完SQL Server后,序列号(P
- 笛卡尔坐标系对于平面坐标系,任一射线OP与x轴夹角θ的范围,可以取[0,2π)或者(-π,&
- 本文实例为大家分享了vue+element实现图片上传及裁剪的具体代码,供大家参考,具体内容如下随便写的一个小demo 功能是没有任何问题
- format函数实现字符串格式化的功能基本语法为:通过 : 和 {} 来控制字符串的操作一、对字符串进行操作1. 不设置指定位置,按默认顺序
- 如下所示:希望可以从对admin提交的密码加密,并验证电话号码均为数字。查看admin.pyfrom django.contrib impo
- python中函数定义参数有四种形式:def fun1(a,b,c): passdef fun2(a=1,b=2,c=3): &
- 代码如下:vbcrlfvbs常量相当于vbcr & vblf 就是常见的那个 chr(13) & chr(10),用Chr(