1. 使用exifread库读取图片的经纬度信息(WGS84坐标)
  2. 使用高德开放API将经纬度转为高德底图经纬度,并输出具体位置
  3. 使用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="&copy; <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="&copy; <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入门教程】获取图片可视化精准定位(逆地理编码)的更多相关文章

  1. Linux pwn入门教程(10)——针对函数重定位流程的几种攻击

    作者:Tangerine@SAINTSEC 本系列的最后一篇 感谢各位看客的支持 感谢原作者的付出一直以来都有读者向笔者咨询教程系列问题,奈何该系列并非笔者所写[笔者仅为代发]且笔者功底薄弱,故无法解 ...

  2. 毫无基础的人入门Python,Python入门教程

    随着人工智能的发展,Python近两年也是大火,越来越多的人加入到Python学习大军,对于毫无基础的人该如何入门Python呢?这里整理了一些个人经验和Python入门教程供大家参考. 如果你是零基 ...

  3. VB6 GDI+ 入门教程[6] 图片

    http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[6] 图片 2009 年 6 月 19 日 15条评论 ...

  4. 老鸟的Python入门教程

    转自老鸟的Python入门教程 重要说明 这不是给编程新手准备的教程,如果您入行编程不久,或者还没有使用过1到2门编程语言,请移步!这是有一定编程经验的人准备的.最好是熟知Java或C,懂得命令行,S ...

  5. Python入门教程完整版(懂中文就能学会)

    前几天给大家分享<从零学会Photoshop经典教程300集>的教程受到了广泛的关注,有人不知道怎么领取,居然称小编为"骗子". 不过小编的内心是强大的,网友虐我千百遍 ...

  6. 2018-06-21 中文代码示例视频演示Python入门教程第五章 数据结构

    知乎原链 续前作: 中文代码示例视频演示Python入门教程第四章 控制流 对应在线文档: 5. Data Structures 这一章起初还是采取了尽量与原例程相近的汉化方式, 但有些语义较偏(如T ...

  7. 2018-06-20 中文代码示例视频演示Python入门教程第四章 控制流

    知乎原链 续前作: 中文代码示例视频演示Python入门教程第三章 简介Python 对应在线文档: 4. More Control Flow Tools 录制中出了不少岔子. 另外, 输入法确实是一 ...

  8. 2018-06-20 中文代码示例视频演示Python入门教程第三章 简介Python

    知乎原链 Python 3.6.5官方入门教程中示例代码汉化后演示 对应在线文档: 3. An Informal Introduction to Python 不知如何合集, 请指教. 中文代码示例P ...

  9. Python入门教程 超详细1小时学会Python

    Python入门教程 超详细1小时学会Python 作者: 字体:[增加 减小] 类型:转载 时间:2006-09-08我要评论 本文适合有经验的程序员尽快进入Python世界.特别地,如果你掌握Ja ...

  10. 极度舒适的 Python 入门教程,小猪佩奇也能学会~

    编程几乎已经成为现代人的一门必修课,特别是 Python ,不仅长期霸占编程趋势榜.薪资榜第一,还屡屡进入小学教材,甚至成为浙江省信息技术高考项目-- 今天,小编带来了一门极度舒适的 Python 入 ...

随机推荐

  1. CPU 100%问题排查总结

    更多内容,移步IT-BLOG 排查思路 [1]定位高负载进程 pid:登录进服务器使用 top 或 top -c命令[ps -ef | grep xxx 命令]查看当前 CPU消耗过高的进程,从而得到 ...

  2. Windows10 穿越火线手感和Windows7不一样

    如果是穿越火线或者其他FPS玩家,应该会感觉Win10和WIin7两者手感会有一定的区别.为什么升级了系统变菜了?心理作用?其实确实和系统有关系哦.我从Windows7升级到Windows10玩穿越火 ...

  3. 在windows系统中设置MySQL数据库

    MySQL搭建 效果图 step1:下载安装包 https://downloads.mysql.com/archives/community/ step2:解压后即完成安装 step3:创建 my.i ...

  4. 003-Cruehead-CrackMeV3

    第二个需要写注册机 首先查看文件,打开文件,什么也没有,help ->about,弹出下面的弹窗 看来是没有什么线索,直接放进OD里面 这里有一个函数CreatFileA,这个函数目的是访问一个 ...

  5. img2pdf 报 img2pdf.AlphaChannelError: Refusing to work on images with alpha channel 的解决方案

      问题描述: 在使用img2pdf转换png到pdf时候,报了如下错误 img2pdf.AlphaChannelError: Refusing to work on images with alph ...

  6. [CTF]upload-lab靶场day1

    Pass-01 前端js绕过 拿到题目看hint提示判定在前端,用burp代理,将1.php后缀名更改为.png格式即可通过前端检测,而后在burp中对修改包内容,将1.png改为1.php即可绕过前 ...

  7. 华为 A800-9000 服务器 离线安装MindX DL

    MindX DL(昇腾深度学习组件)是支持 Atlas 800 训练服务器.Atlas 800 推理服务器的深度学习组件参考设计,提供昇腾 AI 处理器资源管理和监控.昇腾 AI 处理器优化调度.分布 ...

  8. 计算机常用的快捷键以及常用的Dos命令

    计算机的常用快捷键有哪些? 今天我重温了Java基础的课程,计算机的快捷键大家肯定不陌生.   计算机的常用快捷键 ctrl+c 复制 ctrl+v 粘贴 ctrl+s 保存 ctrl+x 剪切 ct ...

  9. VUE3企业级项目基础框架搭建流程(1)

    开发环境和技术栈 操作系统 windows11 开发工具 vscode.phpstudy(小皮):nginx1.15.11, mysql5.7.26, php7.4,Navicat for MySQL ...

  10. linux syslog.d日记操作记录-小节

    以下记录在学习LDD3时调试处理打印的一些操作 syslog 不同的发行版,不同的脚本文件,如fedora18中为rsyslog的名称 1:配置文件 /etc/syslog.conf(fedora r ...