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. Moebius兼容AlwaysOn

    背景 数据库是信息化的基石,支撑着整个业务系统,发挥着非常重要的作用,被喻为"IT的心脏".因此,让数据库安全.稳定.高效地运行已经成为IT管理者必须要面对的问题.数据库在底层架构 ...

  2. 非常强大实用的键盘改键工具 - MapKeyboard

    MapKeyboard可以重新定义键盘上的键位,对于使用笔记本或非标准101键盘的用户来说,是一个很有用的键盘改键工具.当你重新定义完键位,改变将被明显的标注出来,即使重启也不会改变.它不需安装,也可 ...

  3. window的子对象

    在控制台输入 history history.length 历史记录个数history.back() 后退history.forward() 前进history.go(n) 跳到某一页,可正可负,当n ...

  4. 你需要知道的Symbols

    著名symbol 著名symbol是一个在不同领域中都相同且未注册的symbol.如果我们要列出著名symbol,它们会是: Symbol.iterator Symbol.toStringTag Sy ...

  5. 浅学git工具

    1.git工具介绍及使用 git工具直接安装: 直接运行exe文件进行安装,按默认的操作点击下一步就行了 校验: 在DOS命令行中输入:git  --version 如果能正常显示出对应的版本就是ok ...

  6. opengl helloworld vscode 通过glfw 绘制三角形

    opengl helloworld vscode 调用glfw 绘制三角形 目录 opengl helloworld vscode 调用glfw 绘制三角形 打开 glfw.org, 我下的64 目录 ...

  7. Java学习笔记09

    1. 多态 1.1 多态 ​ 多态是指同一种行为具有多种不同的表现形式. 前提 有继承或者实现关系 有方法重写(没有重写多态就没有意义) 父类引用指向子类对象 格式 父类类型 变量名 = new 子类 ...

  8. Cesium之Web Workers

    1. 引言 多线程是编程中常用的方法,例如,在桌面程序中,主线程一般是UI线程,负责UI绘制与用户交互,而运算处理往往是交给背后的工作线程,这样可以有效避免交互时的卡顿感 浏览器是多进程的,每打开一个 ...

  9. taro-ui Calendar 修改星期开始时间为星期一(中国格式)

    官网Calendar文档:http://taro-ui.jd.com/#/docs/calendar 日历虽然兼容性很高,小程序也能使用,但扩展性并不高,如果需要更强的样式/自定义,需要复制部分源码到 ...

  10. 从不均匀性角度浅析AB实验

    作者:京东零售 路卫强 本篇的目的是从三个不均匀性的角度,对AB实验进行一个认知的普及,最终着重讲述AB实验的一个普遍的问题,即实验准确度问题. 一.AB实验场景 在首页中,我们是用红色基调还是绿色基 ...