用python写了一个识别照片地理位置的程序
通过网上查询资料学习,配合高德地图的开发者模块用python写了一个识别照片地理位置的程序。
本随笔仅供学习交流,切勿拿去做违法之事!
前提:
- 是安卓手机
- 手机拍摄有开启gps定位
- 照片是原图
import exifread
import json
import requests
import os
import re
import threading
class get_photo_wz(object):
def __init__(self):
self.key = '你的key'
self.url = 'https://restapi.amap.com/v3/geocode/regeo?output=json&location={0},{1}&key={2}&radius=1000&extensions=base'
self.name=None
def find_image(self):
path=os.getcwd()+'\image'
path2=path
for name in os.listdir(path):
if re.match('.+\.jpg|.+\.png',name):
path=f'{path2}\{name}'
self.name=name
print(path)
job1=threading.Thread(target=self.run,args=(path,))
job1.start()
def get_long_and_lot(self,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
return exif_longitude, exif_latitude, exif_create_date
except:
print('Error!!图片中不包含Gps信息')
return None,None,None
def get_location(self,exif_longitude, exif_latitude, exif_date,**kw):
"""
: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(self.url.format(longitude, latitude , self.key))
# '返回的值为json,这里需要将json转换成为字典'
location_msg = json.loads(resp.text)
location = location_msg['regeocode']['formatted_address']
print('图片{}拍摄时间为:{}\n图片经度为:{}\n图片纬度为:{}\n地图拍摄的地址为:{}'.format(self.name,exif_date, longitude, latitude, location))
print('答案仅供参考,误差在1KM内')
# 图片拍摄时间为:2019:12:09 14:57:32
# 图片经度为:113.340332
# 图片纬度为:23.139105
# 地图拍摄的地址为:广东省广州市天河区xxxxxx
# 答案仅供参考,误差在1KM内
def run(self,photofile):
exif_longitude, exif_latitude, exif_create_date=self.get_long_and_lot(photofile)
if exif_longitude:
self.get_location(exif_longitude, exif_latitude, exif_create_date)
else:
pass
if __name__ == '__main__':
t=get_photo_wz()
t.find_image()