《奇巧淫技》系列-如何用python去获取照片中的Gps信息并定位!!

记录一下学习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. 后面的话

建议大家:

  1. 拍照时候关闭定位服务
  2. 发图片给非熟人不发原图
  3. 不用安卓手机、不用安卓手机、不用安卓手机。

这样就可以避免到该文章所能给你带来到的威胁。
在信息时代、任何人都是赤裸裸的。信息猛于虎,各位一定要注意保护自己的信息安全哦。
好了,本次的分享就到这里。有任何问题欢迎在下方留言哦。

发布了34 篇原创文章 · 获赞 210 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_45081575/article/details/103449832
今日推荐