用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()
posted @ 2020-04-12 20:44  鲍鱼不是鱼  阅读(808)  评论(0编辑  收藏  举报