记录一下学习python过程中的有趣的小程序,仅供娱乐。
1. 使用前提
本文章代码实现有以下几个前提:
- 安卓手机拍摄的照片
- 拍照时使用了Gps定位,且需要照片的原图。
- 所以这个很有局限性,仅供娱乐参考
这个没有什么好说的,实现起来特别简单。只需要调用Exifread模块获取到照片中的经纬度信息,然后再调用高德地图或是百度地图的逆地理编码API,即可得到照片中的地理位置所在。(文章以高德地图为例)
申请高德地图账号
- 登录高德地图并注册高德账号,
- 然后在 个人中心–应用管理–我的应用–创建应用。成功后即可看到下图的Key,这个Key下面调用API时候要用到。
- 看到高德地图官方给到的每日调用次数还是很香的。
2. 代码实现
模块安装
pip install -i exifread
2.1 获取照片中的经纬度信息
exifread模块返回的信息为字典
看一下附带Gps信息的图片返回的值,主要的都已经用箭头标出来了。下面用代码实现一下。
import exifread
def get_long_and_lot(photo):
"""
:param photo: 传入图片路径
:return:
"""
f = open(photo, 'rb') # 二进制打开图片
msg = exifread.process_file(f)
try:
exif_longitude = msg['GPS GPSLongitude'] # 图片经度
exif_latitude = msg['GPS GPSLatitude'] # 图片纬度
exif_create_date = msg['EXIF DateTimeOriginal'] # 创建图片日期
print(exif_longitude, exif_latitude, exif_create_date)
# 返回的值 [113, 20, 1574707/62500] [23, 8, 4155487/200000] 2019:12:09 14:57:32
except:
print('Error!!图片中不包含Gps信息')
get_long_and_lot('图片路径')
从上面获取到的图片经纬度中个可以知道,那接下来就分析一下这个经纬度。
2.2 调用逆地理编码API,进行定位
经纬度度分秒转换
一度=60分,一分=60秒
比如:29.123456 转化为度分秒就是:29°7′24.44″
整数部分是度,小数部分乘60得到的整数是分,分的小数部分乘60就是秒
这里不坐过多论述,建议自己动手尝试。
import json
import requests
key = '你的key'
url = 'https://restapi.amap.com/v3/geocode/regeo?output=json&location={经度},{纬度}&key={key}&radius=1000&extensions=base'
def get_location(exif_longitude, exif_latitude, exif_date):
"""
:param exif_longitude: 图片中的经度
:param exif_latitude: 图片中的纬度
:param exif_date: 创建图片的日期
:return:
"""
long = list(str(i) for i in exif_longitude.values)
longitude = int(long[0]) + int(long[1]) / 60 + int(long[2].split('/')[0]) / int(long[2].split('/')[1]) / 3600
longitude = round(longitude, 6) # 经度取小数点前6位
lat = list(str(i) for i in exif_latitude.values)
latitude = int(lat[0]) + int(lat[1]) / 60 + int(lat[2].split('/')[0]) / int(lat[2].split('/')[1]) / 3600
latitude = round(latitude, 6) # 纬度取小数点前6位
# 调用高德地图API
resp = requests.get(url.format(longitude, latitude, key))
# '返回的值为json,这里需要将json转换成为字典'
location_msg = json.loads(resp.text)
location = location_msg['regeocode']['formatted_address']
print('图片拍摄时间为:{}\n图片经度为:{}\n图片纬度为:{}\n地图拍摄的地址为:{}'.format(exif_date, longitude, latitude, location))
print('答案仅供参考,误差在1KM内')
# 图片拍摄时间为:2019:12:09 14:57:32
# 图片经度为:113.340332
# 图片纬度为:23.139105
# 地图拍摄的地址为:广东省广州市天河区xxxxxx
# 答案仅供参考,误差在1KM内
3. 代码用处
- 运用在查岗上,虽然有局限性,万一如果派上用场了呢!
- 用处几近于无,纯当玩耍。
4. 后面的话
建议大家:
- 拍照时候关闭定位服务
- 发图片给非熟人不发原图
- 不用安卓手机、不用安卓手机、不用安卓手机。
这样就可以避免到该文章所能给你带来到的威胁。
在信息时代、任何人都是赤裸裸的。信息猛于虎,各位一定要注意保护自己的信息安全哦。
好了,本次的分享就到这里。有任何问题欢迎在下方留言哦。