【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 入 ...
随机推荐
- Linux环境下使用jsoncpp
目录 1. 下载jsoncpp 2. 生成静态库libjsoncpp.a 3. 复制相关文件至/usr/local下(方便编程) 4. CMakeList.txt编写(需要新增的) 1. 下载json ...
- 源码解读之FutureTask如何实现最大等待时间
预备知识:Java 线程挂起的常用方式有以下几种 Thread.sleep(long millis):这个方法可以让线程挂起一段时间,并释放 CPU 时间片,等待一段时间后自动恢复执行.这种方式可以用 ...
- cookie时效无限延长方案
作者:京东科技 刘清洁 1.痛点(*) 自动化测试有2种形式,接口自动化和UI自动化.而UI自动化经常会被登录节点堵塞,例如验证码.图形.滑块等,尽管有些方式可以识别图形和定位滑块位置,但成功率都不高 ...
- Spring Boot 中的 ApplicationRunner 和 CommandLineRunner
前言 一般项目中的初始化操作,初次遇见,妙不可言.如果你还有哪些方式可用于初始化操作,欢迎在评论中分享出来~ ApplicationRunner 和 CommandLineRunner Spring ...
- Linux服务器MySQL操作总结
目录 1. Navicat连接服务器MySQL 2. 如何查看MySQL用户名和密码 3. 修改MySQL的登录密码 4. 安装MySQL开发包(Centos7版) 错误:error 1045 (28 ...
- python医学病理图片svs装换
SVS文件是什么? 最开始拿到SVS文件一脸懵逼的,这货长这样(在windows下可以用Aperio ImageScope这个开源软件打开): 我现在接触的这种图片的大小一般在60M-1.5G之间,可 ...
- pandas之sorting排序
Pands 提供了两种排序方法,分别是按标签排序和按数值排序.本节讲解 Pandas 的排序操作.下面创建一组 DataFrame 数据,如下所示: import pandas as pd impor ...
- stable diffusion打造自己专属的LORA模型
通过Lora小模型可以控制很多特定场景的内容生成. 但是那些模型是别人训练好的,你肯定很好奇,我也想训练一个自己的专属模型(也叫炼丹-_-). 甚至可以训练一个专属家庭版的模型(family mode ...
- CSS实现单行或者多行文本溢出隐藏并且显示省略号
一.单行超出显示省略号如果文字超出父元素指定宽度,文字会自动换行,而连续不间断数字和英文字母(没有其他字符)不会自动换行: 详细步骤: 第一步(不换行):white-space:nowrop;(对于连 ...
- hackathon 复盘:niche 海外软件工具正确的方法 6 个步骤
上周末,去参加了北京思否 hackathon,两天时间内从脑暴 & 挖掘软件 IDEA -> Demo 研发路演,这次经历让我难忘.这里我的看法是每个开发者圈友,都应该去参加一次 hac ...