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.找到 &ldquo;地理标记&rdquo; 或者 &ldquo;位置信息&rdquo; 这个选项,打开它。

3.确保允许相机应用访问位置信息。在有些手机上,您需要在设置中打开相机应用的位置权限。

4.如果您希望在每次拍照时都保存经纬度信息,可以选择&ldquo;始终使用&rdquo;或&ldquo;启用&rdquo;选项。如果您只想在需要时保存位置信息,可以选择&ldquo;询问每次&rdquo;选项。

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)

八、效果如下所示

Python实现获取照片的地理定位信息

九、验证效果如下

1)打开:拾取坐标系统

2)输入框中输入:坐标(如:120.39987897666663,30.128810976666666)

注意:勾选&ldquo;坐标反查&rdquo;。

Python实现获取照片的地理定位信息

来源:https://blog.csdn.net/winniezhang/article/details/129299744

标签:Python,照片,信息
0
投稿

猜你喜欢

  • JS关于刷新页面的相关总结

    2024-04-22 12:52:36
  • MySQL 5.0.16乱码问题的解决方法

    2024-01-23 07:07:27
  • MySQL 行转列详情

    2024-01-22 18:19:58
  • python控制台显示时钟的示例

    2023-10-23 12:04:24
  • Golang单元测试与断言编写流程详解

    2024-05-05 09:28:13
  • Mysql存储引擎MyISAM的常见问题(表损坏、无法访问、磁盘空间不足)

    2024-01-14 22:07:53
  • MySQL/MariaDB/Percona数据库升级脚本

    2024-01-21 10:01:09
  • Python向日志输出中添加上下文信息

    2021-01-09 15:04:42
  • pytorch 实现删除tensor中的指定行列

    2023-05-22 14:26:26
  • asp 去除最后一个逗号为空字符串的代码

    2010-06-09 19:18:00
  • 设计性能更优MySQL数据库schema

    2024-01-28 22:22:49
  • mysql存储过程详解

    2024-01-25 22:28:15
  • MySQL中存储过程的详细详解

    2024-01-27 01:41:04
  • 大数据量时提高分页的效率

    2024-01-25 09:07:37
  • 利用python+ffmpeg合并B站视频及格式转换的实例代码

    2021-06-09 21:14:00
  • Python使用 OpenCV 进行图像投影变换

    2021-09-10 03:08:19
  • python肯德尔系数相关性数据分析示例

    2023-02-20 21:42:35
  • python使用cartopy库绘制台风路径代码

    2023-08-22 15:50:18
  • CentOS 7.3上SQL Server vNext CTP 1.2安装教程

    2024-01-27 06:01:48
  • python获取字符串中的email

    2021-04-23 21:23:29
  • asp之家 网络编程 m.aspxhome.com