探寻世界:用Python获取照片的地理定位信息

news2024/9/21 22:38:58

目录

步骤:

源代码:

代码说明:

报错1:

解决方法1:

报错2:

解决方法2:

效果如下所示:

验证效果如下:


一、步骤:

要从 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 类型并不支持下标操作。

建议检查代码中读取经纬度信息的部分,并确保使用正确的数据类型进行操作。您可以尝试使用 numeratordenominator 属性来获取 IFDRational 类型对象的值,例如:

类似地,您也可以使用 longitude[0].numeratorlongitude[0].denominator 来获取经度的度数。

lat_degrees = lat[0].numerator / float(lat[0].denominator)

八、效果如下所示:

九、验证效果如下:

1)打开:拾取坐标系统

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/383694.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

投票页面制作线上投票活动制作网络投票制作关注投票制作

现在来说&#xff0c;公司、企业、学校更多的想借助短视频推广自己。通过微信投票小程序&#xff0c;网友们就可以通过手机拍视频上传视频参加活动&#xff0c;而短视频微信投票评选活动既可以给用户发挥的空间激发参与的热情&#xff0c;又可以让商家和企业实现推广的目的&…

2023上海国际电商物流包装产业展览会相约上海

2023年7月5-7日 | 上海新国际博览中心 同期举办&#xff1a;2023上海国际快递物流产业博览会 指导单位&#xff1a;上海市邮政管理局 中国快递协会 主办单位&#xff1a;上海市快递行业协会 上海市仓储与配送行业协会 上海市物流协会 承办单位&#xff1a;上海信世展览服务有…

【NLP相关】GPT-X合集:GPT类模型介绍(附相关论文和Github项目地址)

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️&#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

哈希一致性算法(分布式服务器落点算法)

场景预设和一般hash算法&#xff1a; 先预设一个场景&#xff0c;有10000份文件&#xff0c;需要缓存到五台缓存服务器之上 那么按照最常规&#xff0c;每个服务器平均分配2000份文件 那么用一个取余操作就可以完成 比如说是第2513的图片&#xff0c;那么用一个公式 需要缓…

HTML概述与基本标签

&#x1f31f;所属专栏&#xff1a;HTML只因变凤凰之路&#x1f414;作者简介&#xff1a;rchjr——五带信管菜只因一枚&#x1f62e;前言&#xff1a;该系列将持续更新HTML的相关学习笔记&#xff0c;欢迎和我一样的小白订阅&#xff0c;一起学习共同进步~&#x1f449;文章简…

simplifyEnrichment | 让我来做你的富集结果的瘦身教练吧!~

1写在前面 最近真是烦心啊&#xff0c;事事不顺&#xff0c;找个日子我要找大师算一卦。&#x1f602; 大家基本都会做富集分析&#xff0c;但有时候terms实在太多&#xff0c;读起来真是累&#xff0c;也搞不清到底谁是其中相对重要的。&#x1f972; 之前有一些R包通过计算基…

【告别篇】大家好,再见了,我转行了,在筹备创业

前言 相信大家也一直看到我的博客没有更新过了&#xff0c;我其实很久没有打开过博客了&#xff0c;也就意味着我很长一段时间都在停滞不前&#xff0c;没有了学习的动力。 现在我上来是想跟大家告个别 &#xff1a; 很多粉丝宝宝的私信我看了&#xff0c;但是没有回&#xf…

并查集结构

文章目录并查集特点构建过程查找两个元素是否是同一集合优化查找领头元素设置两个元素为同一集合构建结构应用场景并行计算集合问题并查集特点 对于使用并查集构建的结构&#xff0c;可以使得查询两个元素是否在同一集合&#xff0c;以及合并集合的操作无限接近O(1) 构建过程…

Intellij idea使用Statistic统计代码行数的方法

一、安装Statistic1、打开IDEA2、打开settings进行设置3、选择plugins&#xff0c;搜索Statistic并安装4、下载完成之后&#xff0c;重启IDEA&#xff0c;此时Statistic就安装好了二、使用Statistic1、安装好Statistic之后我们可以通过以下步骤 将Statistic插件的控制台展示出来…

2023年Dubbo常见面试题

2023年Dubbo常见面试题 Dubbo 中 zookeeper 做注册中心&#xff0c;如果注册中心集群都挂掉&#xff0c;发布者和订阅者之间还能通信么&#xff1f; 可以通信的&#xff0c;启动 dubbo 时&#xff0c;消费者会从 zk 拉取注册的生产者的地址接口等数据&#xff0c;缓存在本地。…

3/2考试总结

时间安排 7:30–7:50 读题&#xff0c;T1 貌似是个构造&#xff0c;T2 应该是个圆方树 dp 加上一些神秘的暴力&#xff0c;T3 不知道是啥。 7:50–9:00 T1,发现没法暴力。考虑能不能构造什么的&#xff0c;好像也不好构造。可能是个别的什么东西。手玩样例有一些结论&#xff…

【UE4 Cesium】加载离线地图

主体思路&#xff1a;先使用水经注软件下载瓦片数据&#xff0c;再使用Python转换瓦片数据格式&#xff08;TMS&#xff09;&#xff0c;使用Nginx发布网络服务&#xff0c;最后将网络服务加载到UE中。步骤&#xff1a;使用水经注下载瓦片数据&#xff0c;这里下载的是全球七级…

JavaSE22-集合2-map

文章目录一、集合概念二、map集合1、Map集合的特点2、HashMap2.1 HashMap特点2.2 创建对象2.3 常用方法2.4 遍历2.4.1 使用entrySet遍历2.4.2 使用keySet遍历3、HashMap的key去重原理一、集合概念 集合就是用于存储多个数据的容器。相对于具有相同功能的数组来说&#xff0c;集…

神垕古镇景区三方背后的博弈,争夺许昌第一家5A景区主导权

钧 瓷 内 参 第37期&#xff08;总第368期&#xff09; 2023年3月2日 神垕古镇景区景域&#xff0c;建业&#xff0c;孔家三方背后的博弈&#xff0c;争夺许昌第一家5A景区主导权 在博弈论&#xff08;Game Theory&#xff09;经济学中&#xff0c;“智猪博弈”是一个著名的…

Delphi 中 FireDAC 数据库连接(脱线连接 )

参见&#xff1a;Delphi 中 FireDAC 数据库连接&#xff08;总览&#xff09;述了如何使用FireDAC离线模式&#xff0c;它允许你在没有与数据库持久连接的情况下处理数据。一、概述FireDAC的离线模式类似于多层客户端&#xff0c;大部分时间客户端与数据库断开连接。只有当客户…

给深度学习研究生的入门建议(未完待续ing)

诸神缄默不语-个人CSDN博文目录 本文将系统性介绍深度学习方向&#xff08;准&#xff09;研究生可供参考的入门建议。 我的背景是浙江大学人工智能专业在读硕士&#xff0c;研究方向是GNN、NLP、司法智能。 &#xff08;我的CSDN博文基本涵盖了我所有的深度学习知识&#xff…

pytorch-多层感知机,最简单的深度学习模型,将非线性激活函数引入到模型中。

多层感知机&#xff0c;线性回归和softmax回归在内的单层神经网络。然而深度学习主要关注多层模型。在本节中&#xff0c;我们将以多层感知机&#xff08;multilayer perceptron&#xff0c;MLP&#xff09;为例&#xff0c;介绍多层神经网络的概念。 隐藏层 多层感知机在单层…

Vue环境的搭建和在vscode上的应用(Window10)

Vue环境的搭建 1.安装&#xff1a; 从官网下载安装包&#xff0c;解压到指定位置&#xff0c;就相当于安装完成了。 2.配置环境变量 找到node.js的文件夹&#xff0c;在里面找到src&#xff0c;把路径复制一下。 我在E盘建立了一个文件夹放node&#xff0c;如图找到bin的路径&…

vuecli3打包项目上线之后报错怎么使用本地的sourcemap文件定位调试?

问题 我们上线的时候一般都不会添加sourcemap文件&#xff0c;一方面为了加快构建速度&#xff0c;另一方面避免源码泄漏。所以有时出现报错的时候很难定位问题所在。 例子&#xff1a;比如我写了一个错误的代码&#xff0c;点击 <template><div class"hello&…

QT(58)-VS2010+QT4+QWT5+win32是适配的-其余版本基本不通。

正解&#xff1a; VS2010QT4QWT5win32是适配的。 其余的配置基本不通。 当我用VS2019底下的命令行编译QT库时&#xff1a; 1.编译QWT库。VS2019 QWT5源码 1.选择编译器&#xff1a;4种参数 2.到源码目录下 生成makefile 文件。 3.修改makefile 文件用于指定QT4还是QT5去编译&a…