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

 更新时间:2023年05月07日 10:10:09   作者:winfredzhang  
这篇文章主要为大家详细介绍了如何使用 Python 的 PIL(Python Imaging Library)库实现从 JPEG 图像中获取经纬度信息,需要的可以参考一下

一、步骤

要从 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)

注意:勾选“坐标反查”。

到此这篇关于Python实现获取照片的地理定位信息的文章就介绍到这了,更多相关Python获取照片地理定位信息内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python reversed函数用法小结

    Python reversed函数用法小结

    reversed函数是Python中的内置函数之一,是对给定的序列返回一个逆序序列的迭代器,需要通过遍历/list/next()等方法获取作用后的值,本文给大家介绍Python reversed函数及用法,感兴趣的朋友一起看看吧
    2023-10-10
  • Python实现绘制Matlab格式的地图边框的示例代码

    Python实现绘制Matlab格式的地图边框的示例代码

    这篇文章主要为大家详细介绍了如何利用Python实现绘制Matlab格式的地图边框,文中的示例代码讲解详细,感兴趣的小伙伴可以动手尝试一下
    2022-09-09
  • 5分钟快速掌握Python定时任务框架的实现

    5分钟快速掌握Python定时任务框架的实现

    这篇文章主要介绍了5分钟快速掌握 Python 定时任务框架,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • opencv-python图像读写模块示例详解

    opencv-python图像读写模块示例详解

    这篇文章主要介绍了opencv-python图像读写模块,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • Python中连接字符串的7种方法小结

    Python中连接字符串的7种方法小结

    Python 提供了将一个或多个字符串连接在一起的多种方法,本文主要介绍了Python中连接字符串的7种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • tensorflow使用CNN分析mnist手写体数字数据集

    tensorflow使用CNN分析mnist手写体数字数据集

    这篇文章主要介绍了tensorflow使用CNN分析mnist手写体数字数据集,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • Python中functools模块函数解析

    Python中functools模块函数解析

    这篇文章主要介绍了Python中functools模块的常用函数解析,分别讲解了functools.cmp_to_key,functools.total_ordering,functools.reduce,functools.partial,functools.update_wrapper和functools.wraps的用法,需要的朋友可以参考下
    2017-03-03
  • Python获取秒级时间戳与毫秒级时间戳的示例代码

    Python获取秒级时间戳与毫秒级时间戳的示例代码

    这篇文章主要介绍了Python获取秒级时间戳与毫秒级时间戳的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • python之Character string(实例讲解)

    python之Character string(实例讲解)

    下面小编就为大家带来一篇python之Character string(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • 使用pyinstaller打包PySide2程序中遇到的问题

    使用pyinstaller打包PySide2程序中遇到的问题

    说到打包,我们就需要用到python程序的打包工具pyinstaller了,这个包安装简单,使用同样简单,下面这篇文章主要给大家介绍了关于使用pyinstaller打包PySide2程序中遇到的问题,需要的朋友可以参考下
    2023-05-05

最新评论