如何用python实现地图定位_基于 PyQt5 实现地图中定位相片拍摄位置

项目简介:本次项目主要学习了如何查找相片中的 Exif 信息,并通过 Exif 信息中的 GPS 数据在百度地图中进行定位标点,以确定相片的拍摄地点。本次实验的目的旨在通过包含 GPS 信息的相片进行取证调查,当然个人娱乐也可以!

一、实验说明

1. Python 版本Python 3.x

2. 知识点

实验中将会学习并实践以下知识点:PyQt5 框架基本GUI组件的使用

PyQt5 中信号和槽的用法

PyQt5 中 QWebView 的基本用法

百度地图 URL API 标点功能的用法

利用 piexif 库实现相片 GPS 信息的提取

3. 效果图

二、理论基础

以下内容整理自百度百科、维基百科,参考链接:

1. Exif

Exif 是一种图像文件格式,它的数据存储与 JPEG 格式是完全相同的。实际上 Exif 格式就是在 JPEG 格式头部插入了数码照片的信息,包括拍摄时的光圈、快门、白平衡、ISO、焦距、日期时间等各种和拍摄条件以及相机品牌、型号、色彩编码、拍摄时录制的声音以及 GPS 全球定位系统数据、缩略图等。这节课我们只用到了 Exif 中的 GPS信息,将 GPS信息 提取出之后,我们就可以用 经纬度 来定位相片拍摄的位置了。

2. PyQt5

PyQt 是由 Phil Thompson 开发的一个创建 GUI 应用程序的工具包。它是 Python 编程语言和 Qt 库的成功融合。目前有两个分支,分别是 PyQt5 和 PyQt4。PyQt4 基于 Qt4 开发,PyQt5 则是 Python 基于 Qt5 开发的。由于 Qt5 相对于 Qt4 来说增加了很多新特性,所以这次实验我们将采用 PyQt5 来实现本次实验的 GUI。

3. 信号与槽

信号 与 槽是 Qt 中的 核心机制。在创建事件循环之后,通过建立信号与槽的连接可以实现对象之间的通信。当信号发射时,连接的槽函数将会自动执行。在 PyQt5 中信号和槽通过 object.signal.connect() 的方式连接。

4. 百度地图-URI API

百度地图URI API是为开发者提供直接调起百度地图产品(百度Web地图、百度地图手机客户端)以满足特定业务场景下应用需求的程序接口,我们只需按照接口规范构造一条标准的URI,就可以在PC和移动端浏览器或移动开发应用中调起百度地图产品,进行地图展示和检索、线路查询、导航等功能,无需进行复杂的地图功能开发。在本次试验中,我们只需要用到百度地图-URI API中的 反地址解析 接口,调用该接口可调起PC或Web百度地图,经过逆地理编码后,以标注形式显示出位置和地址信息,详细文档请参考web端URI API。

三、环境配置

工欲善其事,必先利其器,现在我们就来把我们的开发环境搭建起来。PyQt5 依赖 Qt5,我们先把 Qt 安装上。

新建个下载目录:

mkdr download & cd download

下载 Qt 5.7.0:

wget http://mirror.bit.edu.cn/qtproject/archive/qt/5.7/5.7.0/qt-opensource-linux-x64-5.7.0.run

下载下来可能没有执行权限,我们更改一下权限:

sudo chmod 777 qt-opensource-linux-x64-5.7.0.run

开始安装,一路 next 就可以了:

./qt-opensource-linux-x64-5.7.0.run

接下来安装 PyQt5:

sudo apt-get install python3-pyqt5

这样安装完 PyQt5 默认不带 QWebKit 模块,现在我们需要手动安装一下:

sudo apt-get install python3-pyqt5.qtwebkit

至此我们的开发环境就搭建好了。

四、实现步骤

在代码实现之前我们先看一下我们要实现的效果:

界面用到了 QLineEdit、QPushButton 以及 QWebView。

QLineEdit 允许用户输入或者编辑单行的纯文本,我们用它来显示我们的图片路径。

QPushButon 是一个按钮,当用户点击的时候会发射clicked()信号。我们用它来实现一个选择图片的按钮和定位的按钮。

QWebView 是一个可以显示和编辑Web文档的组件,相当于一个最简单的浏览器,我们用它来加载地图,实现定位功能。

整个过程就是使用 piexif 库获取图片 Exif 信息中的 GPS 数据,并通过 PyQt5 中的 QWebView显示百度地图,并根据百度地图提供的 URI API 在百度地图中定位我们获得的经纬度。

现在来看一下相片定位的效果,同学们最好用自己手机拍摄出的图片来测试。因为上传到网络上的图片一般都会进行处理,Exif 信息可能会丢失,也就无法完成相片拍摄位置的定位。

可以看到地图中标注了一个 红点,这个就是我测试相片的拍摄位置。

五、总结

通过本次实验我们应该对 PyQt5 这个 GUI 库有所了解,并能了解 GUI 应用程序的开发思路。同时应该了解如何从相片中获取 Exif 信息,以及如何用 QWebView 加载百度地图。当然这次实验仅仅利用了 GPS 信息,同学们还可以通过其他信息来扩展一下思路,写一个有用处的脚本。

本项目实现的完整教程和代码详解可以在实验楼查看,立即【开始实验】。

更多Python经典项目:Python全部 - 课程

如果您也想通过实验楼课程的形式分享自己的实践经验,欢迎投稿给我们:项目投稿通道

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

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

相关文章

mysql数据库中的int类型_MySQL中int(M)和tinyint(M)数值类型中M值的意义

在一开始接触MySQL数据库时,对于int(M)及tinyint(M)两者数值类型后面的M值理解是最多能够插入数据库中的值不能大于M;后来工作后,也是一边学习一边使用,之后的理解是其中的M的意思是插入数据库中的值的字符长度不能大于M&#xff…

arquillian_使用Arquillian测试安全的EJB

arquillian从历史上讲,很难测试安全的EJB。 到目前为止,我一直在使用专有技术(如JBossLoginContextFactory)中所述的文章( 使用Arquillian在WildFly 8.1.x上测试安全的EJB)来测试安全的EJB。 在今年Devoxx…

api怎么写_使用Node.js原生API写一个web服务器

Node.js是JavaScript基础上发展起来的语言,所以前端开发者应该天生就会一点。一般我们会用它来做CLI工具或者Web服务器,做Web服务器也有很多成熟的框架,比如Express和Koa。但是Express和Koa都是对Node.js原生API的封装,所以其实不…

C语言预处理命令分类和工作原理

C语言编程过程中,经常会用到如 #include、#define 等指令,这些标识开头的指令被称为预处理指令,预处理指令由预处理程序(预处理器)操作。相比其他编程语言,C/C 语言更依赖预处理器,故在阅读或开…

查看mysql用户权限_mysql 如何查看该数据库用户具有哪些权限?

展开全部背景在了解动态权限之前,我们先回顾下 MySQL 的权限列表。权限列表大体分为服务级别和表级别,列级别以32313133353236313431303231363533e59b9ee7ad9431333433633464及大而广的角色(也是MySQL 8.0 新增)存储程序等权限。我们看到有一个特殊的 SU…

注释嵌套注释_注释,无处不在的注释

注释嵌套注释十年前的2004年 , Java 1.5开始提供注释。 很难想象没有此功能的代码。 实际上,首先引入了注释,以减轻开发人员编写繁琐的样板代码的痛苦,并使代码更具可读性。 考虑一下J2EE 1.4(没有可用的注释&#xff…

a标签跳到另一个页面指定选项卡_HTML常用标签

本篇文章主要是对a、img和table标签用法介绍:a标签:可称为锚元素,主要功能是创建通向其他网页、文件、同一页面的其他位置、电子邮件地址或其他任何url地址的超链接;1.img标签:发出get请求并显示返回的图片1.常用属性&…

c语言也能用模板方法模式?

模式动机在嵌入式的应用场景中,管理资源(例如文件、内存)是一件非常麻烦、非常容易出错的事情。因为在分配资源后,还必须释放资源。例如fopen()打开文件后,必须要使用fclose()来关闭文件,而使用malloc申请内存资源后,就…

cv2 imshow窗口大小_cv2.imshow()图片无法显示

在Pycharm和jupyter notebook中运行cv2.imshow()函数的时候,图片无法正常显示,是因为在运行cv2.imshow()之后,需要使用cv2.waitKey()来保持窗口的显示,用cv2.destroyAllWindows()来关闭窗口。cv2.imshow()后面需要跟随着cv2.waitK…

游戏 服务器 微服务_整体服务器与微服务

游戏 服务器 微服务介绍 刚开始时,由于要求简单,所以应用程序既简单又小。 随着时间的要求和需求的增长,我们的应用程序变得越来越大,越来越复杂。 这就导致了将单片服务器开发和部署为一个单元。 在某种程度上,微服务…

数据与ELF数据节-计算机系统基础题目

实验内容:修改二进制可重定位目标文件“phase1.o”的数据(.data)节内容(不允许修改其他节),使其与main.o模块如下链接后运行时输出目标字符串“123456789”。 实验步骤: 1. 使用objdump工具获得…

sqlserver拼接sql插入table_10个SQL技巧

介 绍为了理解这 10 个 SQL 技巧的价值,首先需要了解下 SQL 语言的上下文。为什么我要在 Java 会议上讨论 SQL 呢?(我可能是唯一一个在 Java 会议上讨论 SQL 的了)下面讲下为什么:从早期开始,编程语言设计者就有这种的愿望&#x…

【C语言笔记】指定初始化器

C99增加了一个新特性:指定初始化器(designated initializer)。利用该特性可以初始化指定的数组元素,也可以初始化指定的结构体变量。本文主要分享:使用指定初始化器初始化数组。例如,只初始化数组中的最后一个元素。对于传统的C初…

本地虚拟机上的docker安装mysql_Linux虚拟机上安装docker,并使用docker安装mysql,tomcat...

1、序言现在在Linux虚拟机上安装程序,越来越多的人都使用docker完成,本次就记录下在虚拟机上安装docker的过程。如果你的windows系统上还没有安装Linux虚拟机,请参考我的上一篇博客:安装Linux虚拟机2、docker简介Docker是一个开源…

java锁性能对比_提高Java的锁性能

java锁性能对比Plumbr是唯一可以通过解释应用程序性能数据来自动检测Java性能问题根本原因的解决方案。 几个月前,我们在Plumbr中引入了锁定线程检测之后,我们开始收到类似于“嘿,太好了,现在我知道是什么导致了性能问题&#xf…

binlog日志_MySQL三大日志binlog、redo log和undo log

点击蓝色“JavaKeeper”关注我哟加个“星标”,一起成长,做牛逼闪闪的技术人Keeper导读:日志是mysql数据库的重要组成部分,记录着数据库运行期间各种状态信息。mysql日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制…

C 语言精髓之变参函数

我们以 printf 这个 very 熟悉的函数为例,来分析一下变参函数。先看下 printf 函数的定义:int printf(const char *fmt, ...){ int i; int len; /* va_list 即 char * */va_list args;va_start(args, fmt); /* 内部使用了 va_arg() */len v…

mysql error 变量_mysql 变量问题

关于mysql5.5数据库中变量的引用的问题.1.有一个数据库是test_num_base,其中有一个test表.我想通过变量的方式获取test的数据.select * from test_num_base.test;使用变量:set Atest_num_base;但是再次访问使用: select * from A.test;报错:ERROR 1064 (42000): You have an er…

lambda捕获this_非捕获Lambda的实例

lambda捕获this大约一个月前,我在Java 8的lambda表达式框架下总结了Brian Goetz的观点 。 目前,我正在研究有关默认方法的文章,令我惊讶的是,我又回到了Java处理lambda表达式的方式。 这两个功能的交集可能会产生微妙但令人惊讶的…

mysql8 安装_MySQL8.x安装使用

1.下载网址https://dev.mysql.com/downloads/mysql/下载要登录,可以使用Oracle账户登录2.安装MySQL服务下载好的解压到D:developer目录下配置MySQL(windows下是my.ini,Linux下是my.cnf)[mysql]# 设置mysql客户端默认字符集default-character-setutf8[mys…