【Python入门教程】获取图片可视化精准定位(逆地理编码)
- 使用exifread库读取图片的经纬度信息(WGS84坐标)
- 使用高德开放API将经纬度转为高德底图经纬度,并输出具体位置
- 使用folium库,以高德底图为基准,在网页上可视化显示地图和兴趣点
一、获取图片经纬度
之前发过类似的文章,这里就不赘述了。下面代码中有相应注释。
def Get_LatLon(path_image):
"""
:param path_image: 输入图片路径
:return: 返回纬度、经度
"""
# 获取图片的经纬度信息
f = open(path_image, 'rb')
contents = exifread.process_file(f)
longitude = contents["GPS GPSLongitude"].values
longitude_f = longitude[0].num/longitude[0].den + (longitude[1].num/longitude[1].den/60) + (longitude[2].num/longitude[2].den/3600)
latitude = contents["GPS GPSLatitude"].values
latitude_f = latitude[0].num/latitude[0].den + (latitude[1].num/latitude[1].den/60) + (latitude[2].num/latitude[2].den/3600)
# print("经度:", longitude_f) # contents['GPS GPSLatitudeRef']
# print("纬度:", latitude_f) # contents['GPS GPSLongitudeRef']
f.close()
return latitude_f, longitude_f

二、高德开放API将经纬度转为高德底图经纬度,并输出具体位置
1.注册账号,获取key
打开高德开放平台,注册账号后点击控制台。点击我的应用,然后创建应用后就会得到一个key。对于地理编码官方也有说明文档,可以自行参考。
2.使用高德开放API将经纬度转为高德底图经纬度,并输出具体位置
def Get_address(latitude_f2, longitude_f2):
"""
:param latitude_f2: 输入WGS84纬度
:param longitude_f2: 输入WGS84经度
:return: 返回地址、高德经纬度
"""
key = '**********'
# 高德地图api
url_lonlat = f'https://restapi.amap.com/v3/assistant/coordinate/convert?locations=%s,%s&coordsys=gps' \
f'&output=json&key={key}' % (longitude_f2, latitude_f2)
r_lonlat = requests.get(url_lonlat)
gaode_lonlat = r_lonlat.json()['locations']
# 获取高德经纬度
url_address = f'https://restapi.amap.com/v3/geocode/regeo?output=json&location=%s&key={key}' \
f'&radius=1000&extensions=all' % gaode_lonlat
r_address = requests.get(url_address)
gaode_address = r_address.json()['regeocode']['formatted_address']
# 获取经纬度对应的详细地址
return gaode_address, gaode_lonlat

三、folium库以高德底图为基准在网页上可视化显示地图和兴趣点
def Show_map(address1, lonlat):
"""
:param address1: 高德地址
:param lonlat: 高德经纬度
:return: 打开html,可视化地图
"""
tiles1 = 'http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}'
# 高德底图api
map_url = folium.Map([float(lonlat.split(',')[1]), float(lonlat.split(',')[0])],
tiles=tiles1,
attr="© <a href=http://ditu.amap.com/>高德地图</a>",
zoom_start=15,
control_scale=True,
)
# 底图的基本设置
folium.Marker(
location=[float(lonlat.split(',')[1]), float(lonlat.split(',')[0])],
popup=folium.Popup('%s' % address1, max_width=20),
icon=folium.Icon(color='red', icon='info-sign') # 标记颜色图标
).add_to(map_url)
# 添加标记点
folium.Circle(
radius=3000,
location=[float(lonlat.split(',')[1]), float(lonlat.split(',')[0])],
popup=folium.Popup('范围', max_width=20),
color="crimson",
fill=False,
).add_to(map_url)
# 添加圆圈
map_url.add_child(folium.ClickForMarker(popup="新点"))
# 添加新点
map_url.add_child(plugins.MeasureControl(position='topleft'))
# 地图测距离
map_url.add_child(folium.LatLngPopup())
# 经纬度查询
map_url.save('map.html')
# 保存为html
webbrowser.open('map.html')

四、完整代码
记得自己修改key和图片路径!
# -*- coding: utf-8 -*-
"""
@Time : 2023/6/1 15:29
@Auth : RS迷途小书童
@File :Positioning based on images.py
@IDE :PyCharm
@Purpose :通过图片获取其准确位置并在网页上可视化
"""
import exifread
import requests
import folium
# 地图模块
import webbrowser
# 浏览器调用
from folium import plugins
def Get_LatLon(path_image):
"""
:param path_image: 输入图片路径
:return: 返回纬度、经度
"""
# 获取图片的经纬度信息
f = open(path_image, 'rb')
contents = exifread.process_file(f)
longitude = contents["GPS GPSLongitude"].values
longitude_f = longitude[0].num/longitude[0].den + (longitude[1].num/longitude[1].den/60) + (longitude[2].num/longitude[2].den/3600)
latitude = contents["GPS GPSLatitude"].values
latitude_f = latitude[0].num/latitude[0].den + (latitude[1].num/latitude[1].den/60) + (latitude[2].num/latitude[2].den/3600)
# print("经度:", longitude_f) # contents['GPS GPSLatitudeRef']
# print("纬度:", latitude_f) # contents['GPS GPSLongitudeRef']
f.close()
return latitude_f, longitude_f
def Get_address(latitude_f2, longitude_f2):
"""
:param latitude_f2: 输入WGS84纬度
:param longitude_f2: 输入WGS84经度
:return: 返回地址、高德经纬度
"""
key = '*******'
# 高德地图api
url_lonlat = f'https://restapi.amap.com/v3/assistant/coordinate/convert?locations=%s,%s&coordsys=gps' \
f'&output=json&key={key}' % (longitude_f2, latitude_f2)
r_lonlat = requests.get(url_lonlat)
gaode_lonlat = r_lonlat.json()['locations']
# 获取高德经纬度
url_address = f'https://restapi.amap.com/v3/geocode/regeo?output=json&location=%s&key={key}' \
f'&radius=1000&extensions=all' % gaode_lonlat
r_address = requests.get(url_address)
gaode_address = r_address.json()['regeocode']['formatted_address']
# 获取经纬度对应的详细地址
return gaode_address, gaode_lonlat
def Show_map(address1, lonlat):
"""
:param address1: 高德地址
:param lonlat: 高德经纬度
:return: 打开html,可视化地图
"""
tiles1 = 'http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}'
# 高德底图api
map_url = folium.Map([float(lonlat.split(',')[1]), float(lonlat.split(',')[0])],
tiles=tiles1,
attr="© <a href=http://ditu.amap.com/>高德地图</a>",
zoom_start=15,
control_scale=True,
)
# 底图的基本设置
folium.Marker(
location=[float(lonlat.split(',')[1]), float(lonlat.split(',')[0])],
popup=folium.Popup('%s' % address1, max_width=20),
icon=folium.Icon(color='red', icon='info-sign') # 标记颜色图标
).add_to(map_url)
# 添加标记点
folium.Circle(
radius=3000,
location=[float(lonlat.split(',')[1]), float(lonlat.split(',')[0])],
popup=folium.Popup('范围', max_width=20),
color="crimson",
fill=False,
).add_to(map_url)
# 添加圆圈
map_url.add_child(folium.ClickForMarker(popup="新点"))
# 添加新点
map_url.add_child(plugins.MeasureControl(position='topleft'))
# 地图测距离
map_url.add_child(folium.LatLngPopup())
# 经纬度查询
map_url.save('map.html')
# 保存为html
webbrowser.open('map.html')
if __name__ == "__main__":
file_image = "G:/721_0211_W.jpeg"
latitude_f1, longitude_f1 = Get_LatLon(file_image)
# 输入图片路径,获取WGS84经纬度
address, lonlat = Get_address(latitude_f1, longitude_f1)
# 获取高德地址和经纬度
Show_map(address, lonlat)
# 在网页上可视化显示

本文章主要是分享个人在学习Python过程中写过的一些代码。有些部分参考了前人以及官网的教程,如有侵权请联系作者删除,大家有问题可以随时留言交流,博主会及时
【Python入门教程】获取图片可视化精准定位(逆地理编码)的更多相关文章
- Linux pwn入门教程(10)——针对函数重定位流程的几种攻击
作者:Tangerine@SAINTSEC 本系列的最后一篇 感谢各位看客的支持 感谢原作者的付出一直以来都有读者向笔者咨询教程系列问题,奈何该系列并非笔者所写[笔者仅为代发]且笔者功底薄弱,故无法解 ...
- 毫无基础的人入门Python,Python入门教程
随着人工智能的发展,Python近两年也是大火,越来越多的人加入到Python学习大军,对于毫无基础的人该如何入门Python呢?这里整理了一些个人经验和Python入门教程供大家参考. 如果你是零基 ...
- VB6 GDI+ 入门教程[6] 图片
http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[6] 图片 2009 年 6 月 19 日 15条评论 ...
- 老鸟的Python入门教程
转自老鸟的Python入门教程 重要说明 这不是给编程新手准备的教程,如果您入行编程不久,或者还没有使用过1到2门编程语言,请移步!这是有一定编程经验的人准备的.最好是熟知Java或C,懂得命令行,S ...
- Python入门教程完整版(懂中文就能学会)
前几天给大家分享<从零学会Photoshop经典教程300集>的教程受到了广泛的关注,有人不知道怎么领取,居然称小编为"骗子". 不过小编的内心是强大的,网友虐我千百遍 ...
- 2018-06-21 中文代码示例视频演示Python入门教程第五章 数据结构
知乎原链 续前作: 中文代码示例视频演示Python入门教程第四章 控制流 对应在线文档: 5. Data Structures 这一章起初还是采取了尽量与原例程相近的汉化方式, 但有些语义较偏(如T ...
- 2018-06-20 中文代码示例视频演示Python入门教程第四章 控制流
知乎原链 续前作: 中文代码示例视频演示Python入门教程第三章 简介Python 对应在线文档: 4. More Control Flow Tools 录制中出了不少岔子. 另外, 输入法确实是一 ...
- 2018-06-20 中文代码示例视频演示Python入门教程第三章 简介Python
知乎原链 Python 3.6.5官方入门教程中示例代码汉化后演示 对应在线文档: 3. An Informal Introduction to Python 不知如何合集, 请指教. 中文代码示例P ...
- Python入门教程 超详细1小时学会Python
Python入门教程 超详细1小时学会Python 作者: 字体:[增加 减小] 类型:转载 时间:2006-09-08我要评论 本文适合有经验的程序员尽快进入Python世界.特别地,如果你掌握Ja ...
- 极度舒适的 Python 入门教程,小猪佩奇也能学会~
编程几乎已经成为现代人的一门必修课,特别是 Python ,不仅长期霸占编程趋势榜.薪资榜第一,还屡屡进入小学教材,甚至成为浙江省信息技术高考项目-- 今天,小编带来了一门极度舒适的 Python 入 ...
随机推荐
- DevOps 在未来将如何演进?丨行业观察
自2007年 DevOps 这一概念推出以来,越来越多企业开始将开发和运维团队结合在一起,以加快部署速度,提高软件开发生命周期的效率和协作.但是,诸多因素都会对 DevOps 是否成功产生影响,例如组 ...
- sealos踩坑记录
前言 记录下我安装sealos的踩坑历程,全网基本没有什么类似的可靠资料,也许是因为太小众了吧,希望能帮助到搜索到此文的人. sealos是什么 Sealos 是以 kubernetes 为内核的云操 ...
- 关于关键字extends与implements的不同以及关于接口的详细介绍的文章
extends与implements的不同 1.在类的声明中,通过关键字extends来创建一个类的子类. 一个类通过关键字implements声明自己使用一个或者多个接口. extends 是继承某 ...
- ILLA Cloud: 调用 Hugging Face Inference Endpoints,开启大模型世界之门
一个月前,我们 宣布了与 ILLA Cloud 与达成的合作,ILLA Cloud 正式支持集成 Hugging Face Hub 上的 AI 模型库和其他相关功能. 今天,我们为大家带来 ILLA ...
- Mysql简明语法
show databases ; use mybatis; show tables ; select * from user; select * from user where id=1; updat ...
- Ununtu服务器安装Nginx与PHP
Ununtu服务器安装Nginx与PHP 1. 安装Nginx: 1.1 sudo apt update sudo apt install nginx 验证结果,使用命令: sudo systemct ...
- 【树莓派】Docker安装calibre-web搭建在线书城
一.下载docker镜像 sudo docker pull johngong/calibre-web 二.创建calibre-web镜像的映射目录,存放配置文件&书籍 mkdir /home/ ...
- nlp数据预处理:词库、词典与语料库
在nlp的数据预处理中,我们通常需要根据原始数据集做出如题目所示的三种结构.但是新手(我自己)常常会感到混乱,因此特意整理一下 1.词库 词库是最先需要处理出的数据形式,即将原数据集按空格分词或者使用 ...
- phpcm v9 任意调用分页/phpcm v9首页调用分页不起作用或者乱码
默认如下: {pc:content action="lists" catid="1" num="10" order="id DES ...
- T-SQL基础教程Day3
第三章 联接3.1交叉联接交叉联接是最简单的联接类型.交叉联接仅执行一个逻辑查询处理阶段--笛卡尔乘积将一个输入表的每一行与另一个表的所有行匹配SQL Server支持交叉联接的两种标准语法:ANSI ...