提取图片地理位置

引言

在数字化时代,图片已经成为我们生活中不可或缺的一部分。然而,如何从图片中提取有用的信息,尤其是地址信息,一直是一个具有挑战性的问题。Python作为一种强大的编程语言,为我们提供了丰富的工具和库来解决这个问题。本文将介绍如何使用Python从图片中提取地址信息,并分享一些实用的技巧和经验。

一、准备工作

ExifRead==3.0.0
requests==2.31.0

ExifRead: 解析出图片的exif信息,手机拍摄的图片额外携带一些信息,可以通过exif解析出来,比如经纬度

requests: 解析出经纬度之后通过百度地图开发者平台的API接口获取地理位置

二、提取出经纬度

import os
from datetime import datetime
import exifreaddef get_latlng(content):"""获取经纬度"""lat_lng_info = {"lat_key": "GPS GPSLatitudeRef","lat_value": "GPS GPSLatitude","lng_key": "GPS GPSLongitudeRef","lng_value": "GPS GPSLongitude"}for key in lat_lng_info.values():if key not in content:return "", ""lat_list = content[lat_lng_info["lat_value"]].valueslat = int(lat_list[0]) + int(lat_list[1]) / 60 + float(lat_list[2]) / 3600lng_list = content[lat_lng_info["lng_value"]].valueslng = int(lng_list[0]) + int(lng_list[1]) / 60 + float(lng_list[2]) / 3600return lat, lngdef get_size(content):"""获取照片的大小"""w_key = "EXIF ExifImageWidth"l_key = "EXIF ExifImageLength"if w_key in content and l_key in content:return int(str(content[l_key])), int(str(content[w_key]))else:return "", ""def get_time(content):"""获取拍摄时间"""key = "EXIF DateTimeOriginal"if key in content:str_time = str(content[key])return datetime.strptime(str_time, "%Y:%m:%d %H:%M:%S")else:return ""def exif_analysis(image_path):try:print(f"开始分析图片的exit信息:{os.path.basename(image_path)}")f = open(image_path, "rb")content = exifread.process_file(f)length, width = get_size(content)shooting_time = get_time(content)lat, lng = get_latlng(content)f.close()exif_dict = {"name": os.path.basename(image_path),"shooting_time": shooting_time, "lat": lat, "lng": lng,"length": length, "width": width}print(f"exif分析完成,结果:{exif_dict}")return exif_dictexcept Exception:print("exif解析失败")return {}if __name__ == '__main__':image_file = r"test.jpg"result = exif_analysis(image_file)print(result)

运行后结果中可以获取经纬度
在这里插入图片描述

三 通过百度地图开发者平台解析

上一个步骤中已经能获取到经纬度度信息,根据经纬度信息获取详情的地理位置信息可以通过百度地图的开放者平台实现

1 [百度开发者平台](控制台 | 百度地图开放平台 (baidu.com))中创建一个应用

在这里插入图片描述

创建一个应用后,记住应用访问的AK
在这里插入图片描述

设置应用访问的白名单

import os
import requests
from datetime import datetime
import exifreaddef get_latlng(content):"""获取经纬度"""lat_lng_info = {"lat_key": "GPS GPSLatitudeRef","lat_value": "GPS GPSLatitude","lng_key": "GPS GPSLongitudeRef","lng_value": "GPS GPSLongitude"}for key in lat_lng_info.values():if key not in content:return "", ""lat_list = content[lat_lng_info["lat_value"]].valueslat = int(lat_list[0]) + int(lat_list[1]) / 60 + float(lat_list[2]) / 3600lng_list = content[lat_lng_info["lng_value"]].valueslng = int(lng_list[0]) + int(lng_list[1]) / 60 + float(lng_list[2]) / 3600return lat, lngdef get_size(content):"""获取照片的大小"""w_key = "EXIF ExifImageWidth"l_key = "EXIF ExifImageLength"if w_key in content and l_key in content:return int(str(content[l_key])), int(str(content[w_key]))else:return "", ""def get_time(content):"""获取拍摄时间"""key = "EXIF DateTimeOriginal"if key in content:str_time = str(content[key])return datetime.strptime(str_time, "%Y:%m:%d %H:%M:%S")else:return ""def exif_analysis(image_path):try:print(f"开始分析图片的exit信息:{os.path.basename(image_path)}")f = open(image_path, "rb")content = exifread.process_file(f)length, width = get_size(content)shooting_time = get_time(content)lat, lng = get_latlng(content)f.close()exif_dict = {"name": os.path.basename(image_path),"shooting_time": shooting_time, "lat": lat, "lng": lng,"length": length, "width": width}print(f"exif分析完成,结果:{exif_dict}")return exif_dictexcept Exception:print("exif解析失败")return {}def get_address_by_latlng(lat, lng):"""通过经纬度获取地理位置"""try:ak = "百度开发者平台中的AK"url = "http://api.map.baidu.com/reverse_geocoding/v3/?ak=%s&output=json&coordtype=wgs84ll&location=%s, %s" % (ak,lat, lng)print(f"接收到经纬度为:{lat},{lng}")response = requests.get(url)content = response.json()["result"]address_dict = {"detail": content.get("formatted_address"),"country": content["addressComponent"].get("country"),"province": content["addressComponent"].get("province"),"city": content["addressComponent"].get("city"),"district": content["addressComponent"].get("district"),"adcode": content["addressComponent"].get("adcode"),"street": content["addressComponent"].get("street", ""),}print(f"通过经纬度分析地址完成,结果:{address_dict}")return address_dictexcept Exception as e:print(f"通过经纬度获取位置异常:{e}")return {}if __name__ == '__main__':# 上一个步骤中获取的经纬度lat = 30.28670277777778lng = 114.4552027777777result = get_address_by_latlng(lat, lng)print(result)

在这里插入图片描述

四、完整的代码

import os
import requests
from datetime import datetime
import exifreaddef get_latlng(content):"""获取经纬度"""lat_lng_info = {"lat_key": "GPS GPSLatitudeRef","lat_value": "GPS GPSLatitude","lng_key": "GPS GPSLongitudeRef","lng_value": "GPS GPSLongitude"}for key in lat_lng_info.values():if key not in content:return "", ""lat_list = content[lat_lng_info["lat_value"]].valueslat = int(lat_list[0]) + int(lat_list[1]) / 60 + float(lat_list[2]) / 3600lng_list = content[lat_lng_info["lng_value"]].valueslng = int(lng_list[0]) + int(lng_list[1]) / 60 + float(lng_list[2]) / 3600return lat, lngdef get_size(content):"""获取照片的大小"""w_key = "EXIF ExifImageWidth"l_key = "EXIF ExifImageLength"if w_key in content and l_key in content:return int(str(content[l_key])), int(str(content[w_key]))else:return "", ""def get_time(content):"""获取拍摄时间"""key = "EXIF DateTimeOriginal"if key in content:str_time = str(content[key])return datetime.strptime(str_time, "%Y:%m:%d %H:%M:%S")else:return ""def exif_analysis(image_path):try:print(f"开始分析图片的exit信息:{os.path.basename(image_path)}")f = open(image_path, "rb")content = exifread.process_file(f)length, width = get_size(content)shooting_time = get_time(content)lat, lng = get_latlng(content)f.close()exif_dict = {"name": os.path.basename(image_path),"shooting_time": shooting_time, "lat": lat, "lng": lng,"length": length, "width": width}print(f"exif分析完成,结果:{exif_dict}")return exif_dictexcept Exception:print("exif解析失败")return {}def get_address_by_latlng(lat, lng):"""通过经纬度获取地理位置"""try:ak = "百度地图开发者平台中的ak码"url = "http://api.map.baidu.com/reverse_geocoding/v3/?ak=%s&output=json&coordtype=wgs84ll&location=%s, %s" % (ak,lat, lng)print(f"接收到经纬度为:{lat},{lng}")response = requests.get(url)content = response.json()["result"]address_dict = {"detail": content.get("formatted_address"),"country": content["addressComponent"].get("country"),"province": content["addressComponent"].get("province"),"city": content["addressComponent"].get("city"),"district": content["addressComponent"].get("district"),"adcode": content["addressComponent"].get("adcode"),"street": content["addressComponent"].get("street", ""),}print(f"通过经纬度分析地址完成,结果:{address_dict}")return address_dictexcept Exception as e:print(f"通过经纬度获取位置异常:{e}")return {}def main(image_file):image_info = exif_analysis(image_file)lat = image_info.get("lat")lng = image_info.get("lng")result = get_address_by_latlng(lat, lng)return resultif __name__ == '__main__':image_file = r"test.png"result = main(image_file)print(result)

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

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

相关文章

【SGDR】《SGDR:Stochastic Gradient Descent with Warm Restarts》

arXiv-2016 code: https://github.com/loshchil/SGDR/blob/master/SGDR_WRNs.py 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method5 Experiments5.1 Datasets and Metric5.2 Single-Model Results5.3 Ensemble Results5.4 Experiment…

智慧污水井物联网远程监控案例

智慧污水井物联网远程监控案例 在当今数字化转型的浪潮中,智慧水务已成为城市基础设施建设的重要组成部分。其中,基于物联网技术的智慧污水井远程监控系统以其高效、精准、实时的特性,在提升污水处理效能、保障城市水环境安全、实现精细化管…

每日一题 — 水果成篮

思路: 通过阅读上面文字得出问题:就去只有两个种类的最大长度的连续子数组,这时我们可以想到用哈希表来存储数据,记录数据的种类和每个种类的数量。 解法一:暴力递归(right每次遍历完都回退) 解…

oceanbase一键安装

安装文档:https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000642554 软件下载 https://www.oceanbase.com/softwarecenter 安装obd yum install -y yum-utils yum-config-manager --add-repo https://mirrors.aliyun.com/oceanbase/OceanBa…

无线游戏手柄的测试(Windows11系统手柄调试方法)

实物 1、把游戏手柄的无线接收器插入到电脑usb接口中 2、【控制面板】----【查看设备和打印机】 3、【蓝牙和其它设备】--【更多设备和打印机设置】 4、鼠标右键【游戏控制器设置】 5、【属性】 6、【测试】(每个按键是否正常) 7、【校准】(…

稀碎从零算法笔记Day46-LeetCode:互质树

这几天有点懈怠了 题型:树、DFS、BSF、数学 链接:1766. 互质树 - 力扣(LeetCode) 来源:LeetCode 题目描述 给你一个 n 个节点的树(也就是一个无环连通无向图),节点编号从 0 到 …

从“黑箱”到“透明”:云里物里电子标签助力汽车总装数字化转型

“汽车总装”指“汽车产品(包括整车及总成等)的装配”,是把经检验合格的数以百计、或数以千计的各种零部件按照一定的技术要求组装成整车及发动机、变速器等总成的工艺过程,是汽车产品制造过程中最重要的工艺环节之一。 其中&…

算法 囚犯幸存者

题目 主类 public static List<Prisoner> prisoners new ArrayList<Prisoner>(); public static List<Prisoner> remainPrisoners new ArrayList<Prisoner>(); public static Prisoner lastPrisoner null;public static void main(String[] args) …

一款自研Python解释器

项目简介: PikaScript是一个完全重写的超轻量级python引擎,具有完整的解释器,字节码和虚拟机架构,可以在少于4KB的RAM下运行,用于小资源嵌入式系统。相比同类产品,如MicroPython,LuaOS等,资源占用减少85%以上。 入选2021年度 Gitee最有价值开源项目,加入RT-Thread嵌入…

vue3+ts中判断输入的值是不是经纬度格式

vue3ts中判断输入的值是不是经纬度格式 vue代码&#xff1a; <template #bdjhwz"{ record }"><a-row :gutter"8" v-show"!record.editable"><a-col :span"12"><a-input placeholder"经度" v-model:v…

linux使用docker实现redis主从复制和哨兵模式

目录 1. 拉取redis镜像 2.使用可视化redis工具 3. 设置从redis 4.设置哨兵模式 5. 使用docker-compose快速创建 1. 拉取redis镜像 docker pull redis 默认拉取最新的镜像。 然后pull结束后使用docker images检查镜像&#xff1a; 然后docker run创建container容器 首先…

速率再次翻倍!现有SSD显卡又要被强制换代了

去年 AMD Ryzen 7000 和 Intel 第 13 代 CPU 发布的同时&#xff0c;消费级的 PCI-E 5.0 平台出现在了大众视野。 这个用了快 20 年的接口虽然外形上似乎没变过、新老平台通吃&#xff0c;但其实内在已更新了好多个版本了。 和 3.0 换 4.0 一样&#xff0c;5.0、6.0 换代只是时…

【自研网关系列】网关的技术选型以及架构设计

&#x1f308;Yu-Gateway&#xff1a;基于 Netty 与原生 Java 实现&#xff0c;使用 Nacos 作为注册与配置中心。项目实现多种过滤器&#xff0c;包含路由、负载均衡、鉴权、灰度发布等过滤器。 &#x1f308;项目代码地址&#xff1a;GitHub - YYYUUU42/YuGateway-master 如果…

【Linux】进程间通信——system V版本 共享内存

目录 共享内存 原理 实践 shmget() 创建共享内存 shmctl() 删除共享内存 shmat() 挂接进程和共享内存 shmt() 进程和共享内存去关联 共享内存的特性 优势 劣势 用共享内存实现进程间通信 共享内存 原理 两个进程的PCB各自维护着一个进程地址空间。当两个进…

Linux的学习之路:8、Linux调试器-gdb使用

摘要 本章主要是说一下gdb的使用&#xff0c;以及把使用指令放入放个指令手册。 目录 摘要 一、背景 二、使用 1、产生debug文件 2、进入gdb 3、使用指令 三、思维导图 一、背景 Linux调试器gdb的背景主要涉及到Linux程序发布方式和调试需求。 在Linux中&#xff0c…

SpringBoot学习笔记二

SpringBoot学习笔记二 1.SpringBoot配置加载顺序1.1 内部配置加载顺序1.2 外部配置加载顺序 2. SpringBoot整合其他框架2.1 SpringBoot整合Test2.2 SpringBoot整合Redis 1.SpringBoot配置加载顺序 1.1 内部配置加载顺序 同理可知&#xff0c;父项目中的confg下的配置优先级最…

探索Java中的栈:Stack与Deque(ArrayDeque和LinkedList)

文章目录 1. 栈&#xff08;Stack&#xff09;1.1 定义方式1.2 特点1.3 栈的层次结构 2. 双端队列&#xff08;Deque&#xff09;2.1 定义方式及继承关系2.2 特点&#xff1a;2.3 ArrayDeque2.4 LinkedList2.5 Deque 的各种方法2.6 如何选择ArrayDeque和LinkedList 3. 如何选择…

【稳定检索|投稿优惠】2024年生物学与智能计算国际会议 (ICBIC 2024)

2024年生物学与智能计算国际会议 (ICBIC 2024) 2024 International Conference on Biology and Intelligent Computing 【会议简介】 2024年生物学与智能计算国际会议即将在上海召开。本次会议旨在汇聚生物学与智能计算领域的专家学者&#xff0c;共同探讨两者交叉融合的前沿…

【Linux】网络基础(一)

文章目录 一、计算机网络背景1. 网络发展2. 认识“协议” 二、网络协议初识1. 协议分层2. OSI七层模型3. TCP/IP五层&#xff08;或四层&#xff09;模型 三、网络传输基本流程1. 同局域网的两台主机通信数据包封装和分用封装分用 2. 跨网络的两台主机通信 四、网络中的地址管理…

【webrtc】源码下载与编译

目录 下载 下依赖 内存需求 &#xff01;&#xff01; 参考文章 &#xff1a; 下载 (1) windows ,centos上都会报错 &#xff08;2&#xff09; ubuntu A : 在git上设置代理 B fetch通过 ubuntu的界面 proxy设置了代理 这将会拉取webRTC源码&#xff0c;且额外加了a…